payload 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/dist/admin/components/elements/DocumentControls/index.d.ts.map +1 -1
  2. package/dist/admin/components/elements/DocumentControls/index.js +6 -4
  3. package/dist/admin/components/elements/Dropzone/index.d.ts.map +1 -1
  4. package/dist/admin/components/elements/Dropzone/index.js +2 -2
  5. package/dist/admin/components/elements/EditUpload/index.d.ts.map +1 -1
  6. package/dist/admin/components/elements/EditUpload/index.js +14 -6
  7. package/dist/admin/components/elements/EditUpload/index.scss +5 -0
  8. package/dist/admin/components/elements/FileDetails/index.js +2 -2
  9. package/dist/admin/components/elements/PreviewSizes/index.d.ts +1 -1
  10. package/dist/admin/components/elements/PreviewSizes/index.d.ts.map +1 -1
  11. package/dist/admin/components/elements/PreviewSizes/index.js +58 -32
  12. package/dist/admin/components/elements/PreviewSizes/index.scss +0 -1
  13. package/dist/admin/components/elements/Publish/index.d.ts +1 -0
  14. package/dist/admin/components/elements/Publish/index.d.ts.map +1 -1
  15. package/dist/admin/components/elements/Publish/index.js +56 -5
  16. package/dist/admin/components/forms/field-types/Blocks/SectionTitle/index.scss +1 -0
  17. package/dist/admin/components/forms/field-types/Checkbox/Input.d.ts +2 -2
  18. package/dist/admin/components/forms/field-types/Checkbox/Input.d.ts.map +1 -1
  19. package/dist/admin/components/forms/field-types/Checkbox/Input.js +8 -4
  20. package/dist/admin/components/forms/field-types/Checkbox/index.js +5 -5
  21. package/dist/admin/components/forms/field-types/Code/index.d.ts.map +1 -1
  22. package/dist/admin/components/forms/field-types/Code/index.js +3 -3
  23. package/dist/admin/components/forms/field-types/DateTime/Input.d.ts +2 -2
  24. package/dist/admin/components/forms/field-types/DateTime/Input.d.ts.map +1 -1
  25. package/dist/admin/components/forms/field-types/DateTime/Input.js +8 -4
  26. package/dist/admin/components/forms/field-types/Email/index.d.ts.map +1 -1
  27. package/dist/admin/components/forms/field-types/Email/index.js +9 -5
  28. package/dist/admin/components/forms/field-types/Number/index.d.ts.map +1 -1
  29. package/dist/admin/components/forms/field-types/Number/index.js +9 -5
  30. package/dist/admin/components/forms/field-types/Point/index.d.ts.map +1 -1
  31. package/dist/admin/components/forms/field-types/Point/index.js +15 -7
  32. package/dist/admin/components/forms/field-types/RichText/types.d.ts +5 -0
  33. package/dist/admin/components/forms/field-types/RichText/types.d.ts.map +1 -1
  34. package/dist/admin/components/forms/field-types/Tabs/index.d.ts.map +1 -1
  35. package/dist/admin/components/forms/field-types/Tabs/index.js +2 -2
  36. package/dist/admin/components/forms/field-types/Text/Input.d.ts +4 -4
  37. package/dist/admin/components/forms/field-types/Text/Input.d.ts.map +1 -1
  38. package/dist/admin/components/forms/field-types/Text/Input.js +8 -4
  39. package/dist/admin/components/forms/field-types/Text/index.js +7 -7
  40. package/dist/admin/components/forms/field-types/Textarea/Input.d.ts +4 -4
  41. package/dist/admin/components/forms/field-types/Textarea/Input.d.ts.map +1 -1
  42. package/dist/admin/components/forms/field-types/Textarea/Input.js +9 -5
  43. package/dist/admin/components/forms/field-types/Textarea/index.js +7 -7
  44. package/dist/admin/components/forms/useField/index.d.ts.map +1 -1
  45. package/dist/admin/components/forms/useField/index.js +31 -25
  46. package/dist/admin/components/utilities/Auth/index.d.ts.map +1 -1
  47. package/dist/admin/components/utilities/Auth/index.js +10 -3
  48. package/dist/admin/components/utilities/DocumentInfo/index.d.ts.map +1 -1
  49. package/dist/admin/components/utilities/DocumentInfo/index.js +7 -3
  50. package/dist/admin/components/views/LivePreview/Context/index.d.ts.map +1 -1
  51. package/dist/admin/components/views/LivePreview/Context/index.js +1 -1
  52. package/dist/admin/components/views/LivePreview/Toolbar/Controls/index.d.ts.map +1 -1
  53. package/dist/admin/components/views/LivePreview/Toolbar/Controls/index.js +91 -29
  54. package/dist/admin/components/views/LivePreview/Toolbar/Controls/index.scss +5 -0
  55. package/dist/admin/components/views/LivePreview/index.d.ts.map +1 -1
  56. package/dist/admin/components/views/LivePreview/index.js +1 -1
  57. package/dist/admin/components/views/collections/Edit/Upload/index.js +2 -2
  58. package/dist/admin/components/views/collections/List/Cell/index.d.ts.map +1 -1
  59. package/dist/admin/components/views/collections/List/Cell/index.js +3 -3
  60. package/dist/admin/components/views/collections/List/index.scss +9 -0
  61. package/dist/auth/graphql/resolvers/access.d.ts.map +1 -1
  62. package/dist/auth/graphql/resolvers/access.js +3 -4
  63. package/dist/auth/graphql/resolvers/forgotPassword.js +3 -4
  64. package/dist/auth/graphql/resolvers/init.d.ts.map +1 -1
  65. package/dist/auth/graphql/resolvers/init.js +3 -4
  66. package/dist/auth/graphql/resolvers/login.js +3 -4
  67. package/dist/auth/graphql/resolvers/logout.js +3 -4
  68. package/dist/auth/graphql/resolvers/me.js +3 -4
  69. package/dist/auth/graphql/resolvers/refresh.js +3 -4
  70. package/dist/auth/graphql/resolvers/resetPassword.js +3 -4
  71. package/dist/auth/graphql/resolvers/unlock.js +3 -4
  72. package/dist/auth/graphql/resolvers/verifyEmail.js +3 -4
  73. package/dist/auth/operations/access.d.ts.map +1 -1
  74. package/dist/auth/operations/access.js +52 -42
  75. package/dist/collections/buildEndpoints.d.ts.map +1 -1
  76. package/dist/collections/buildEndpoints.js +9 -1
  77. package/dist/collections/graphql/resolvers/create.d.ts.map +1 -1
  78. package/dist/collections/graphql/resolvers/create.js +3 -4
  79. package/dist/collections/graphql/resolvers/delete.d.ts.map +1 -1
  80. package/dist/collections/graphql/resolvers/delete.js +3 -4
  81. package/dist/collections/graphql/resolvers/docAccess.d.ts.map +1 -1
  82. package/dist/collections/graphql/resolvers/docAccess.js +8 -4
  83. package/dist/collections/graphql/resolvers/find.d.ts.map +1 -1
  84. package/dist/collections/graphql/resolvers/find.js +3 -4
  85. package/dist/collections/graphql/resolvers/findByID.d.ts.map +1 -1
  86. package/dist/collections/graphql/resolvers/findByID.js +3 -2
  87. package/dist/collections/graphql/resolvers/findVersionByID.d.ts.map +1 -1
  88. package/dist/collections/graphql/resolvers/findVersionByID.js +3 -4
  89. package/dist/collections/graphql/resolvers/findVersions.d.ts.map +1 -1
  90. package/dist/collections/graphql/resolvers/findVersions.js +3 -4
  91. package/dist/collections/graphql/resolvers/restoreVersion.d.ts.map +1 -1
  92. package/dist/collections/graphql/resolvers/restoreVersion.js +3 -4
  93. package/dist/collections/graphql/resolvers/update.d.ts.map +1 -1
  94. package/dist/collections/graphql/resolvers/update.js +3 -4
  95. package/dist/collections/operations/docAccess.d.ts.map +1 -1
  96. package/dist/collections/operations/docAccess.js +19 -8
  97. package/dist/config/schema.d.ts.map +1 -1
  98. package/dist/config/schema.js +2 -1
  99. package/dist/config/types.d.ts +2 -2
  100. package/dist/config/types.d.ts.map +1 -1
  101. package/dist/config/types.js +1 -1
  102. package/dist/exports/utilities.d.ts +1 -1
  103. package/dist/exports/utilities.d.ts.map +1 -1
  104. package/dist/exports/utilities.js +4 -1
  105. package/dist/express/types.d.ts +4 -0
  106. package/dist/express/types.d.ts.map +1 -1
  107. package/dist/fields/config/schema.d.ts.map +1 -1
  108. package/dist/fields/config/schema.js +63 -61
  109. package/dist/fields/config/types.d.ts +53 -34
  110. package/dist/fields/config/types.d.ts.map +1 -1
  111. package/dist/fields/config/types.js +1 -1
  112. package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
  113. package/dist/fields/hooks/beforeChange/promise.js +2 -1
  114. package/dist/fields/validations.d.ts +4 -4
  115. package/dist/fields/validations.d.ts.map +1 -1
  116. package/dist/fields/validations.js +90 -106
  117. package/dist/fields/validations.spec.js +4 -4
  118. package/dist/globals/buildEndpoints.d.ts.map +1 -1
  119. package/dist/globals/buildEndpoints.js +5 -1
  120. package/dist/globals/graphql/resolvers/docAccess.d.ts.map +1 -1
  121. package/dist/globals/graphql/resolvers/docAccess.js +8 -4
  122. package/dist/globals/graphql/resolvers/findOne.d.ts.map +1 -1
  123. package/dist/globals/graphql/resolvers/findOne.js +3 -4
  124. package/dist/globals/graphql/resolvers/findVersionByID.d.ts.map +1 -1
  125. package/dist/globals/graphql/resolvers/findVersionByID.js +3 -4
  126. package/dist/globals/graphql/resolvers/findVersions.d.ts.map +1 -1
  127. package/dist/globals/graphql/resolvers/findVersions.js +3 -4
  128. package/dist/globals/graphql/resolvers/restoreVersion.d.ts.map +1 -1
  129. package/dist/globals/graphql/resolvers/restoreVersion.js +3 -4
  130. package/dist/globals/graphql/resolvers/update.d.ts.map +1 -1
  131. package/dist/globals/graphql/resolvers/update.js +3 -4
  132. package/dist/globals/operations/docAccess.d.ts.map +1 -1
  133. package/dist/globals/operations/docAccess.js +18 -7
  134. package/dist/graphql/registerSchema.d.ts.map +1 -1
  135. package/dist/graphql/registerSchema.js +4 -3
  136. package/dist/graphql/utilities/wrapCustomResolver.d.ts +9 -0
  137. package/dist/graphql/utilities/wrapCustomResolver.d.ts.map +1 -0
  138. package/dist/graphql/utilities/wrapCustomResolver.js +34 -0
  139. package/dist/translations/pl.json +24 -24
  140. package/dist/uploads/getFileByPath.d.ts.map +1 -1
  141. package/dist/uploads/getFileByPath.js +7 -2
  142. package/dist/uploads/imageResizer.d.ts.map +1 -1
  143. package/dist/uploads/imageResizer.js +4 -3
  144. package/dist/uploads/types.d.ts +11 -1
  145. package/dist/uploads/types.d.ts.map +1 -1
  146. package/dist/uploads/types.js +1 -1
  147. package/dist/utilities/configToJSONSchema.d.ts +8 -1
  148. package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
  149. package/dist/utilities/configToJSONSchema.js +24 -25
  150. package/dist/utilities/flattenTopLevelFields.d.ts +7 -0
  151. package/dist/utilities/flattenTopLevelFields.d.ts.map +1 -1
  152. package/dist/utilities/flattenTopLevelFields.js +8 -2
  153. package/dist/utilities/getEntityPolicies.d.ts.map +1 -1
  154. package/dist/utilities/getEntityPolicies.js +6 -2
  155. package/dist/utilities/initTransaction.d.ts.map +1 -1
  156. package/dist/utilities/initTransaction.js +19 -7
  157. package/dist/utilities/isolateTransactionID.d.ts +6 -0
  158. package/dist/utilities/isolateTransactionID.d.ts.map +1 -0
  159. package/dist/utilities/isolateTransactionID.js +38 -0
  160. package/package.json +1 -1
  161. package/utilities.d.ts +1 -1
  162. package/utilities.js +4 -1
@@ -1,6 +1,5 @@
1
1
  /// <reference types="react" />
2
2
  import type { ArrayField, BlockField, CheckboxField, CodeField, DateField, EmailField, JSONField, NumberField, PointField, RadioField, RelationshipField, RichTextField, SelectField, TextField, TextareaField, UploadField, Validate } from './config/types';
3
- export declare const number: Validate<unknown, unknown, NumberField>;
4
3
  export declare const text: Validate<unknown, unknown, TextField>;
5
4
  export declare const password: Validate<unknown, unknown, TextField>;
6
5
  export declare const email: Validate<unknown, unknown, EmailField>;
@@ -12,12 +11,13 @@ export declare const json: Validate<unknown, unknown, JSONField & {
12
11
  export declare const checkbox: Validate<unknown, unknown, CheckboxField>;
13
12
  export declare const date: Validate<unknown, unknown, DateField>;
14
13
  export declare const richText: Validate<object, unknown, RichTextField, RichTextField>;
14
+ export declare const number: Validate<unknown, unknown, NumberField>;
15
+ export declare const array: Validate<unknown, unknown, ArrayField>;
16
+ export declare const blocks: Validate<unknown, unknown, BlockField>;
15
17
  export declare const upload: Validate<unknown, unknown, UploadField>;
16
18
  export declare const relationship: Validate<unknown, unknown, RelationshipField>;
17
- export declare const array: Validate<unknown, unknown, ArrayField>;
18
19
  export declare const select: Validate<unknown, unknown, SelectField>;
19
20
  export declare const radio: Validate<unknown, unknown, RadioField>;
20
- export declare const blocks: Validate<unknown, unknown, BlockField>;
21
21
  export declare const point: Validate<unknown, unknown, PointField>;
22
22
  declare const _default: {
23
23
  array: Validate<unknown, unknown, ArrayField>;
@@ -44,11 +44,11 @@ declare const _default: {
44
44
  style?: import("react").CSSProperties;
45
45
  width?: string;
46
46
  } & {
47
- editorOptions?: import("monaco-editor").editor.IStandaloneEditorConstructionOptions;
48
47
  components?: {
49
48
  Error?: import("react").ComponentType<import("../admin/components/forms/Error/types").Props>;
50
49
  Label?: import("react").ComponentType<import("../admin/components/forms/Label/types").Props>;
51
50
  };
51
+ editorOptions?: import("monaco-editor").editor.IStandaloneEditorConstructionOptions;
52
52
  };
53
53
  type: "json";
54
54
  } & {
@@ -1 +1 @@
1
- {"version":3,"file":"validations.d.ts","sourceRoot":"","sources":["../../src/fields/validations.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,aAAa,EACb,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,UAAU,EACV,iBAAiB,EAEjB,aAAa,EACb,WAAW,EACX,SAAS,EACT,aAAa,EACb,WAAW,EACX,QAAQ,EACT,MAAM,gBAAgB,CAAA;AAOvB,eAAO,MAAM,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAqD1D,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAuBtD,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAsB1D,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAMxD,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAqB9D,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAMtD,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAa/E,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAS9D,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAetD,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,CAO5E,CAAA;AA+FD,eAAO,MAAM,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAkB1D,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,iBAAiB,CA8DtE,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAmBxD,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAmC1D,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CASxD,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAmBzD,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAqBxD,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAED,wBAkBC"}
1
+ {"version":3,"file":"validations.d.ts","sourceRoot":"","sources":["../../src/fields/validations.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,aAAa,EACb,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,UAAU,EACV,iBAAiB,EAEjB,aAAa,EACb,WAAW,EACX,SAAS,EACT,aAAa,EACb,WAAW,EACX,QAAQ,EACT,MAAM,gBAAgB,CAAA;AAQvB,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAuBtD,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAsB1D,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAMxD,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAqB9D,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAMtD,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAa/E,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAS9D,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAetD,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,CAO5E,CAAA;AAgCD,eAAO,MAAM,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CA6B1D,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAKxD,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAKzD,CAAA;AAgGD,eAAO,MAAM,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAkB1D,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,iBAAiB,CA8DtE,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAmC1D,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CASxD,CAAA;AAED,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAqBxD,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAED,wBAkBC"}
@@ -9,9 +9,6 @@ function _export(target, all) {
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- number: function() {
13
- return number;
14
- },
15
12
  text: function() {
16
13
  return text;
17
14
  },
@@ -39,24 +36,27 @@ _export(exports, {
39
36
  richText: function() {
40
37
  return richText;
41
38
  },
39
+ number: function() {
40
+ return number;
41
+ },
42
+ array: function() {
43
+ return array;
44
+ },
45
+ blocks: function() {
46
+ return blocks;
47
+ },
42
48
  upload: function() {
43
49
  return upload;
44
50
  },
45
51
  relationship: function() {
46
52
  return relationship;
47
53
  },
48
- array: function() {
49
- return array;
50
- },
51
54
  select: function() {
52
55
  return select;
53
56
  },
54
57
  radio: function() {
55
58
  return radio;
56
59
  },
57
- blocks: function() {
58
- return blocks;
59
- },
60
60
  point: function() {
61
61
  return point;
62
62
  },
@@ -66,6 +66,7 @@ _export(exports, {
66
66
  });
67
67
  const _canUseDOM = /*#__PURE__*/ _interop_require_default(require("../utilities/canUseDOM"));
68
68
  const _getIDType = require("../utilities/getIDType");
69
+ const _isNumber = require("../utilities/isNumber");
69
70
  const _isValidID = require("../utilities/isValidID");
70
71
  const _types = require("./config/types");
71
72
  function _interop_require_default(obj) {
@@ -73,56 +74,7 @@ function _interop_require_default(obj) {
73
74
  default: obj
74
75
  };
75
76
  }
76
- const number = (value, { hasMany, max, maxRows, min, minRows, required, t })=>{
77
- const toValidate = Array.isArray(value) ? value : [
78
- value
79
- ];
80
- // eslint-disable-next-line no-restricted-syntax
81
- for (const valueToValidate of toValidate){
82
- const floatValue = parseFloat(valueToValidate);
83
- if (value && typeof floatValue !== 'number' || required && Number.isNaN(floatValue) || value && Number.isNaN(floatValue)) {
84
- return t('validation:enterNumber');
85
- }
86
- if (typeof max === 'number' && floatValue > max) {
87
- return t('validation:greaterThanMax', {
88
- label: t('value'),
89
- max,
90
- value
91
- });
92
- }
93
- if (typeof min === 'number' && floatValue < min) {
94
- return t('validation:lessThanMin', {
95
- label: t('value'),
96
- min,
97
- value
98
- });
99
- }
100
- if (required && typeof floatValue !== 'number') {
101
- return t('validation:required');
102
- }
103
- }
104
- if (required && toValidate.length === 0) {
105
- return t('validation:required');
106
- }
107
- if (hasMany === true) {
108
- if (minRows && toValidate.length < minRows) {
109
- return t('validation:lessThanMin', {
110
- label: t('rows'),
111
- min: minRows,
112
- value: toValidate.length
113
- });
114
- }
115
- if (maxRows && toValidate.length > maxRows) {
116
- return t('validation:greaterThanMax', {
117
- label: t('rows'),
118
- max: maxRows,
119
- value: toValidate.length
120
- });
121
- }
122
- }
123
- return true;
124
- };
125
- const text = (value, { config, maxLength: fieldMaxLength, minLength, payload, required, t })=>{
77
+ const text = (value, { config, maxLength: fieldMaxLength, minLength, required, t })=>{
126
78
  let maxLength;
127
79
  if (typeof config?.defaultMaxTextLength === 'number') maxLength = config.defaultMaxTextLength;
128
80
  if (typeof fieldMaxLength === 'number') maxLength = fieldMaxLength;
@@ -226,7 +178,82 @@ const richText = async (value, options)=>{
226
178
  const editor = options?.editor;
227
179
  return await editor.validate(value, options);
228
180
  };
229
- const validateFilterOptions = async (value, { id, data, filterOptions, payload, relationTo, siblingData, t, user })=>{
181
+ const validateArrayLength = (value, options)=>{
182
+ const { maxRows, minRows, required, t } = options;
183
+ const arrayLength = Array.isArray(value) ? value.length : 0;
184
+ if (!required && arrayLength === 0) return true;
185
+ if (minRows && arrayLength < minRows) {
186
+ return t('validation:requiresAtLeast', {
187
+ count: minRows,
188
+ label: t('rows')
189
+ });
190
+ }
191
+ if (maxRows && arrayLength > maxRows) {
192
+ return t('validation:requiresNoMoreThan', {
193
+ count: maxRows,
194
+ label: t('rows')
195
+ });
196
+ }
197
+ if (required && !arrayLength) {
198
+ return t('validation:requiresAtLeast', {
199
+ count: 1,
200
+ label: t('row')
201
+ });
202
+ }
203
+ return true;
204
+ };
205
+ const number = (value, { hasMany, max, maxRows, min, minRows, required, t })=>{
206
+ if (hasMany === true) {
207
+ const lengthValidationResult = validateArrayLength(value, {
208
+ maxRows,
209
+ minRows,
210
+ required,
211
+ t
212
+ });
213
+ if (typeof lengthValidationResult === 'string') return lengthValidationResult;
214
+ }
215
+ if (!value && required) return t('validation:required');
216
+ if (!value && !required) return true;
217
+ const numbersToValidate = Array.isArray(value) ? value : [
218
+ value
219
+ ];
220
+ for (const number of numbersToValidate){
221
+ if (!(0, _isNumber.isNumber)(number)) return t('validation:enterNumber');
222
+ const numberValue = parseFloat(number);
223
+ if (typeof max === 'number' && numberValue > max) {
224
+ return t('validation:greaterThanMax', {
225
+ label: t('value'),
226
+ max,
227
+ value
228
+ });
229
+ }
230
+ if (typeof min === 'number' && numberValue < min) {
231
+ return t('validation:lessThanMin', {
232
+ label: t('value'),
233
+ min,
234
+ value
235
+ });
236
+ }
237
+ }
238
+ return true;
239
+ };
240
+ const array = (value, { maxRows, minRows, required, t })=>{
241
+ return validateArrayLength(value, {
242
+ maxRows,
243
+ minRows,
244
+ required,
245
+ t
246
+ });
247
+ };
248
+ const blocks = (value, { maxRows, minRows, required, t })=>{
249
+ return validateArrayLength(value, {
250
+ maxRows,
251
+ minRows,
252
+ required,
253
+ t
254
+ });
255
+ };
256
+ const validateFilterOptions = async (value, { id, data, filterOptions, payload, relationTo, req, siblingData, t, user })=>{
230
257
  if (!_canUseDOM.default && typeof filterOptions !== 'undefined' && value) {
231
258
  const options = {};
232
259
  const collections = typeof relationTo === 'string' ? [
@@ -268,6 +295,7 @@ const validateFilterOptions = async (value, { id, data, filterOptions, payload,
268
295
  depth: 0,
269
296
  limit: 0,
270
297
  pagination: false,
298
+ req,
271
299
  where: findWhere
272
300
  });
273
301
  options[collection] = result.docs.map((doc)=>doc.id);
@@ -317,7 +345,7 @@ const relationship = async (value, options)=>{
317
345
  if ((!value || Array.isArray(value) && value.length === 0) && required) {
318
346
  return t('validation:required');
319
347
  }
320
- if (Array.isArray(value)) {
348
+ if (Array.isArray(value) && value.length > 0) {
321
349
  if (minRows && value.length < minRows) {
322
350
  return t('validation:lessThanMin', {
323
351
  label: t('rows'),
@@ -364,28 +392,6 @@ const relationship = async (value, options)=>{
364
392
  }
365
393
  return validateFilterOptions(value, options);
366
394
  };
367
- const array = (value, { maxRows, minRows, required, t })=>{
368
- const arrayLength = Array.isArray(value) ? value.length : 0;
369
- if (minRows && arrayLength < minRows) {
370
- return t('validation:requiresAtLeast', {
371
- count: minRows,
372
- label: t('rows')
373
- });
374
- }
375
- if (maxRows && arrayLength > maxRows) {
376
- return t('validation:requiresNoMoreThan', {
377
- count: maxRows,
378
- label: t('rows')
379
- });
380
- }
381
- if (!arrayLength && required) {
382
- return t('validation:requiresAtLeast', {
383
- count: 1,
384
- label: t('row')
385
- });
386
- }
387
- return true;
388
- };
389
395
  const select = (value, { hasMany, options, required, t })=>{
390
396
  if (Array.isArray(value) && value.some((input)=>!options.some((option)=>option === input || typeof option !== 'string' && option?.value === input))) {
391
397
  return t('validation:invalidSelection');
@@ -405,28 +411,6 @@ const radio = (value, { options, required, t })=>{
405
411
  }
406
412
  return required ? t('validation:required') : true;
407
413
  };
408
- const blocks = (value, { maxRows, minRows, required, t })=>{
409
- const arrayLength = Array.isArray(value) ? value.length : 0;
410
- if (minRows && arrayLength < minRows) {
411
- return t('validation:requiresAtLeast', {
412
- count: minRows,
413
- label: t('rows')
414
- });
415
- }
416
- if (maxRows && arrayLength > maxRows) {
417
- return t('validation:requiresNoMoreThan', {
418
- count: maxRows,
419
- label: t('rows')
420
- });
421
- }
422
- if (!arrayLength && required) {
423
- return t('validation:requiresAtLeast', {
424
- count: 1,
425
- label: t('row')
426
- });
427
- }
428
- return true;
429
- };
430
414
  const point = (value = [
431
415
  '',
432
416
  ''
@@ -461,4 +445,4 @@ const _default = {
461
445
  upload
462
446
  };
463
447
 
464
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9maWVsZHMvdmFsaWRhdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSaWNoVGV4dEFkYXB0ZXIgfSBmcm9tICcuLi9leHBvcnRzL3R5cGVzJ1xuaW1wb3J0IHR5cGUge1xuICBBcnJheUZpZWxkLFxuICBCbG9ja0ZpZWxkLFxuICBDaGVja2JveEZpZWxkLFxuICBDb2RlRmllbGQsXG4gIERhdGVGaWVsZCxcbiAgRW1haWxGaWVsZCxcbiAgSlNPTkZpZWxkLFxuICBOdW1iZXJGaWVsZCxcbiAgUG9pbnRGaWVsZCxcbiAgUmFkaW9GaWVsZCxcbiAgUmVsYXRpb25zaGlwRmllbGQsXG4gIFJlbGF0aW9uc2hpcFZhbHVlLFxuICBSaWNoVGV4dEZpZWxkLFxuICBTZWxlY3RGaWVsZCxcbiAgVGV4dEZpZWxkLFxuICBUZXh0YXJlYUZpZWxkLFxuICBVcGxvYWRGaWVsZCxcbiAgVmFsaWRhdGUsXG59IGZyb20gJy4vY29uZmlnL3R5cGVzJ1xuXG5pbXBvcnQgY2FuVXNlRE9NIGZyb20gJy4uL3V0aWxpdGllcy9jYW5Vc2VET00nXG5pbXBvcnQgeyBnZXRJRFR5cGUgfSBmcm9tICcuLi91dGlsaXRpZXMvZ2V0SURUeXBlJ1xuaW1wb3J0IHsgaXNWYWxpZElEIH0gZnJvbSAnLi4vdXRpbGl0aWVzL2lzVmFsaWRJRCdcbmltcG9ydCB7IGZpZWxkQWZmZWN0c0RhdGEgfSBmcm9tICcuL2NvbmZpZy90eXBlcydcblxuZXhwb3J0IGNvbnN0IG51bWJlcjogVmFsaWRhdGU8dW5rbm93biwgdW5rbm93biwgTnVtYmVyRmllbGQ+ID0gKFxuICB2YWx1ZTogbnVtYmVyIHwgbnVtYmVyW10sXG4gIHsgaGFzTWFueSwgbWF4LCBtYXhSb3dzLCBtaW4sIG1pblJvd3MsIHJlcXVpcmVkLCB0IH0sXG4pID0+IHtcbiAgY29uc3QgdG9WYWxpZGF0ZTogbnVtYmVyW10gPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICBmb3IgKGNvbnN0IHZhbHVlVG9WYWxpZGF0ZSBvZiB0b1ZhbGlkYXRlKSB7XG4gICAgY29uc3QgZmxvYXRWYWx1ZSA9IHBhcnNlRmxvYXQodmFsdWVUb1ZhbGlkYXRlIGFzIHVua25vd24gYXMgc3RyaW5nKVxuICAgIGlmIChcbiAgICAgICh2YWx1ZSAmJiB0eXBlb2YgZmxvYXRWYWx1ZSAhPT0gJ251bWJlcicpIHx8XG4gICAgICAocmVxdWlyZWQgJiYgTnVtYmVyLmlzTmFOKGZsb2F0VmFsdWUpKSB8fFxuICAgICAgKHZhbHVlICYmIE51bWJlci5pc05hTihmbG9hdFZhbHVlKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOmVudGVyTnVtYmVyJylcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG1heCA9PT0gJ251bWJlcicgJiYgZmxvYXRWYWx1ZSA+IG1heCkge1xuICAgICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246Z3JlYXRlclRoYW5NYXgnLCB7IGxhYmVsOiB0KCd2YWx1ZScpLCBtYXgsIHZhbHVlIH0pXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBtaW4gPT09ICdudW1iZXInICYmIGZsb2F0VmFsdWUgPCBtaW4pIHtcbiAgICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOmxlc3NUaGFuTWluJywgeyBsYWJlbDogdCgndmFsdWUnKSwgbWluLCB2YWx1ZSB9KVxuICAgIH1cblxuICAgIGlmIChyZXF1aXJlZCAmJiB0eXBlb2YgZmxvYXRWYWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOnJlcXVpcmVkJylcbiAgICB9XG4gIH1cblxuICBpZiAocmVxdWlyZWQgJiYgdG9WYWxpZGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpyZXF1aXJlZCcpXG4gIH1cblxuICBpZiAoaGFzTWFueSA9PT0gdHJ1ZSkge1xuICAgIGlmIChtaW5Sb3dzICYmIHRvVmFsaWRhdGUubGVuZ3RoIDwgbWluUm93cykge1xuICAgICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246bGVzc1RoYW5NaW4nLCB7XG4gICAgICAgIGxhYmVsOiB0KCdyb3dzJyksXG4gICAgICAgIG1pbjogbWluUm93cyxcbiAgICAgICAgdmFsdWU6IHRvVmFsaWRhdGUubGVuZ3RoLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAobWF4Um93cyAmJiB0b1ZhbGlkYXRlLmxlbmd0aCA+IG1heFJvd3MpIHtcbiAgICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOmdyZWF0ZXJUaGFuTWF4Jywge1xuICAgICAgICBsYWJlbDogdCgncm93cycpLFxuICAgICAgICBtYXg6IG1heFJvd3MsXG4gICAgICAgIHZhbHVlOiB0b1ZhbGlkYXRlLmxlbmd0aCxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IHRleHQ6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIFRleHRGaWVsZD4gPSAoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIHsgY29uZmlnLCBtYXhMZW5ndGg6IGZpZWxkTWF4TGVuZ3RoLCBtaW5MZW5ndGgsIHBheWxvYWQsIHJlcXVpcmVkLCB0IH0sXG4pID0+IHtcbiAgbGV0IG1heExlbmd0aDogbnVtYmVyXG5cbiAgaWYgKHR5cGVvZiBjb25maWc/LmRlZmF1bHRNYXhUZXh0TGVuZ3RoID09PSAnbnVtYmVyJykgbWF4TGVuZ3RoID0gY29uZmlnLmRlZmF1bHRNYXhUZXh0TGVuZ3RoXG4gIGlmICh0eXBlb2YgZmllbGRNYXhMZW5ndGggPT09ICdudW1iZXInKSBtYXhMZW5ndGggPSBmaWVsZE1heExlbmd0aFxuICBpZiAodmFsdWUgJiYgbWF4TGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOnNob3J0ZXJUaGFuTWF4JywgeyBtYXhMZW5ndGggfSlcbiAgfVxuXG4gIGlmICh2YWx1ZSAmJiBtaW5MZW5ndGggJiYgdmFsdWU/Lmxlbmd0aCA8IG1pbkxlbmd0aCkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOmxvbmdlclRoYW5NaW4nLCB7IG1pbkxlbmd0aCB9KVxuICB9XG5cbiAgaWYgKHJlcXVpcmVkKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdmFsdWU/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246cmVxdWlyZWQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCBwYXNzd29yZDogVmFsaWRhdGU8dW5rbm93biwgdW5rbm93biwgVGV4dEZpZWxkPiA9IChcbiAgdmFsdWU6IHN0cmluZyxcbiAgeyBjb25maWcsIG1heExlbmd0aDogZmllbGRNYXhMZW5ndGgsIG1pbkxlbmd0aCwgcGF5bG9hZCwgcmVxdWlyZWQsIHQgfSxcbikgPT4ge1xuICBsZXQgbWF4TGVuZ3RoOiBudW1iZXJcblxuICBpZiAodHlwZW9mIGNvbmZpZz8uZGVmYXVsdE1heFRleHRMZW5ndGggPT09ICdudW1iZXInKSBtYXhMZW5ndGggPSBjb25maWcuZGVmYXVsdE1heFRleHRMZW5ndGhcbiAgaWYgKHR5cGVvZiBmaWVsZE1heExlbmd0aCA9PT0gJ251bWJlcicpIG1heExlbmd0aCA9IGZpZWxkTWF4TGVuZ3RoXG5cbiAgaWYgKHZhbHVlICYmIG1heExlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpzaG9ydGVyVGhhbk1heCcsIHsgbWF4TGVuZ3RoIH0pXG4gIH1cblxuICBpZiAodmFsdWUgJiYgbWluTGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA8IG1pbkxlbmd0aCkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOmxvbmdlclRoYW5NaW4nLCB7IG1pbkxlbmd0aCB9KVxuICB9XG5cbiAgaWYgKHJlcXVpcmVkICYmICF2YWx1ZSkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOnJlcXVpcmVkJylcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCBlbWFpbDogVmFsaWRhdGU8dW5rbm93biwgdW5rbm93biwgRW1haWxGaWVsZD4gPSAodmFsdWU6IHN0cmluZywgeyByZXF1aXJlZCwgdCB9KSA9PiB7XG4gIGlmICgodmFsdWUgJiYgIS9cXFNbXlxcc0BdKkBcXFMrXFwuXFxTKy8udGVzdCh2YWx1ZSkpIHx8ICghdmFsdWUgJiYgcmVxdWlyZWQpKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246ZW1haWxBZGRyZXNzJylcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCB0ZXh0YXJlYTogVmFsaWRhdGU8dW5rbm93biwgdW5rbm93biwgVGV4dGFyZWFGaWVsZD4gPSAoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIHsgY29uZmlnLCBtYXhMZW5ndGg6IGZpZWxkTWF4TGVuZ3RoLCBtaW5MZW5ndGgsIHBheWxvYWQsIHJlcXVpcmVkLCB0IH0sXG4pID0+IHtcbiAgbGV0IG1heExlbmd0aDogbnVtYmVyXG5cbiAgaWYgKHR5cGVvZiBjb25maWc/LmRlZmF1bHRNYXhUZXh0TGVuZ3RoID09PSAnbnVtYmVyJykgbWF4TGVuZ3RoID0gY29uZmlnLmRlZmF1bHRNYXhUZXh0TGVuZ3RoXG4gIGlmICh0eXBlb2YgZmllbGRNYXhMZW5ndGggPT09ICdudW1iZXInKSBtYXhMZW5ndGggPSBmaWVsZE1heExlbmd0aFxuICBpZiAodmFsdWUgJiYgbWF4TGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOnNob3J0ZXJUaGFuTWF4JywgeyBtYXhMZW5ndGggfSlcbiAgfVxuXG4gIGlmICh2YWx1ZSAmJiBtaW5MZW5ndGggJiYgdmFsdWUubGVuZ3RoIDwgbWluTGVuZ3RoKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246bG9uZ2VyVGhhbk1pbicsIHsgbWluTGVuZ3RoIH0pXG4gIH1cblxuICBpZiAocmVxdWlyZWQgJiYgIXZhbHVlKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246cmVxdWlyZWQnKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IGNvZGU6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIENvZGVGaWVsZD4gPSAodmFsdWU6IHN0cmluZywgeyByZXF1aXJlZCwgdCB9KSA9PiB7XG4gIGlmIChyZXF1aXJlZCAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246cmVxdWlyZWQnKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IGpzb246IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIEpTT05GaWVsZCAmIHsganNvbkVycm9yPzogc3RyaW5nIH0+ID0gKFxuICB2YWx1ZTogc3RyaW5nLFxuICB7IGpzb25FcnJvciwgcmVxdWlyZWQsIHQgfSxcbikgPT4ge1xuICBpZiAocmVxdWlyZWQgJiYgIXZhbHVlKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246cmVxdWlyZWQnKVxuICB9XG5cbiAgaWYgKGpzb25FcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246aW52YWxpZElucHV0JylcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCBjaGVja2JveDogVmFsaWRhdGU8dW5rbm93biwgdW5rbm93biwgQ2hlY2tib3hGaWVsZD4gPSAoXG4gIHZhbHVlOiBib29sZWFuLFxuICB7IHJlcXVpcmVkLCB0IH0sXG4pID0+IHtcbiAgaWYgKCh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJykgfHwgKHJlcXVpcmVkICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOnRydWVPckZhbHNlJylcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCBkYXRlOiBWYWxpZGF0ZTx1bmtub3duLCB1bmtub3duLCBEYXRlRmllbGQ+ID0gKHZhbHVlLCB7IHJlcXVpcmVkLCB0IH0pID0+IHtcbiAgaWYgKHZhbHVlICYmICFpc05hTihEYXRlLnBhcnNlKHZhbHVlLnRvU3RyaW5nKCkpKSkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlLWxpbmUgKi9cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHZhbHVlKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246bm90VmFsaWREYXRlJywgeyB2YWx1ZSB9KVxuICB9XG5cbiAgaWYgKHJlcXVpcmVkKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246cmVxdWlyZWQnKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IHJpY2hUZXh0OiBWYWxpZGF0ZTxvYmplY3QsIHVua25vd24sIFJpY2hUZXh0RmllbGQsIFJpY2hUZXh0RmllbGQ+ID0gYXN5bmMgKFxuICB2YWx1ZSxcbiAgb3B0aW9ucyxcbikgPT4ge1xuICBjb25zdCBlZGl0b3I6IFJpY2hUZXh0QWRhcHRlciA9IG9wdGlvbnM/LmVkaXRvclxuXG4gIHJldHVybiBhd2FpdCBlZGl0b3IudmFsaWRhdGUodmFsdWUsIG9wdGlvbnMpXG59XG5cbmNvbnN0IHZhbGlkYXRlRmlsdGVyT3B0aW9uczogVmFsaWRhdGUgPSBhc3luYyAoXG4gIHZhbHVlLFxuICB7IGlkLCBkYXRhLCBmaWx0ZXJPcHRpb25zLCBwYXlsb2FkLCByZWxhdGlvblRvLCBzaWJsaW5nRGF0YSwgdCwgdXNlciB9LFxuKSA9PiB7XG4gIGlmICghY2FuVXNlRE9NICYmIHR5cGVvZiBmaWx0ZXJPcHRpb25zICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSkge1xuICAgIGNvbnN0IG9wdGlvbnM6IHtcbiAgICAgIFtjb2xsZWN0aW9uOiBzdHJpbmddOiAobnVtYmVyIHwgc3RyaW5nKVtdXG4gICAgfSA9IHt9XG5cbiAgICBjb25zdCBjb2xsZWN0aW9ucyA9IHR5cGVvZiByZWxhdGlvblRvID09PSAnc3RyaW5nJyA/IFtyZWxhdGlvblRvXSA6IHJlbGF0aW9uVG9cbiAgICBjb25zdCB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBjb2xsZWN0aW9ucy5tYXAoYXN5bmMgKGNvbGxlY3Rpb24pID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9uRmlsdGVyID1cbiAgICAgICAgICB0eXBlb2YgZmlsdGVyT3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBhd2FpdCBmaWx0ZXJPcHRpb25zKHtcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgIHJlbGF0aW9uVG86IGNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgc2libGluZ0RhdGEsXG4gICAgICAgICAgICAgICAgdXNlcixcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogZmlsdGVyT3B0aW9uc1xuXG4gICAgICAgIGNvbnN0IHZhbHVlSURzOiAobnVtYmVyIHwgc3RyaW5nKVtdID0gW11cblxuICAgICAgICB2YWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbD8udmFsdWUpIHtcbiAgICAgICAgICAgIHZhbHVlSURzLnB1c2godmFsLnZhbHVlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdmFsdWVJRHMucHVzaCh2YWwpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh2YWx1ZUlEcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgZmluZFdoZXJlID0ge1xuICAgICAgICAgICAgYW5kOiBbeyBpZDogeyBpbjogdmFsdWVJRHMgfSB9XSxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAob3B0aW9uRmlsdGVyKSBmaW5kV2hlcmUuYW5kLnB1c2gob3B0aW9uRmlsdGVyKVxuXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGF5bG9hZC5maW5kKHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb24sXG4gICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgIGxpbWl0OiAwLFxuICAgICAgICAgICAgcGFnaW5hdGlvbjogZmFsc2UsXG4gICAgICAgICAgICB3aGVyZTogZmluZFdoZXJlLFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBvcHRpb25zW2NvbGxlY3Rpb25dID0gcmVzdWx0LmRvY3MubWFwKChkb2MpID0+IGRvYy5pZClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHRpb25zW2NvbGxlY3Rpb25dID0gW11cbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKVxuXG4gICAgY29uc3QgaW52YWxpZFJlbGF0aW9uc2hpcHMgPSB2YWx1ZXMuZmlsdGVyKCh2YWwpID0+IHtcbiAgICAgIGxldCBjb2xsZWN0aW9uOiBzdHJpbmdcbiAgICAgIGxldCByZXF1ZXN0ZWRJRDogbnVtYmVyIHwgc3RyaW5nXG5cbiAgICAgIGlmICh0eXBlb2YgcmVsYXRpb25UbyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29sbGVjdGlvbiA9IHJlbGF0aW9uVG9cblxuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXF1ZXN0ZWRJRCA9IHZhbFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlbGF0aW9uVG8pICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbD8ucmVsYXRpb25Ubykge1xuICAgICAgICBjb2xsZWN0aW9uID0gdmFsLnJlbGF0aW9uVG9cbiAgICAgICAgcmVxdWVzdGVkSUQgPSB2YWwudmFsdWVcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9wdGlvbnNbY29sbGVjdGlvbl0uaW5kZXhPZihyZXF1ZXN0ZWRJRCkgPT09IC0xXG4gICAgfSlcblxuICAgIGlmIChpbnZhbGlkUmVsYXRpb25zaGlwcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gaW52YWxpZFJlbGF0aW9uc2hpcHMucmVkdWNlKChlcnIsIGludmFsaWQsIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIGAke2Vycn0gJHtKU09OLnN0cmluZ2lmeShpbnZhbGlkKX0ke1xuICAgICAgICAgIGludmFsaWRSZWxhdGlvbnNoaXBzLmxlbmd0aCA9PT0gaSArIDEgPyAnLCcgOiAnJ1xuICAgICAgICB9IGBcbiAgICAgIH0sIHQoJ3ZhbGlkYXRpb246aW52YWxpZFNlbGVjdGlvbnMnKSkgYXMgc3RyaW5nXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydCBjb25zdCB1cGxvYWQ6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIFVwbG9hZEZpZWxkPiA9ICh2YWx1ZTogc3RyaW5nLCBvcHRpb25zKSA9PiB7XG4gIGlmICghdmFsdWUgJiYgb3B0aW9ucy5yZXF1aXJlZCkge1xuICAgIHJldHVybiBvcHRpb25zLnQoJ3ZhbGlkYXRpb246cmVxdWlyZWQnKVxuICB9XG5cbiAgaWYgKCFjYW5Vc2VET00gJiYgdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGlkRmllbGQgPSBvcHRpb25zPy5jb25maWc/LmNvbGxlY3Rpb25zXG4gICAgICA/LmZpbmQoKGNvbGxlY3Rpb24pID0+IGNvbGxlY3Rpb24uc2x1ZyA9PT0gb3B0aW9ucy5yZWxhdGlvblRvKVxuICAgICAgPy5maWVsZHM/LmZpbmQoKGZpZWxkKSA9PiBmaWVsZEFmZmVjdHNEYXRhKGZpZWxkKSAmJiBmaWVsZC5uYW1lID09PSAnaWQnKVxuXG4gICAgY29uc3QgdHlwZSA9IGdldElEVHlwZShpZEZpZWxkLCBvcHRpb25zPy5wYXlsb2FkPy5kYj8uZGVmYXVsdElEVHlwZSlcblxuICAgIGlmICghaXNWYWxpZElEKHZhbHVlLCB0eXBlKSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMudCgndmFsaWRhdGlvbjp2YWxpZFVwbG9hZElEJylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVGaWx0ZXJPcHRpb25zKHZhbHVlLCBvcHRpb25zKVxufVxuXG5leHBvcnQgY29uc3QgcmVsYXRpb25zaGlwOiBWYWxpZGF0ZTx1bmtub3duLCB1bmtub3duLCBSZWxhdGlvbnNoaXBGaWVsZD4gPSBhc3luYyAoXG4gIHZhbHVlOiBSZWxhdGlvbnNoaXBWYWx1ZSxcbiAgb3B0aW9ucyxcbikgPT4ge1xuICBjb25zdCB7IGNvbmZpZywgbWF4Um93cywgbWluUm93cywgcGF5bG9hZCwgcmVsYXRpb25UbywgcmVxdWlyZWQsIHQgfSA9IG9wdGlvbnNcblxuICBpZiAoKCF2YWx1ZSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSkgJiYgcmVxdWlyZWQpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpyZXF1aXJlZCcpXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBpZiAobWluUm93cyAmJiB2YWx1ZS5sZW5ndGggPCBtaW5Sb3dzKSB7XG4gICAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpsZXNzVGhhbk1pbicsIHsgbGFiZWw6IHQoJ3Jvd3MnKSwgbWluOiBtaW5Sb3dzLCB2YWx1ZTogdmFsdWUubGVuZ3RoIH0pXG4gICAgfVxuXG4gICAgaWYgKG1heFJvd3MgJiYgdmFsdWUubGVuZ3RoID4gbWF4Um93cykge1xuICAgICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246Z3JlYXRlclRoYW5NYXgnLCB7IGxhYmVsOiB0KCdyb3dzJyksIG1heDogbWF4Um93cywgdmFsdWU6IHZhbHVlLmxlbmd0aCB9KVxuICAgIH1cbiAgfVxuXG4gIGlmICghY2FuVXNlRE9NICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXVxuXG4gICAgY29uc3QgaW52YWxpZFJlbGF0aW9uc2hpcHMgPSB2YWx1ZXMuZmlsdGVyKCh2YWwpID0+IHtcbiAgICAgIGxldCBjb2xsZWN0aW9uU2x1Zzogc3RyaW5nXG4gICAgICBsZXQgcmVxdWVzdGVkSURcblxuICAgICAgaWYgKHR5cGVvZiByZWxhdGlvblRvID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb2xsZWN0aW9uU2x1ZyA9IHJlbGF0aW9uVG9cblxuICAgICAgICAvLyBjdXN0b20gaWRcbiAgICAgICAgaWYgKHZhbCkge1xuICAgICAgICAgIHJlcXVlc3RlZElEID0gdmFsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVsYXRpb25UbykgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsPy5yZWxhdGlvblRvKSB7XG4gICAgICAgIGNvbGxlY3Rpb25TbHVnID0gdmFsLnJlbGF0aW9uVG9cbiAgICAgICAgcmVxdWVzdGVkSUQgPSB2YWwudmFsdWVcbiAgICAgIH1cblxuICAgICAgaWYgKHJlcXVlc3RlZElEID09PSBudWxsKSByZXR1cm4gZmFsc2VcblxuICAgICAgY29uc3QgaWRGaWVsZCA9IGNvbmZpZz8uY29sbGVjdGlvbnNcbiAgICAgICAgPy5maW5kKChjb2xsZWN0aW9uKSA9PiBjb2xsZWN0aW9uLnNsdWcgPT09IGNvbGxlY3Rpb25TbHVnKVxuICAgICAgICA/LmZpZWxkcz8uZmluZCgoZmllbGQpID0+IGZpZWxkQWZmZWN0c0RhdGEoZmllbGQpICYmIGZpZWxkLm5hbWUgPT09ICdpZCcpXG5cbiAgICAgIGNvbnN0IHR5cGUgPSBnZXRJRFR5cGUoaWRGaWVsZCwgcGF5bG9hZD8uZGI/LmRlZmF1bHRJRFR5cGUpXG5cbiAgICAgIHJldHVybiAhaXNWYWxpZElEKHJlcXVlc3RlZElELCB0eXBlKVxuICAgIH0pXG5cbiAgICBpZiAoaW52YWxpZFJlbGF0aW9uc2hpcHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGBUaGlzIHJlbGF0aW9uc2hpcCBmaWVsZCBoYXMgdGhlIGZvbGxvd2luZyBpbnZhbGlkIHJlbGF0aW9uc2hpcHM6ICR7aW52YWxpZFJlbGF0aW9uc2hpcHNcbiAgICAgICAgLm1hcCgoZXJyLCBpbnZhbGlkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAke2Vycn0gJHtKU09OLnN0cmluZ2lmeShpbnZhbGlkKX1gXG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKCcsICcpfWBcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVGaWx0ZXJPcHRpb25zKHZhbHVlLCBvcHRpb25zKVxufVxuXG5leHBvcnQgY29uc3QgYXJyYXk6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIEFycmF5RmllbGQ+ID0gKFxuICB2YWx1ZSxcbiAgeyBtYXhSb3dzLCBtaW5Sb3dzLCByZXF1aXJlZCwgdCB9LFxuKSA9PiB7XG4gIGNvbnN0IGFycmF5TGVuZ3RoID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5sZW5ndGggOiAwXG5cbiAgaWYgKG1pblJvd3MgJiYgYXJyYXlMZW5ndGggPCBtaW5Sb3dzKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246cmVxdWlyZXNBdExlYXN0JywgeyBjb3VudDogbWluUm93cywgbGFiZWw6IHQoJ3Jvd3MnKSB9KVxuICB9XG5cbiAgaWYgKG1heFJvd3MgJiYgYXJyYXlMZW5ndGggPiBtYXhSb3dzKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246cmVxdWlyZXNOb01vcmVUaGFuJywgeyBjb3VudDogbWF4Um93cywgbGFiZWw6IHQoJ3Jvd3MnKSB9KVxuICB9XG5cbiAgaWYgKCFhcnJheUxlbmd0aCAmJiByZXF1aXJlZCkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOnJlcXVpcmVzQXRMZWFzdCcsIHsgY291bnQ6IDEsIGxhYmVsOiB0KCdyb3cnKSB9KVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IHNlbGVjdDogVmFsaWRhdGU8dW5rbm93biwgdW5rbm93biwgU2VsZWN0RmllbGQ+ID0gKFxuICB2YWx1ZSxcbiAgeyBoYXNNYW55LCBvcHRpb25zLCByZXF1aXJlZCwgdCB9LFxuKSA9PiB7XG4gIGlmIChcbiAgICBBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgIHZhbHVlLnNvbWUoXG4gICAgICAoaW5wdXQpID0+XG4gICAgICAgICFvcHRpb25zLnNvbWUoXG4gICAgICAgICAgKG9wdGlvbikgPT4gb3B0aW9uID09PSBpbnB1dCB8fCAodHlwZW9mIG9wdGlvbiAhPT0gJ3N0cmluZycgJiYgb3B0aW9uPy52YWx1ZSA9PT0gaW5wdXQpLFxuICAgICAgICApLFxuICAgIClcbiAgKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246aW52YWxpZFNlbGVjdGlvbicpXG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICFvcHRpb25zLnNvbWUoXG4gICAgICAob3B0aW9uKSA9PiBvcHRpb24gPT09IHZhbHVlIHx8ICh0eXBlb2Ygb3B0aW9uICE9PSAnc3RyaW5nJyAmJiBvcHRpb24udmFsdWUgPT09IHZhbHVlKSxcbiAgICApXG4gICkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOmludmFsaWRTZWxlY3Rpb24nKVxuICB9XG5cbiAgaWYgKFxuICAgIHJlcXVpcmVkICYmXG4gICAgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgIHZhbHVlID09PSBudWxsIHx8XG4gICAgICAoaGFzTWFueSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiAodmFsdWUgYXMgW10pPy5sZW5ndGggPT09IDApKVxuICApIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpyZXF1aXJlZCcpXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgcmFkaW86IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIFJhZGlvRmllbGQ+ID0gKHZhbHVlLCB7IG9wdGlvbnMsIHJlcXVpcmVkLCB0IH0pID0+IHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgY29uc3QgdmFsdWVNYXRjaGVzT3B0aW9uID0gb3B0aW9ucy5zb21lKFxuICAgICAgKG9wdGlvbikgPT4gb3B0aW9uID09PSB2YWx1ZSB8fCAodHlwZW9mIG9wdGlvbiAhPT0gJ3N0cmluZycgJiYgb3B0aW9uLnZhbHVlID09PSB2YWx1ZSksXG4gICAgKVxuICAgIHJldHVybiB2YWx1ZU1hdGNoZXNPcHRpb24gfHwgdCgndmFsaWRhdGlvbjppbnZhbGlkU2VsZWN0aW9uJylcbiAgfVxuXG4gIHJldHVybiByZXF1aXJlZCA/IHQoJ3ZhbGlkYXRpb246cmVxdWlyZWQnKSA6IHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IGJsb2NrczogVmFsaWRhdGU8dW5rbm93biwgdW5rbm93biwgQmxvY2tGaWVsZD4gPSAoXG4gIHZhbHVlLFxuICB7IG1heFJvd3MsIG1pblJvd3MsIHJlcXVpcmVkLCB0IH0sXG4pID0+IHtcbiAgY29uc3QgYXJyYXlMZW5ndGggPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLmxlbmd0aCA6IDBcblxuICBpZiAobWluUm93cyAmJiBhcnJheUxlbmd0aCA8IG1pblJvd3MpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpyZXF1aXJlc0F0TGVhc3QnLCB7IGNvdW50OiBtaW5Sb3dzLCBsYWJlbDogdCgncm93cycpIH0pXG4gIH1cblxuICBpZiAobWF4Um93cyAmJiBhcnJheUxlbmd0aCA+IG1heFJvd3MpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpyZXF1aXJlc05vTW9yZVRoYW4nLCB7IGNvdW50OiBtYXhSb3dzLCBsYWJlbDogdCgncm93cycpIH0pXG4gIH1cblxuICBpZiAoIWFycmF5TGVuZ3RoICYmIHJlcXVpcmVkKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246cmVxdWlyZXNBdExlYXN0JywgeyBjb3VudDogMSwgbGFiZWw6IHQoJ3JvdycpIH0pXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgcG9pbnQ6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIFBvaW50RmllbGQ+ID0gKFxuICB2YWx1ZTogW251bWJlciB8IHN0cmluZywgbnVtYmVyIHwgc3RyaW5nXSA9IFsnJywgJyddLFxuICB7IHJlcXVpcmVkLCB0IH0sXG4pID0+IHtcbiAgY29uc3QgbG5nID0gcGFyc2VGbG9hdChTdHJpbmcodmFsdWVbMF0pKVxuICBjb25zdCBsYXQgPSBwYXJzZUZsb2F0KFN0cmluZyh2YWx1ZVsxXSkpXG4gIGlmIChcbiAgICByZXF1aXJlZCAmJlxuICAgICgodmFsdWVbMF0gJiYgdmFsdWVbMV0gJiYgdHlwZW9mIGxuZyAhPT0gJ251bWJlcicgJiYgdHlwZW9mIGxhdCAhPT0gJ251bWJlcicpIHx8XG4gICAgICBOdW1iZXIuaXNOYU4obG5nKSB8fFxuICAgICAgTnVtYmVyLmlzTmFOKGxhdCkgfHxcbiAgICAgIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggIT09IDIpKVxuICApIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpyZXF1aXJlc1R3b051bWJlcnMnKVxuICB9XG5cbiAgaWYgKCh2YWx1ZVsxXSAmJiBOdW1iZXIuaXNOYU4obG5nKSkgfHwgKHZhbHVlWzBdICYmIE51bWJlci5pc05hTihsYXQpKSkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOmludmFsaWRJbnB1dCcpXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGFycmF5LFxuICBibG9ja3MsXG4gIGNoZWNrYm94LFxuICBjb2RlLFxuICBkYXRlLFxuICBlbWFpbCxcbiAganNvbixcbiAgbnVtYmVyLFxuICBwYXNzd29yZCxcbiAgcG9pbnQsXG4gIHJhZGlvLFxuICByZWxhdGlvbnNoaXAsXG4gIHJpY2hUZXh0LFxuICBzZWxlY3QsXG4gIHRleHQsXG4gIHRleHRhcmVhLFxuICB1cGxvYWQsXG59XG4iXSwibmFtZXMiOlsibnVtYmVyIiwidGV4dCIsInBhc3N3b3JkIiwiZW1haWwiLCJ0ZXh0YXJlYSIsImNvZGUiLCJqc29uIiwiY2hlY2tib3giLCJkYXRlIiwicmljaFRleHQiLCJ1cGxvYWQiLCJyZWxhdGlvbnNoaXAiLCJhcnJheSIsInNlbGVjdCIsInJhZGlvIiwiYmxvY2tzIiwicG9pbnQiLCJ2YWx1ZSIsImhhc01hbnkiLCJtYXgiLCJtYXhSb3dzIiwibWluIiwibWluUm93cyIsInJlcXVpcmVkIiwidCIsInRvVmFsaWRhdGUiLCJBcnJheSIsImlzQXJyYXkiLCJ2YWx1ZVRvVmFsaWRhdGUiLCJmbG9hdFZhbHVlIiwicGFyc2VGbG9hdCIsIk51bWJlciIsImlzTmFOIiwibGFiZWwiLCJsZW5ndGgiLCJjb25maWciLCJtYXhMZW5ndGgiLCJmaWVsZE1heExlbmd0aCIsIm1pbkxlbmd0aCIsInBheWxvYWQiLCJkZWZhdWx0TWF4VGV4dExlbmd0aCIsInRlc3QiLCJ1bmRlZmluZWQiLCJqc29uRXJyb3IiLCJEYXRlIiwicGFyc2UiLCJ0b1N0cmluZyIsIm9wdGlvbnMiLCJlZGl0b3IiLCJ2YWxpZGF0ZSIsInZhbGlkYXRlRmlsdGVyT3B0aW9ucyIsImlkIiwiZGF0YSIsImZpbHRlck9wdGlvbnMiLCJyZWxhdGlvblRvIiwic2libGluZ0RhdGEiLCJ1c2VyIiwiY2FuVXNlRE9NIiwiY29sbGVjdGlvbnMiLCJ2YWx1ZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwiY29sbGVjdGlvbiIsIm9wdGlvbkZpbHRlciIsInZhbHVlSURzIiwiZm9yRWFjaCIsInZhbCIsInB1c2giLCJmaW5kV2hlcmUiLCJhbmQiLCJpbiIsInJlc3VsdCIsImZpbmQiLCJkZXB0aCIsImxpbWl0IiwicGFnaW5hdGlvbiIsIndoZXJlIiwiZG9jcyIsImRvYyIsImludmFsaWRSZWxhdGlvbnNoaXBzIiwiZmlsdGVyIiwicmVxdWVzdGVkSUQiLCJpbmRleE9mIiwicmVkdWNlIiwiZXJyIiwiaW52YWxpZCIsImkiLCJKU09OIiwic3RyaW5naWZ5IiwiaWRGaWVsZCIsInNsdWciLCJmaWVsZHMiLCJmaWVsZCIsImZpZWxkQWZmZWN0c0RhdGEiLCJuYW1lIiwidHlwZSIsImdldElEVHlwZSIsImRiIiwiZGVmYXVsdElEVHlwZSIsImlzVmFsaWRJRCIsImNvbGxlY3Rpb25TbHVnIiwiam9pbiIsImFycmF5TGVuZ3RoIiwiY291bnQiLCJzb21lIiwiaW5wdXQiLCJvcHRpb24iLCJ2YWx1ZU1hdGNoZXNPcHRpb24iLCJsbmciLCJTdHJpbmciLCJsYXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0lBMkJhQSxNQUFNO2VBQU5BOztJQXVEQUMsSUFBSTtlQUFKQTs7SUF5QkFDLFFBQVE7ZUFBUkE7O0lBd0JBQyxLQUFLO2VBQUxBOztJQVFBQyxRQUFRO2VBQVJBOztJQXVCQUMsSUFBSTtlQUFKQTs7SUFRQUMsSUFBSTtlQUFKQTs7SUFlQUMsUUFBUTtlQUFSQTs7SUFXQUMsSUFBSTtlQUFKQTs7SUFpQkFDLFFBQVE7ZUFBUkE7O0lBc0dBQyxNQUFNO2VBQU5BOztJQW9CQUMsWUFBWTtlQUFaQTs7SUFnRUFDLEtBQUs7ZUFBTEE7O0lBcUJBQyxNQUFNO2VBQU5BOztJQXFDQUMsS0FBSztlQUFMQTs7SUFXQUMsTUFBTTtlQUFOQTs7SUFxQkFDLEtBQUs7ZUFBTEE7O0lBdUJiLE9Ba0JDO2VBbEJEOzs7a0VBMWVzQjsyQkFDSTsyQkFDQTt1QkFDTzs7Ozs7O0FBRTFCLE1BQU1oQixTQUFrRCxDQUM3RGlCLE9BQ0EsRUFBRUMsT0FBTyxFQUFFQyxHQUFHLEVBQUVDLE9BQU8sRUFBRUMsR0FBRyxFQUFFQyxPQUFPLEVBQUVDLFFBQVEsRUFBRUMsQ0FBQyxFQUFFO0lBRXBELE1BQU1DLGFBQXVCQyxNQUFNQyxPQUFPLENBQUNWLFNBQVNBLFFBQVE7UUFBQ0E7S0FBTTtJQUVuRSxnREFBZ0Q7SUFDaEQsS0FBSyxNQUFNVyxtQkFBbUJILFdBQVk7UUFDeEMsTUFBTUksYUFBYUMsV0FBV0Y7UUFDOUIsSUFDRSxBQUFDWCxTQUFTLE9BQU9ZLGVBQWUsWUFDL0JOLFlBQVlRLE9BQU9DLEtBQUssQ0FBQ0gsZUFDekJaLFNBQVNjLE9BQU9DLEtBQUssQ0FBQ0gsYUFDdkI7WUFDQSxPQUFPTCxFQUFFO1FBQ1g7UUFFQSxJQUFJLE9BQU9MLFFBQVEsWUFBWVUsYUFBYVYsS0FBSztZQUMvQyxPQUFPSyxFQUFFLDZCQUE2QjtnQkFBRVMsT0FBT1QsRUFBRTtnQkFBVUw7Z0JBQUtGO1lBQU07UUFDeEU7UUFFQSxJQUFJLE9BQU9JLFFBQVEsWUFBWVEsYUFBYVIsS0FBSztZQUMvQyxPQUFPRyxFQUFFLDBCQUEwQjtnQkFBRVMsT0FBT1QsRUFBRTtnQkFBVUg7Z0JBQUtKO1lBQU07UUFDckU7UUFFQSxJQUFJTSxZQUFZLE9BQU9NLGVBQWUsVUFBVTtZQUM5QyxPQUFPTCxFQUFFO1FBQ1g7SUFDRjtJQUVBLElBQUlELFlBQVlFLFdBQVdTLE1BQU0sS0FBSyxHQUFHO1FBQ3ZDLE9BQU9WLEVBQUU7SUFDWDtJQUVBLElBQUlOLFlBQVksTUFBTTtRQUNwQixJQUFJSSxXQUFXRyxXQUFXUyxNQUFNLEdBQUdaLFNBQVM7WUFDMUMsT0FBT0UsRUFBRSwwQkFBMEI7Z0JBQ2pDUyxPQUFPVCxFQUFFO2dCQUNUSCxLQUFLQztnQkFDTEwsT0FBT1EsV0FBV1MsTUFBTTtZQUMxQjtRQUNGO1FBRUEsSUFBSWQsV0FBV0ssV0FBV1MsTUFBTSxHQUFHZCxTQUFTO1lBQzFDLE9BQU9JLEVBQUUsNkJBQTZCO2dCQUNwQ1MsT0FBT1QsRUFBRTtnQkFDVEwsS0FBS0M7Z0JBQ0xILE9BQU9RLFdBQVdTLE1BQU07WUFDMUI7UUFDRjtJQUNGO0lBRUEsT0FBTztBQUNUO0FBRU8sTUFBTWpDLE9BQThDLENBQ3pEZ0IsT0FDQSxFQUFFa0IsTUFBTSxFQUFFQyxXQUFXQyxjQUFjLEVBQUVDLFNBQVMsRUFBRUMsT0FBTyxFQUFFaEIsUUFBUSxFQUFFQyxDQUFDLEVBQUU7SUFFdEUsSUFBSVk7SUFFSixJQUFJLE9BQU9ELFFBQVFLLHlCQUF5QixVQUFVSixZQUFZRCxPQUFPSyxvQkFBb0I7SUFDN0YsSUFBSSxPQUFPSCxtQkFBbUIsVUFBVUQsWUFBWUM7SUFDcEQsSUFBSXBCLFNBQVNtQixhQUFhbkIsTUFBTWlCLE1BQU0sR0FBR0UsV0FBVztRQUNsRCxPQUFPWixFQUFFLDZCQUE2QjtZQUFFWTtRQUFVO0lBQ3BEO0lBRUEsSUFBSW5CLFNBQVNxQixhQUFhckIsT0FBT2lCLFNBQVNJLFdBQVc7UUFDbkQsT0FBT2QsRUFBRSw0QkFBNEI7WUFBRWM7UUFBVTtJQUNuRDtJQUVBLElBQUlmLFVBQVU7UUFDWixJQUFJLE9BQU9OLFVBQVUsWUFBWUEsT0FBT2lCLFdBQVcsR0FBRztZQUNwRCxPQUFPVixFQUFFO1FBQ1g7SUFDRjtJQUVBLE9BQU87QUFDVDtBQUVPLE1BQU10QixXQUFrRCxDQUM3RGUsT0FDQSxFQUFFa0IsTUFBTSxFQUFFQyxXQUFXQyxjQUFjLEVBQUVDLFNBQVMsRUFBRUMsT0FBTyxFQUFFaEIsUUFBUSxFQUFFQyxDQUFDLEVBQUU7SUFFdEUsSUFBSVk7SUFFSixJQUFJLE9BQU9ELFFBQVFLLHlCQUF5QixVQUFVSixZQUFZRCxPQUFPSyxvQkFBb0I7SUFDN0YsSUFBSSxPQUFPSCxtQkFBbUIsVUFBVUQsWUFBWUM7SUFFcEQsSUFBSXBCLFNBQVNtQixhQUFhbkIsTUFBTWlCLE1BQU0sR0FBR0UsV0FBVztRQUNsRCxPQUFPWixFQUFFLDZCQUE2QjtZQUFFWTtRQUFVO0lBQ3BEO0lBRUEsSUFBSW5CLFNBQVNxQixhQUFhckIsTUFBTWlCLE1BQU0sR0FBR0ksV0FBVztRQUNsRCxPQUFPZCxFQUFFLDRCQUE0QjtZQUFFYztRQUFVO0lBQ25EO0lBRUEsSUFBSWYsWUFBWSxDQUFDTixPQUFPO1FBQ3RCLE9BQU9PLEVBQUU7SUFDWDtJQUVBLE9BQU87QUFDVDtBQUVPLE1BQU1yQixRQUFnRCxDQUFDYyxPQUFlLEVBQUVNLFFBQVEsRUFBRUMsQ0FBQyxFQUFFO0lBQzFGLElBQUksQUFBQ1AsU0FBUyxDQUFDLHFCQUFxQndCLElBQUksQ0FBQ3hCLFVBQVksQ0FBQ0EsU0FBU00sVUFBVztRQUN4RSxPQUFPQyxFQUFFO0lBQ1g7SUFFQSxPQUFPO0FBQ1Q7QUFFTyxNQUFNcEIsV0FBc0QsQ0FDakVhLE9BQ0EsRUFBRWtCLE1BQU0sRUFBRUMsV0FBV0MsY0FBYyxFQUFFQyxTQUFTLEVBQUVDLE9BQU8sRUFBRWhCLFFBQVEsRUFBRUMsQ0FBQyxFQUFFO0lBRXRFLElBQUlZO0lBRUosSUFBSSxPQUFPRCxRQUFRSyx5QkFBeUIsVUFBVUosWUFBWUQsT0FBT0ssb0JBQW9CO0lBQzdGLElBQUksT0FBT0gsbUJBQW1CLFVBQVVELFlBQVlDO0lBQ3BELElBQUlwQixTQUFTbUIsYUFBYW5CLE1BQU1pQixNQUFNLEdBQUdFLFdBQVc7UUFDbEQsT0FBT1osRUFBRSw2QkFBNkI7WUFBRVk7UUFBVTtJQUNwRDtJQUVBLElBQUluQixTQUFTcUIsYUFBYXJCLE1BQU1pQixNQUFNLEdBQUdJLFdBQVc7UUFDbEQsT0FBT2QsRUFBRSw0QkFBNEI7WUFBRWM7UUFBVTtJQUNuRDtJQUVBLElBQUlmLFlBQVksQ0FBQ04sT0FBTztRQUN0QixPQUFPTyxFQUFFO0lBQ1g7SUFFQSxPQUFPO0FBQ1Q7QUFFTyxNQUFNbkIsT0FBOEMsQ0FBQ1ksT0FBZSxFQUFFTSxRQUFRLEVBQUVDLENBQUMsRUFBRTtJQUN4RixJQUFJRCxZQUFZTixVQUFVeUIsV0FBVztRQUNuQyxPQUFPbEIsRUFBRTtJQUNYO0lBRUEsT0FBTztBQUNUO0FBRU8sTUFBTWxCLE9BQXVFLENBQ2xGVyxPQUNBLEVBQUUwQixTQUFTLEVBQUVwQixRQUFRLEVBQUVDLENBQUMsRUFBRTtJQUUxQixJQUFJRCxZQUFZLENBQUNOLE9BQU87UUFDdEIsT0FBT08sRUFBRTtJQUNYO0lBRUEsSUFBSW1CLGNBQWNELFdBQVc7UUFDM0IsT0FBT2xCLEVBQUU7SUFDWDtJQUVBLE9BQU87QUFDVDtBQUVPLE1BQU1qQixXQUFzRCxDQUNqRVUsT0FDQSxFQUFFTSxRQUFRLEVBQUVDLENBQUMsRUFBRTtJQUVmLElBQUksQUFBQ1AsU0FBUyxPQUFPQSxVQUFVLGFBQWVNLFlBQVksT0FBT04sVUFBVSxXQUFZO1FBQ3JGLE9BQU9PLEVBQUU7SUFDWDtJQUVBLE9BQU87QUFDVDtBQUVPLE1BQU1oQixPQUE4QyxDQUFDUyxPQUFPLEVBQUVNLFFBQVEsRUFBRUMsQ0FBQyxFQUFFO0lBQ2hGLElBQUlQLFNBQVMsQ0FBQ2UsTUFBTVksS0FBS0MsS0FBSyxDQUFDNUIsTUFBTTZCLFFBQVEsTUFBTTtRQUNqRCx1QkFBdUIsR0FDdkIsT0FBTztJQUNUO0lBRUEsSUFBSTdCLE9BQU87UUFDVCxPQUFPTyxFQUFFLDJCQUEyQjtZQUFFUDtRQUFNO0lBQzlDO0lBRUEsSUFBSU0sVUFBVTtRQUNaLE9BQU9DLEVBQUU7SUFDWDtJQUVBLE9BQU87QUFDVDtBQUVPLE1BQU1mLFdBQW9FLE9BQy9FUSxPQUNBOEI7SUFFQSxNQUFNQyxTQUEwQkQsU0FBU0M7SUFFekMsT0FBTyxNQUFNQSxPQUFPQyxRQUFRLENBQUNoQyxPQUFPOEI7QUFDdEM7QUFFQSxNQUFNRyx3QkFBa0MsT0FDdENqQyxPQUNBLEVBQUVrQyxFQUFFLEVBQUVDLElBQUksRUFBRUMsYUFBYSxFQUFFZCxPQUFPLEVBQUVlLFVBQVUsRUFBRUMsV0FBVyxFQUFFL0IsQ0FBQyxFQUFFZ0MsSUFBSSxFQUFFO0lBRXRFLElBQUksQ0FBQ0Msa0JBQVMsSUFBSSxPQUFPSixrQkFBa0IsZUFBZXBDLE9BQU87UUFDL0QsTUFBTThCLFVBRUYsQ0FBQztRQUVMLE1BQU1XLGNBQWMsT0FBT0osZUFBZSxXQUFXO1lBQUNBO1NBQVcsR0FBR0E7UUFDcEUsTUFBTUssU0FBU2pDLE1BQU1DLE9BQU8sQ0FBQ1YsU0FBU0EsUUFBUTtZQUFDQTtTQUFNO1FBRXJELE1BQU0yQyxRQUFRQyxHQUFHLENBQ2ZILFlBQVlJLEdBQUcsQ0FBQyxPQUFPQztZQUNyQixNQUFNQyxlQUNKLE9BQU9YLGtCQUFrQixhQUNyQixNQUFNQSxjQUFjO2dCQUNsQkY7Z0JBQ0FDO2dCQUNBRSxZQUFZUztnQkFDWlI7Z0JBQ0FDO1lBQ0YsS0FDQUg7WUFFTixNQUFNWSxXQUFnQyxFQUFFO1lBRXhDTixPQUFPTyxPQUFPLENBQUMsQ0FBQ0M7Z0JBQ2QsSUFBSSxPQUFPQSxRQUFRLFlBQVlBLEtBQUtsRCxPQUFPO29CQUN6Q2dELFNBQVNHLElBQUksQ0FBQ0QsSUFBSWxELEtBQUs7Z0JBQ3pCO2dCQUVBLElBQUksT0FBT2tELFFBQVEsWUFBWSxPQUFPQSxRQUFRLFVBQVU7b0JBQ3RERixTQUFTRyxJQUFJLENBQUNEO2dCQUNoQjtZQUNGO1lBRUEsSUFBSUYsU0FBUy9CLE1BQU0sR0FBRyxHQUFHO2dCQUN2QixNQUFNbUMsWUFBWTtvQkFDaEJDLEtBQUs7d0JBQUM7NEJBQUVuQixJQUFJO2dDQUFFb0IsSUFBSU47NEJBQVM7d0JBQUU7cUJBQUU7Z0JBQ2pDO2dCQUVBLElBQUlELGNBQWNLLFVBQVVDLEdBQUcsQ0FBQ0YsSUFBSSxDQUFDSjtnQkFFckMsTUFBTVEsU0FBUyxNQUFNakMsUUFBUWtDLElBQUksQ0FBQztvQkFDaENWO29CQUNBVyxPQUFPO29CQUNQQyxPQUFPO29CQUNQQyxZQUFZO29CQUNaQyxPQUFPUjtnQkFDVDtnQkFFQXRCLE9BQU8sQ0FBQ2dCLFdBQVcsR0FBR1MsT0FBT00sSUFBSSxDQUFDaEIsR0FBRyxDQUFDLENBQUNpQixNQUFRQSxJQUFJNUIsRUFBRTtZQUN2RCxPQUFPO2dCQUNMSixPQUFPLENBQUNnQixXQUFXLEdBQUcsRUFBRTtZQUMxQjtRQUNGO1FBR0YsTUFBTWlCLHVCQUF1QnJCLE9BQU9zQixNQUFNLENBQUMsQ0FBQ2Q7WUFDMUMsSUFBSUo7WUFDSixJQUFJbUI7WUFFSixJQUFJLE9BQU81QixlQUFlLFVBQVU7Z0JBQ2xDUyxhQUFhVDtnQkFFYixJQUFJLE9BQU9hLFFBQVEsWUFBWSxPQUFPQSxRQUFRLFVBQVU7b0JBQ3REZSxjQUFjZjtnQkFDaEI7WUFDRjtZQUVBLElBQUl6QyxNQUFNQyxPQUFPLENBQUMyQixlQUFlLE9BQU9hLFFBQVEsWUFBWUEsS0FBS2IsWUFBWTtnQkFDM0VTLGFBQWFJLElBQUliLFVBQVU7Z0JBQzNCNEIsY0FBY2YsSUFBSWxELEtBQUs7WUFDekI7WUFFQSxPQUFPOEIsT0FBTyxDQUFDZ0IsV0FBVyxDQUFDb0IsT0FBTyxDQUFDRCxpQkFBaUIsQ0FBQztRQUN2RDtRQUVBLElBQUlGLHFCQUFxQjlDLE1BQU0sR0FBRyxHQUFHO1lBQ25DLE9BQU84QyxxQkFBcUJJLE1BQU0sQ0FBQyxDQUFDQyxLQUFLQyxTQUFTQztnQkFDaEQsT0FBTyxDQUFDLEVBQUVGLElBQUksQ0FBQyxFQUFFRyxLQUFLQyxTQUFTLENBQUNILFNBQVMsRUFDdkNOLHFCQUFxQjlDLE1BQU0sS0FBS3FELElBQUksSUFBSSxNQUFNLEdBQy9DLENBQUMsQ0FBQztZQUNMLEdBQUcvRCxFQUFFO1FBQ1A7UUFFQSxPQUFPO0lBQ1Q7SUFFQSxPQUFPO0FBQ1Q7QUFFTyxNQUFNZCxTQUFrRCxDQUFDTyxPQUFlOEI7SUFDN0UsSUFBSSxDQUFDOUIsU0FBUzhCLFFBQVF4QixRQUFRLEVBQUU7UUFDOUIsT0FBT3dCLFFBQVF2QixDQUFDLENBQUM7SUFDbkI7SUFFQSxJQUFJLENBQUNpQyxrQkFBUyxJQUFJLE9BQU94QyxVQUFVLGVBQWVBLFVBQVUsTUFBTTtRQUNoRSxNQUFNeUUsVUFBVTNDLFNBQVNaLFFBQVF1QixhQUM3QmUsS0FBSyxDQUFDVixhQUFlQSxXQUFXNEIsSUFBSSxLQUFLNUMsUUFBUU8sVUFBVSxHQUMzRHNDLFFBQVFuQixLQUFLLENBQUNvQixRQUFVQyxJQUFBQSx1QkFBZ0IsRUFBQ0QsVUFBVUEsTUFBTUUsSUFBSSxLQUFLO1FBRXRFLE1BQU1DLE9BQU9DLElBQUFBLG9CQUFTLEVBQUNQLFNBQVMzQyxTQUFTUixTQUFTMkQsSUFBSUM7UUFFdEQsSUFBSSxDQUFDQyxJQUFBQSxvQkFBUyxFQUFDbkYsT0FBTytFLE9BQU87WUFDM0IsT0FBT2pELFFBQVF2QixDQUFDLENBQUM7UUFDbkI7SUFDRjtJQUVBLE9BQU8wQixzQkFBc0JqQyxPQUFPOEI7QUFDdEM7QUFFTyxNQUFNcEMsZUFBOEQsT0FDekVNLE9BQ0E4QjtJQUVBLE1BQU0sRUFBRVosTUFBTSxFQUFFZixPQUFPLEVBQUVFLE9BQU8sRUFBRWlCLE9BQU8sRUFBRWUsVUFBVSxFQUFFL0IsUUFBUSxFQUFFQyxDQUFDLEVBQUUsR0FBR3VCO0lBRXZFLElBQUksQUFBQyxDQUFBLENBQUM5QixTQUFVUyxNQUFNQyxPQUFPLENBQUNWLFVBQVVBLE1BQU1pQixNQUFNLEtBQUssQ0FBQyxLQUFNWCxVQUFVO1FBQ3hFLE9BQU9DLEVBQUU7SUFDWDtJQUVBLElBQUlFLE1BQU1DLE9BQU8sQ0FBQ1YsUUFBUTtRQUN4QixJQUFJSyxXQUFXTCxNQUFNaUIsTUFBTSxHQUFHWixTQUFTO1lBQ3JDLE9BQU9FLEVBQUUsMEJBQTBCO2dCQUFFUyxPQUFPVCxFQUFFO2dCQUFTSCxLQUFLQztnQkFBU0wsT0FBT0EsTUFBTWlCLE1BQU07WUFBQztRQUMzRjtRQUVBLElBQUlkLFdBQVdILE1BQU1pQixNQUFNLEdBQUdkLFNBQVM7WUFDckMsT0FBT0ksRUFBRSw2QkFBNkI7Z0JBQUVTLE9BQU9ULEVBQUU7Z0JBQVNMLEtBQUtDO2dCQUFTSCxPQUFPQSxNQUFNaUIsTUFBTTtZQUFDO1FBQzlGO0lBQ0Y7SUFFQSxJQUFJLENBQUN1QixrQkFBUyxJQUFJLE9BQU94QyxVQUFVLGVBQWVBLFVBQVUsTUFBTTtRQUNoRSxNQUFNMEMsU0FBU2pDLE1BQU1DLE9BQU8sQ0FBQ1YsU0FBU0EsUUFBUTtZQUFDQTtTQUFNO1FBRXJELE1BQU0rRCx1QkFBdUJyQixPQUFPc0IsTUFBTSxDQUFDLENBQUNkO1lBQzFDLElBQUlrQztZQUNKLElBQUluQjtZQUVKLElBQUksT0FBTzVCLGVBQWUsVUFBVTtnQkFDbEMrQyxpQkFBaUIvQztnQkFFakIsWUFBWTtnQkFDWixJQUFJYSxLQUFLO29CQUNQZSxjQUFjZjtnQkFDaEI7WUFDRjtZQUVBLElBQUl6QyxNQUFNQyxPQUFPLENBQUMyQixlQUFlLE9BQU9hLFFBQVEsWUFBWUEsS0FBS2IsWUFBWTtnQkFDM0UrQyxpQkFBaUJsQyxJQUFJYixVQUFVO2dCQUMvQjRCLGNBQWNmLElBQUlsRCxLQUFLO1lBQ3pCO1lBRUEsSUFBSWlFLGdCQUFnQixNQUFNLE9BQU87WUFFakMsTUFBTVEsVUFBVXZELFFBQVF1QixhQUNwQmUsS0FBSyxDQUFDVixhQUFlQSxXQUFXNEIsSUFBSSxLQUFLVSxpQkFDekNULFFBQVFuQixLQUFLLENBQUNvQixRQUFVQyxJQUFBQSx1QkFBZ0IsRUFBQ0QsVUFBVUEsTUFBTUUsSUFBSSxLQUFLO1lBRXRFLE1BQU1DLE9BQU9DLElBQUFBLG9CQUFTLEVBQUNQLFNBQVNuRCxTQUFTMkQsSUFBSUM7WUFFN0MsT0FBTyxDQUFDQyxJQUFBQSxvQkFBUyxFQUFDbEIsYUFBYWM7UUFDakM7UUFFQSxJQUFJaEIscUJBQXFCOUMsTUFBTSxHQUFHLEdBQUc7WUFDbkMsT0FBTyxDQUFDLGlFQUFpRSxFQUFFOEMscUJBQ3hFbEIsR0FBRyxDQUFDLENBQUN1QixLQUFLQztnQkFDVCxPQUFPLENBQUMsRUFBRUQsSUFBSSxDQUFDLEVBQUVHLEtBQUtDLFNBQVMsQ0FBQ0gsU0FBUyxDQUFDO1lBQzVDLEdBQ0NnQixJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ2pCO0lBQ0Y7SUFFQSxPQUFPcEQsc0JBQXNCakMsT0FBTzhCO0FBQ3RDO0FBRU8sTUFBTW5DLFFBQWdELENBQzNESyxPQUNBLEVBQUVHLE9BQU8sRUFBRUUsT0FBTyxFQUFFQyxRQUFRLEVBQUVDLENBQUMsRUFBRTtJQUVqQyxNQUFNK0UsY0FBYzdFLE1BQU1DLE9BQU8sQ0FBQ1YsU0FBU0EsTUFBTWlCLE1BQU0sR0FBRztJQUUxRCxJQUFJWixXQUFXaUYsY0FBY2pGLFNBQVM7UUFDcEMsT0FBT0UsRUFBRSw4QkFBOEI7WUFBRWdGLE9BQU9sRjtZQUFTVyxPQUFPVCxFQUFFO1FBQVE7SUFDNUU7SUFFQSxJQUFJSixXQUFXbUYsY0FBY25GLFNBQVM7UUFDcEMsT0FBT0ksRUFBRSxpQ0FBaUM7WUFBRWdGLE9BQU9wRjtZQUFTYSxPQUFPVCxFQUFFO1FBQVE7SUFDL0U7SUFFQSxJQUFJLENBQUMrRSxlQUFlaEYsVUFBVTtRQUM1QixPQUFPQyxFQUFFLDhCQUE4QjtZQUFFZ0YsT0FBTztZQUFHdkUsT0FBT1QsRUFBRTtRQUFPO0lBQ3JFO0lBRUEsT0FBTztBQUNUO0FBRU8sTUFBTVgsU0FBa0QsQ0FDN0RJLE9BQ0EsRUFBRUMsT0FBTyxFQUFFNkIsT0FBTyxFQUFFeEIsUUFBUSxFQUFFQyxDQUFDLEVBQUU7SUFFakMsSUFDRUUsTUFBTUMsT0FBTyxDQUFDVixVQUNkQSxNQUFNd0YsSUFBSSxDQUNSLENBQUNDLFFBQ0MsQ0FBQzNELFFBQVEwRCxJQUFJLENBQ1gsQ0FBQ0UsU0FBV0EsV0FBV0QsU0FBVSxPQUFPQyxXQUFXLFlBQVlBLFFBQVExRixVQUFVeUYsU0FHdkY7UUFDQSxPQUFPbEYsRUFBRTtJQUNYO0lBRUEsSUFDRSxPQUFPUCxVQUFVLFlBQ2pCLENBQUM4QixRQUFRMEQsSUFBSSxDQUNYLENBQUNFLFNBQVdBLFdBQVcxRixTQUFVLE9BQU8wRixXQUFXLFlBQVlBLE9BQU8xRixLQUFLLEtBQUtBLFFBRWxGO1FBQ0EsT0FBT08sRUFBRTtJQUNYO0lBRUEsSUFDRUQsWUFDQyxDQUFBLE9BQU9OLFVBQVUsZUFDaEJBLFVBQVUsUUFDVEMsV0FBV1EsTUFBTUMsT0FBTyxDQUFDVixVQUFVLEFBQUNBLE9BQWNpQixXQUFXLENBQUMsR0FDakU7UUFDQSxPQUFPVixFQUFFO0lBQ1g7SUFFQSxPQUFPO0FBQ1Q7QUFFTyxNQUFNVixRQUFnRCxDQUFDRyxPQUFPLEVBQUU4QixPQUFPLEVBQUV4QixRQUFRLEVBQUVDLENBQUMsRUFBRTtJQUMzRixJQUFJUCxPQUFPO1FBQ1QsTUFBTTJGLHFCQUFxQjdELFFBQVEwRCxJQUFJLENBQ3JDLENBQUNFLFNBQVdBLFdBQVcxRixTQUFVLE9BQU8wRixXQUFXLFlBQVlBLE9BQU8xRixLQUFLLEtBQUtBO1FBRWxGLE9BQU8yRixzQkFBc0JwRixFQUFFO0lBQ2pDO0lBRUEsT0FBT0QsV0FBV0MsRUFBRSx5QkFBeUI7QUFDL0M7QUFFTyxNQUFNVCxTQUFpRCxDQUM1REUsT0FDQSxFQUFFRyxPQUFPLEVBQUVFLE9BQU8sRUFBRUMsUUFBUSxFQUFFQyxDQUFDLEVBQUU7SUFFakMsTUFBTStFLGNBQWM3RSxNQUFNQyxPQUFPLENBQUNWLFNBQVNBLE1BQU1pQixNQUFNLEdBQUc7SUFFMUQsSUFBSVosV0FBV2lGLGNBQWNqRixTQUFTO1FBQ3BDLE9BQU9FLEVBQUUsOEJBQThCO1lBQUVnRixPQUFPbEY7WUFBU1csT0FBT1QsRUFBRTtRQUFRO0lBQzVFO0lBRUEsSUFBSUosV0FBV21GLGNBQWNuRixTQUFTO1FBQ3BDLE9BQU9JLEVBQUUsaUNBQWlDO1lBQUVnRixPQUFPcEY7WUFBU2EsT0FBT1QsRUFBRTtRQUFRO0lBQy9FO0lBRUEsSUFBSSxDQUFDK0UsZUFBZWhGLFVBQVU7UUFDNUIsT0FBT0MsRUFBRSw4QkFBOEI7WUFBRWdGLE9BQU87WUFBR3ZFLE9BQU9ULEVBQUU7UUFBTztJQUNyRTtJQUVBLE9BQU87QUFDVDtBQUVPLE1BQU1SLFFBQWdELENBQzNEQyxRQUE0QztJQUFDO0lBQUk7Q0FBRyxFQUNwRCxFQUFFTSxRQUFRLEVBQUVDLENBQUMsRUFBRTtJQUVmLE1BQU1xRixNQUFNL0UsV0FBV2dGLE9BQU83RixLQUFLLENBQUMsRUFBRTtJQUN0QyxNQUFNOEYsTUFBTWpGLFdBQVdnRixPQUFPN0YsS0FBSyxDQUFDLEVBQUU7SUFDdEMsSUFDRU0sWUFDQyxDQUFBLEFBQUNOLEtBQUssQ0FBQyxFQUFFLElBQUlBLEtBQUssQ0FBQyxFQUFFLElBQUksT0FBTzRGLFFBQVEsWUFBWSxPQUFPRSxRQUFRLFlBQ2xFaEYsT0FBT0MsS0FBSyxDQUFDNkUsUUFDYjlFLE9BQU9DLEtBQUssQ0FBQytFLFFBQ1pyRixNQUFNQyxPQUFPLENBQUNWLFVBQVVBLE1BQU1pQixNQUFNLEtBQUssQ0FBQyxHQUM3QztRQUNBLE9BQU9WLEVBQUU7SUFDWDtJQUVBLElBQUksQUFBQ1AsS0FBSyxDQUFDLEVBQUUsSUFBSWMsT0FBT0MsS0FBSyxDQUFDNkUsUUFBVTVGLEtBQUssQ0FBQyxFQUFFLElBQUljLE9BQU9DLEtBQUssQ0FBQytFLE1BQU87UUFDdEUsT0FBT3ZGLEVBQUU7SUFDWDtJQUVBLE9BQU87QUFDVDtNQUVBLFdBQWU7SUFDYlo7SUFDQUc7SUFDQVI7SUFDQUY7SUFDQUc7SUFDQUw7SUFDQUc7SUFDQU47SUFDQUU7SUFDQWM7SUFDQUY7SUFDQUg7SUFDQUY7SUFDQUk7SUFDQVo7SUFDQUc7SUFDQU07QUFDRiJ9
448
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9maWVsZHMvdmFsaWRhdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSaWNoVGV4dEFkYXB0ZXIgfSBmcm9tICcuLi9leHBvcnRzL3R5cGVzJ1xuaW1wb3J0IHR5cGUge1xuICBBcnJheUZpZWxkLFxuICBCbG9ja0ZpZWxkLFxuICBDaGVja2JveEZpZWxkLFxuICBDb2RlRmllbGQsXG4gIERhdGVGaWVsZCxcbiAgRW1haWxGaWVsZCxcbiAgSlNPTkZpZWxkLFxuICBOdW1iZXJGaWVsZCxcbiAgUG9pbnRGaWVsZCxcbiAgUmFkaW9GaWVsZCxcbiAgUmVsYXRpb25zaGlwRmllbGQsXG4gIFJlbGF0aW9uc2hpcFZhbHVlLFxuICBSaWNoVGV4dEZpZWxkLFxuICBTZWxlY3RGaWVsZCxcbiAgVGV4dEZpZWxkLFxuICBUZXh0YXJlYUZpZWxkLFxuICBVcGxvYWRGaWVsZCxcbiAgVmFsaWRhdGUsXG59IGZyb20gJy4vY29uZmlnL3R5cGVzJ1xuXG5pbXBvcnQgY2FuVXNlRE9NIGZyb20gJy4uL3V0aWxpdGllcy9jYW5Vc2VET00nXG5pbXBvcnQgeyBnZXRJRFR5cGUgfSBmcm9tICcuLi91dGlsaXRpZXMvZ2V0SURUeXBlJ1xuaW1wb3J0IHsgaXNOdW1iZXIgfSBmcm9tICcuLi91dGlsaXRpZXMvaXNOdW1iZXInXG5pbXBvcnQgeyBpc1ZhbGlkSUQgfSBmcm9tICcuLi91dGlsaXRpZXMvaXNWYWxpZElEJ1xuaW1wb3J0IHsgZmllbGRBZmZlY3RzRGF0YSB9IGZyb20gJy4vY29uZmlnL3R5cGVzJ1xuXG5leHBvcnQgY29uc3QgdGV4dDogVmFsaWRhdGU8dW5rbm93biwgdW5rbm93biwgVGV4dEZpZWxkPiA9IChcbiAgdmFsdWU6IHN0cmluZyxcbiAgeyBjb25maWcsIG1heExlbmd0aDogZmllbGRNYXhMZW5ndGgsIG1pbkxlbmd0aCwgcmVxdWlyZWQsIHQgfSxcbikgPT4ge1xuICBsZXQgbWF4TGVuZ3RoOiBudW1iZXJcblxuICBpZiAodHlwZW9mIGNvbmZpZz8uZGVmYXVsdE1heFRleHRMZW5ndGggPT09ICdudW1iZXInKSBtYXhMZW5ndGggPSBjb25maWcuZGVmYXVsdE1heFRleHRMZW5ndGhcbiAgaWYgKHR5cGVvZiBmaWVsZE1heExlbmd0aCA9PT0gJ251bWJlcicpIG1heExlbmd0aCA9IGZpZWxkTWF4TGVuZ3RoXG4gIGlmICh2YWx1ZSAmJiBtYXhMZW5ndGggJiYgdmFsdWUubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246c2hvcnRlclRoYW5NYXgnLCB7IG1heExlbmd0aCB9KVxuICB9XG5cbiAgaWYgKHZhbHVlICYmIG1pbkxlbmd0aCAmJiB2YWx1ZT8ubGVuZ3RoIDwgbWluTGVuZ3RoKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246bG9uZ2VyVGhhbk1pbicsIHsgbWluTGVuZ3RoIH0pXG4gIH1cblxuICBpZiAocmVxdWlyZWQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZT8ubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpyZXF1aXJlZCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IHBhc3N3b3JkOiBWYWxpZGF0ZTx1bmtub3duLCB1bmtub3duLCBUZXh0RmllbGQ+ID0gKFxuICB2YWx1ZTogc3RyaW5nLFxuICB7IGNvbmZpZywgbWF4TGVuZ3RoOiBmaWVsZE1heExlbmd0aCwgbWluTGVuZ3RoLCBwYXlsb2FkLCByZXF1aXJlZCwgdCB9LFxuKSA9PiB7XG4gIGxldCBtYXhMZW5ndGg6IG51bWJlclxuXG4gIGlmICh0eXBlb2YgY29uZmlnPy5kZWZhdWx0TWF4VGV4dExlbmd0aCA9PT0gJ251bWJlcicpIG1heExlbmd0aCA9IGNvbmZpZy5kZWZhdWx0TWF4VGV4dExlbmd0aFxuICBpZiAodHlwZW9mIGZpZWxkTWF4TGVuZ3RoID09PSAnbnVtYmVyJykgbWF4TGVuZ3RoID0gZmllbGRNYXhMZW5ndGhcblxuICBpZiAodmFsdWUgJiYgbWF4TGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOnNob3J0ZXJUaGFuTWF4JywgeyBtYXhMZW5ndGggfSlcbiAgfVxuXG4gIGlmICh2YWx1ZSAmJiBtaW5MZW5ndGggJiYgdmFsdWUubGVuZ3RoIDwgbWluTGVuZ3RoKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246bG9uZ2VyVGhhbk1pbicsIHsgbWluTGVuZ3RoIH0pXG4gIH1cblxuICBpZiAocmVxdWlyZWQgJiYgIXZhbHVlKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246cmVxdWlyZWQnKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IGVtYWlsOiBWYWxpZGF0ZTx1bmtub3duLCB1bmtub3duLCBFbWFpbEZpZWxkPiA9ICh2YWx1ZTogc3RyaW5nLCB7IHJlcXVpcmVkLCB0IH0pID0+IHtcbiAgaWYgKCh2YWx1ZSAmJiAhL1xcU1teXFxzQF0qQFxcUytcXC5cXFMrLy50ZXN0KHZhbHVlKSkgfHwgKCF2YWx1ZSAmJiByZXF1aXJlZCkpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjplbWFpbEFkZHJlc3MnKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IHRleHRhcmVhOiBWYWxpZGF0ZTx1bmtub3duLCB1bmtub3duLCBUZXh0YXJlYUZpZWxkPiA9IChcbiAgdmFsdWU6IHN0cmluZyxcbiAgeyBjb25maWcsIG1heExlbmd0aDogZmllbGRNYXhMZW5ndGgsIG1pbkxlbmd0aCwgcGF5bG9hZCwgcmVxdWlyZWQsIHQgfSxcbikgPT4ge1xuICBsZXQgbWF4TGVuZ3RoOiBudW1iZXJcblxuICBpZiAodHlwZW9mIGNvbmZpZz8uZGVmYXVsdE1heFRleHRMZW5ndGggPT09ICdudW1iZXInKSBtYXhMZW5ndGggPSBjb25maWcuZGVmYXVsdE1heFRleHRMZW5ndGhcbiAgaWYgKHR5cGVvZiBmaWVsZE1heExlbmd0aCA9PT0gJ251bWJlcicpIG1heExlbmd0aCA9IGZpZWxkTWF4TGVuZ3RoXG4gIGlmICh2YWx1ZSAmJiBtYXhMZW5ndGggJiYgdmFsdWUubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246c2hvcnRlclRoYW5NYXgnLCB7IG1heExlbmd0aCB9KVxuICB9XG5cbiAgaWYgKHZhbHVlICYmIG1pbkxlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPCBtaW5MZW5ndGgpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpsb25nZXJUaGFuTWluJywgeyBtaW5MZW5ndGggfSlcbiAgfVxuXG4gIGlmIChyZXF1aXJlZCAmJiAhdmFsdWUpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpyZXF1aXJlZCcpXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgY29kZTogVmFsaWRhdGU8dW5rbm93biwgdW5rbm93biwgQ29kZUZpZWxkPiA9ICh2YWx1ZTogc3RyaW5nLCB7IHJlcXVpcmVkLCB0IH0pID0+IHtcbiAgaWYgKHJlcXVpcmVkICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpyZXF1aXJlZCcpXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QganNvbjogVmFsaWRhdGU8dW5rbm93biwgdW5rbm93biwgSlNPTkZpZWxkICYgeyBqc29uRXJyb3I/OiBzdHJpbmcgfT4gPSAoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIHsganNvbkVycm9yLCByZXF1aXJlZCwgdCB9LFxuKSA9PiB7XG4gIGlmIChyZXF1aXJlZCAmJiAhdmFsdWUpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpyZXF1aXJlZCcpXG4gIH1cblxuICBpZiAoanNvbkVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjppbnZhbGlkSW5wdXQnKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IGNoZWNrYm94OiBWYWxpZGF0ZTx1bmtub3duLCB1bmtub3duLCBDaGVja2JveEZpZWxkPiA9IChcbiAgdmFsdWU6IGJvb2xlYW4sXG4gIHsgcmVxdWlyZWQsIHQgfSxcbikgPT4ge1xuICBpZiAoKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB8fCAocmVxdWlyZWQgJiYgdHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbicpKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246dHJ1ZU9yRmFsc2UnKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IGRhdGU6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIERhdGVGaWVsZD4gPSAodmFsdWUsIHsgcmVxdWlyZWQsIHQgfSkgPT4ge1xuICBpZiAodmFsdWUgJiYgIWlzTmFOKERhdGUucGFyc2UodmFsdWUudG9TdHJpbmcoKSkpKSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUtbGluZSAqL1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAodmFsdWUpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpub3RWYWxpZERhdGUnLCB7IHZhbHVlIH0pXG4gIH1cblxuICBpZiAocmVxdWlyZWQpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpyZXF1aXJlZCcpXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgcmljaFRleHQ6IFZhbGlkYXRlPG9iamVjdCwgdW5rbm93biwgUmljaFRleHRGaWVsZCwgUmljaFRleHRGaWVsZD4gPSBhc3luYyAoXG4gIHZhbHVlLFxuICBvcHRpb25zLFxuKSA9PiB7XG4gIGNvbnN0IGVkaXRvcjogUmljaFRleHRBZGFwdGVyID0gb3B0aW9ucz8uZWRpdG9yXG5cbiAgcmV0dXJuIGF3YWl0IGVkaXRvci52YWxpZGF0ZSh2YWx1ZSwgb3B0aW9ucylcbn1cblxuY29uc3QgdmFsaWRhdGVBcnJheUxlbmd0aDogYW55ID0gKFxuICB2YWx1ZSxcbiAgb3B0aW9uczoge1xuICAgIG1heFJvd3M/OiBudW1iZXJcbiAgICBtaW5Sb3dzPzogbnVtYmVyXG4gICAgcmVxdWlyZWQ/OiBib29sZWFuXG4gICAgdDogKGtleTogc3RyaW5nLCBvcHRpb25zPzogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfCBzdHJpbmcgfSkgPT4gc3RyaW5nXG4gIH0sXG4pID0+IHtcbiAgY29uc3QgeyBtYXhSb3dzLCBtaW5Sb3dzLCByZXF1aXJlZCwgdCB9ID0gb3B0aW9uc1xuXG4gIGNvbnN0IGFycmF5TGVuZ3RoID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5sZW5ndGggOiAwXG5cbiAgaWYgKCFyZXF1aXJlZCAmJiBhcnJheUxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWVcblxuICBpZiAobWluUm93cyAmJiBhcnJheUxlbmd0aCA8IG1pblJvd3MpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpyZXF1aXJlc0F0TGVhc3QnLCB7IGNvdW50OiBtaW5Sb3dzLCBsYWJlbDogdCgncm93cycpIH0pXG4gIH1cblxuICBpZiAobWF4Um93cyAmJiBhcnJheUxlbmd0aCA+IG1heFJvd3MpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpyZXF1aXJlc05vTW9yZVRoYW4nLCB7IGNvdW50OiBtYXhSb3dzLCBsYWJlbDogdCgncm93cycpIH0pXG4gIH1cblxuICBpZiAocmVxdWlyZWQgJiYgIWFycmF5TGVuZ3RoKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246cmVxdWlyZXNBdExlYXN0JywgeyBjb3VudDogMSwgbGFiZWw6IHQoJ3JvdycpIH0pXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgbnVtYmVyOiBWYWxpZGF0ZTx1bmtub3duLCB1bmtub3duLCBOdW1iZXJGaWVsZD4gPSAoXG4gIHZhbHVlOiBudW1iZXIgfCBudW1iZXJbXSxcbiAgeyBoYXNNYW55LCBtYXgsIG1heFJvd3MsIG1pbiwgbWluUm93cywgcmVxdWlyZWQsIHQgfSxcbikgPT4ge1xuICBpZiAoaGFzTWFueSA9PT0gdHJ1ZSkge1xuICAgIGNvbnN0IGxlbmd0aFZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZUFycmF5TGVuZ3RoKHZhbHVlLCB7IG1heFJvd3MsIG1pblJvd3MsIHJlcXVpcmVkLCB0IH0pXG4gICAgaWYgKHR5cGVvZiBsZW5ndGhWYWxpZGF0aW9uUmVzdWx0ID09PSAnc3RyaW5nJykgcmV0dXJuIGxlbmd0aFZhbGlkYXRpb25SZXN1bHRcbiAgfVxuXG4gIGlmICghdmFsdWUgJiYgcmVxdWlyZWQpIHJldHVybiB0KCd2YWxpZGF0aW9uOnJlcXVpcmVkJylcbiAgaWYgKCF2YWx1ZSAmJiAhcmVxdWlyZWQpIHJldHVybiB0cnVlXG5cbiAgY29uc3QgbnVtYmVyc1RvVmFsaWRhdGU6IG51bWJlcltdID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV1cblxuICBmb3IgKGNvbnN0IG51bWJlciBvZiBudW1iZXJzVG9WYWxpZGF0ZSkge1xuICAgIGlmICghaXNOdW1iZXIobnVtYmVyKSkgcmV0dXJuIHQoJ3ZhbGlkYXRpb246ZW50ZXJOdW1iZXInKVxuXG4gICAgY29uc3QgbnVtYmVyVmFsdWUgPSBwYXJzZUZsb2F0KG51bWJlciBhcyB1bmtub3duIGFzIHN0cmluZylcblxuICAgIGlmICh0eXBlb2YgbWF4ID09PSAnbnVtYmVyJyAmJiBudW1iZXJWYWx1ZSA+IG1heCkge1xuICAgICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246Z3JlYXRlclRoYW5NYXgnLCB7IGxhYmVsOiB0KCd2YWx1ZScpLCBtYXgsIHZhbHVlIH0pXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBtaW4gPT09ICdudW1iZXInICYmIG51bWJlclZhbHVlIDwgbWluKSB7XG4gICAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpsZXNzVGhhbk1pbicsIHsgbGFiZWw6IHQoJ3ZhbHVlJyksIG1pbiwgdmFsdWUgfSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgYXJyYXk6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIEFycmF5RmllbGQ+ID0gKFxuICB2YWx1ZSxcbiAgeyBtYXhSb3dzLCBtaW5Sb3dzLCByZXF1aXJlZCwgdCB9LFxuKSA9PiB7XG4gIHJldHVybiB2YWxpZGF0ZUFycmF5TGVuZ3RoKHZhbHVlLCB7IG1heFJvd3MsIG1pblJvd3MsIHJlcXVpcmVkLCB0IH0pXG59XG5cbmV4cG9ydCBjb25zdCBibG9ja3M6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIEJsb2NrRmllbGQ+ID0gKFxuICB2YWx1ZSxcbiAgeyBtYXhSb3dzLCBtaW5Sb3dzLCByZXF1aXJlZCwgdCB9LFxuKSA9PiB7XG4gIHJldHVybiB2YWxpZGF0ZUFycmF5TGVuZ3RoKHZhbHVlLCB7IG1heFJvd3MsIG1pblJvd3MsIHJlcXVpcmVkLCB0IH0pXG59XG5cbmNvbnN0IHZhbGlkYXRlRmlsdGVyT3B0aW9uczogVmFsaWRhdGUgPSBhc3luYyAoXG4gIHZhbHVlLFxuICB7IGlkLCBkYXRhLCBmaWx0ZXJPcHRpb25zLCBwYXlsb2FkLCByZWxhdGlvblRvLCByZXEsIHNpYmxpbmdEYXRhLCB0LCB1c2VyIH0sXG4pID0+IHtcbiAgaWYgKCFjYW5Vc2VET00gJiYgdHlwZW9mIGZpbHRlck9wdGlvbnMgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlKSB7XG4gICAgY29uc3Qgb3B0aW9uczoge1xuICAgICAgW2NvbGxlY3Rpb246IHN0cmluZ106IChudW1iZXIgfCBzdHJpbmcpW11cbiAgICB9ID0ge31cblxuICAgIGNvbnN0IGNvbGxlY3Rpb25zID0gdHlwZW9mIHJlbGF0aW9uVG8gPT09ICdzdHJpbmcnID8gW3JlbGF0aW9uVG9dIDogcmVsYXRpb25Ub1xuICAgIGNvbnN0IHZhbHVlcyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdXG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGNvbGxlY3Rpb25zLm1hcChhc3luYyAoY29sbGVjdGlvbikgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25GaWx0ZXIgPVxuICAgICAgICAgIHR5cGVvZiBmaWx0ZXJPcHRpb25zID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGF3YWl0IGZpbHRlck9wdGlvbnMoe1xuICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgcmVsYXRpb25UbzogY29sbGVjdGlvbixcbiAgICAgICAgICAgICAgICBzaWJsaW5nRGF0YSxcbiAgICAgICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiBmaWx0ZXJPcHRpb25zXG5cbiAgICAgICAgY29uc3QgdmFsdWVJRHM6IChudW1iZXIgfCBzdHJpbmcpW10gPSBbXVxuXG4gICAgICAgIHZhbHVlcy5mb3JFYWNoKCh2YWwpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsPy52YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWVJRHMucHVzaCh2YWwudmFsdWUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB2YWx1ZUlEcy5wdXNoKHZhbClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHZhbHVlSURzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBmaW5kV2hlcmUgPSB7XG4gICAgICAgICAgICBhbmQ6IFt7IGlkOiB7IGluOiB2YWx1ZUlEcyB9IH1dLFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvcHRpb25GaWx0ZXIpIGZpbmRXaGVyZS5hbmQucHVzaChvcHRpb25GaWx0ZXIpXG5cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXlsb2FkLmZpbmQoe1xuICAgICAgICAgICAgY29sbGVjdGlvbixcbiAgICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgICAgbGltaXQ6IDAsXG4gICAgICAgICAgICBwYWdpbmF0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgIHdoZXJlOiBmaW5kV2hlcmUsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIG9wdGlvbnNbY29sbGVjdGlvbl0gPSByZXN1bHQuZG9jcy5tYXAoKGRvYykgPT4gZG9jLmlkKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbnNbY29sbGVjdGlvbl0gPSBbXVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApXG5cbiAgICBjb25zdCBpbnZhbGlkUmVsYXRpb25zaGlwcyA9IHZhbHVlcy5maWx0ZXIoKHZhbCkgPT4ge1xuICAgICAgbGV0IGNvbGxlY3Rpb246IHN0cmluZ1xuICAgICAgbGV0IHJlcXVlc3RlZElEOiBudW1iZXIgfCBzdHJpbmdcblxuICAgICAgaWYgKHR5cGVvZiByZWxhdGlvblRvID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb2xsZWN0aW9uID0gcmVsYXRpb25Ub1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJlcXVlc3RlZElEID0gdmFsXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVsYXRpb25UbykgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsPy5yZWxhdGlvblRvKSB7XG4gICAgICAgIGNvbGxlY3Rpb24gPSB2YWwucmVsYXRpb25Ub1xuICAgICAgICByZXF1ZXN0ZWRJRCA9IHZhbC52YWx1ZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3B0aW9uc1tjb2xsZWN0aW9uXS5pbmRleE9mKHJlcXVlc3RlZElEKSA9PT0gLTFcbiAgICB9KVxuXG4gICAgaWYgKGludmFsaWRSZWxhdGlvbnNoaXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBpbnZhbGlkUmVsYXRpb25zaGlwcy5yZWR1Y2UoKGVyciwgaW52YWxpZCwgaSkgPT4ge1xuICAgICAgICByZXR1cm4gYCR7ZXJyfSAke0pTT04uc3RyaW5naWZ5KGludmFsaWQpfSR7XG4gICAgICAgICAgaW52YWxpZFJlbGF0aW9uc2hpcHMubGVuZ3RoID09PSBpICsgMSA/ICcsJyA6ICcnXG4gICAgICAgIH0gYFxuICAgICAgfSwgdCgndmFsaWRhdGlvbjppbnZhbGlkU2VsZWN0aW9ucycpKSBhcyBzdHJpbmdcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IHVwbG9hZDogVmFsaWRhdGU8dW5rbm93biwgdW5rbm93biwgVXBsb2FkRmllbGQ+ID0gKHZhbHVlOiBzdHJpbmcsIG9wdGlvbnMpID0+IHtcbiAgaWYgKCF2YWx1ZSAmJiBvcHRpb25zLnJlcXVpcmVkKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMudCgndmFsaWRhdGlvbjpyZXF1aXJlZCcpXG4gIH1cblxuICBpZiAoIWNhblVzZURPTSAmJiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgY29uc3QgaWRGaWVsZCA9IG9wdGlvbnM/LmNvbmZpZz8uY29sbGVjdGlvbnNcbiAgICAgID8uZmluZCgoY29sbGVjdGlvbikgPT4gY29sbGVjdGlvbi5zbHVnID09PSBvcHRpb25zLnJlbGF0aW9uVG8pXG4gICAgICA/LmZpZWxkcz8uZmluZCgoZmllbGQpID0+IGZpZWxkQWZmZWN0c0RhdGEoZmllbGQpICYmIGZpZWxkLm5hbWUgPT09ICdpZCcpXG5cbiAgICBjb25zdCB0eXBlID0gZ2V0SURUeXBlKGlkRmllbGQsIG9wdGlvbnM/LnBheWxvYWQ/LmRiPy5kZWZhdWx0SURUeXBlKVxuXG4gICAgaWYgKCFpc1ZhbGlkSUQodmFsdWUsIHR5cGUpKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy50KCd2YWxpZGF0aW9uOnZhbGlkVXBsb2FkSUQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2YWxpZGF0ZUZpbHRlck9wdGlvbnModmFsdWUsIG9wdGlvbnMpXG59XG5cbmV4cG9ydCBjb25zdCByZWxhdGlvbnNoaXA6IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIFJlbGF0aW9uc2hpcEZpZWxkPiA9IGFzeW5jIChcbiAgdmFsdWU6IFJlbGF0aW9uc2hpcFZhbHVlLFxuICBvcHRpb25zLFxuKSA9PiB7XG4gIGNvbnN0IHsgY29uZmlnLCBtYXhSb3dzLCBtaW5Sb3dzLCBwYXlsb2FkLCByZWxhdGlvblRvLCByZXF1aXJlZCwgdCB9ID0gb3B0aW9uc1xuXG4gIGlmICgoIXZhbHVlIHx8IChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApKSAmJiByZXF1aXJlZCkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOnJlcXVpcmVkJylcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgaWYgKG1pblJvd3MgJiYgdmFsdWUubGVuZ3RoIDwgbWluUm93cykge1xuICAgICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246bGVzc1RoYW5NaW4nLCB7IGxhYmVsOiB0KCdyb3dzJyksIG1pbjogbWluUm93cywgdmFsdWU6IHZhbHVlLmxlbmd0aCB9KVxuICAgIH1cblxuICAgIGlmIChtYXhSb3dzICYmIHZhbHVlLmxlbmd0aCA+IG1heFJvd3MpIHtcbiAgICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOmdyZWF0ZXJUaGFuTWF4JywgeyBsYWJlbDogdCgncm93cycpLCBtYXg6IG1heFJvd3MsIHZhbHVlOiB2YWx1ZS5sZW5ndGggfSlcbiAgICB9XG4gIH1cblxuICBpZiAoIWNhblVzZURPTSAmJiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgY29uc3QgdmFsdWVzID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV1cblxuICAgIGNvbnN0IGludmFsaWRSZWxhdGlvbnNoaXBzID0gdmFsdWVzLmZpbHRlcigodmFsKSA9PiB7XG4gICAgICBsZXQgY29sbGVjdGlvblNsdWc6IHN0cmluZ1xuICAgICAgbGV0IHJlcXVlc3RlZElEXG5cbiAgICAgIGlmICh0eXBlb2YgcmVsYXRpb25UbyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29sbGVjdGlvblNsdWcgPSByZWxhdGlvblRvXG5cbiAgICAgICAgLy8gY3VzdG9tIGlkXG4gICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICByZXF1ZXN0ZWRJRCA9IHZhbFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlbGF0aW9uVG8pICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbD8ucmVsYXRpb25Ubykge1xuICAgICAgICBjb2xsZWN0aW9uU2x1ZyA9IHZhbC5yZWxhdGlvblRvXG4gICAgICAgIHJlcXVlc3RlZElEID0gdmFsLnZhbHVlXG4gICAgICB9XG5cbiAgICAgIGlmIChyZXF1ZXN0ZWRJRCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlXG5cbiAgICAgIGNvbnN0IGlkRmllbGQgPSBjb25maWc/LmNvbGxlY3Rpb25zXG4gICAgICAgID8uZmluZCgoY29sbGVjdGlvbikgPT4gY29sbGVjdGlvbi5zbHVnID09PSBjb2xsZWN0aW9uU2x1ZylcbiAgICAgICAgPy5maWVsZHM/LmZpbmQoKGZpZWxkKSA9PiBmaWVsZEFmZmVjdHNEYXRhKGZpZWxkKSAmJiBmaWVsZC5uYW1lID09PSAnaWQnKVxuXG4gICAgICBjb25zdCB0eXBlID0gZ2V0SURUeXBlKGlkRmllbGQsIHBheWxvYWQ/LmRiPy5kZWZhdWx0SURUeXBlKVxuXG4gICAgICByZXR1cm4gIWlzVmFsaWRJRChyZXF1ZXN0ZWRJRCwgdHlwZSlcbiAgICB9KVxuXG4gICAgaWYgKGludmFsaWRSZWxhdGlvbnNoaXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBgVGhpcyByZWxhdGlvbnNoaXAgZmllbGQgaGFzIHRoZSBmb2xsb3dpbmcgaW52YWxpZCByZWxhdGlvbnNoaXBzOiAke2ludmFsaWRSZWxhdGlvbnNoaXBzXG4gICAgICAgIC5tYXAoKGVyciwgaW52YWxpZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgJHtlcnJ9ICR7SlNPTi5zdHJpbmdpZnkoaW52YWxpZCl9YFxuICAgICAgICB9KVxuICAgICAgICAuam9pbignLCAnKX1gXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlRmlsdGVyT3B0aW9ucyh2YWx1ZSwgb3B0aW9ucylcbn1cblxuZXhwb3J0IGNvbnN0IHNlbGVjdDogVmFsaWRhdGU8dW5rbm93biwgdW5rbm93biwgU2VsZWN0RmllbGQ+ID0gKFxuICB2YWx1ZSxcbiAgeyBoYXNNYW55LCBvcHRpb25zLCByZXF1aXJlZCwgdCB9LFxuKSA9PiB7XG4gIGlmIChcbiAgICBBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgIHZhbHVlLnNvbWUoXG4gICAgICAoaW5wdXQpID0+XG4gICAgICAgICFvcHRpb25zLnNvbWUoXG4gICAgICAgICAgKG9wdGlvbikgPT4gb3B0aW9uID09PSBpbnB1dCB8fCAodHlwZW9mIG9wdGlvbiAhPT0gJ3N0cmluZycgJiYgb3B0aW9uPy52YWx1ZSA9PT0gaW5wdXQpLFxuICAgICAgICApLFxuICAgIClcbiAgKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246aW52YWxpZFNlbGVjdGlvbicpXG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICFvcHRpb25zLnNvbWUoXG4gICAgICAob3B0aW9uKSA9PiBvcHRpb24gPT09IHZhbHVlIHx8ICh0eXBlb2Ygb3B0aW9uICE9PSAnc3RyaW5nJyAmJiBvcHRpb24udmFsdWUgPT09IHZhbHVlKSxcbiAgICApXG4gICkge1xuICAgIHJldHVybiB0KCd2YWxpZGF0aW9uOmludmFsaWRTZWxlY3Rpb24nKVxuICB9XG5cbiAgaWYgKFxuICAgIHJlcXVpcmVkICYmXG4gICAgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgIHZhbHVlID09PSBudWxsIHx8XG4gICAgICAoaGFzTWFueSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiAodmFsdWUgYXMgW10pPy5sZW5ndGggPT09IDApKVxuICApIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjpyZXF1aXJlZCcpXG4gIH1cblxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgcmFkaW86IFZhbGlkYXRlPHVua25vd24sIHVua25vd24sIFJhZGlvRmllbGQ+ID0gKHZhbHVlLCB7IG9wdGlvbnMsIHJlcXVpcmVkLCB0IH0pID0+IHtcbiAgaWYgKHZhbHVlKSB7XG4gICAgY29uc3QgdmFsdWVNYXRjaGVzT3B0aW9uID0gb3B0aW9ucy5zb21lKFxuICAgICAgKG9wdGlvbikgPT4gb3B0aW9uID09PSB2YWx1ZSB8fCAodHlwZW9mIG9wdGlvbiAhPT0gJ3N0cmluZycgJiYgb3B0aW9uLnZhbHVlID09PSB2YWx1ZSksXG4gICAgKVxuICAgIHJldHVybiB2YWx1ZU1hdGNoZXNPcHRpb24gfHwgdCgndmFsaWRhdGlvbjppbnZhbGlkU2VsZWN0aW9uJylcbiAgfVxuXG4gIHJldHVybiByZXF1aXJlZCA/IHQoJ3ZhbGlkYXRpb246cmVxdWlyZWQnKSA6IHRydWVcbn1cblxuZXhwb3J0IGNvbnN0IHBvaW50OiBWYWxpZGF0ZTx1bmtub3duLCB1bmtub3duLCBQb2ludEZpZWxkPiA9IChcbiAgdmFsdWU6IFtudW1iZXIgfCBzdHJpbmcsIG51bWJlciB8IHN0cmluZ10gPSBbJycsICcnXSxcbiAgeyByZXF1aXJlZCwgdCB9LFxuKSA9PiB7XG4gIGNvbnN0IGxuZyA9IHBhcnNlRmxvYXQoU3RyaW5nKHZhbHVlWzBdKSlcbiAgY29uc3QgbGF0ID0gcGFyc2VGbG9hdChTdHJpbmcodmFsdWVbMV0pKVxuICBpZiAoXG4gICAgcmVxdWlyZWQgJiZcbiAgICAoKHZhbHVlWzBdICYmIHZhbHVlWzFdICYmIHR5cGVvZiBsbmcgIT09ICdudW1iZXInICYmIHR5cGVvZiBsYXQgIT09ICdudW1iZXInKSB8fFxuICAgICAgTnVtYmVyLmlzTmFOKGxuZykgfHxcbiAgICAgIE51bWJlci5pc05hTihsYXQpIHx8XG4gICAgICAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoICE9PSAyKSlcbiAgKSB7XG4gICAgcmV0dXJuIHQoJ3ZhbGlkYXRpb246cmVxdWlyZXNUd29OdW1iZXJzJylcbiAgfVxuXG4gIGlmICgodmFsdWVbMV0gJiYgTnVtYmVyLmlzTmFOKGxuZykpIHx8ICh2YWx1ZVswXSAmJiBOdW1iZXIuaXNOYU4obGF0KSkpIHtcbiAgICByZXR1cm4gdCgndmFsaWRhdGlvbjppbnZhbGlkSW5wdXQnKVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBhcnJheSxcbiAgYmxvY2tzLFxuICBjaGVja2JveCxcbiAgY29kZSxcbiAgZGF0ZSxcbiAgZW1haWwsXG4gIGpzb24sXG4gIG51bWJlcixcbiAgcGFzc3dvcmQsXG4gIHBvaW50LFxuICByYWRpbyxcbiAgcmVsYXRpb25zaGlwLFxuICByaWNoVGV4dCxcbiAgc2VsZWN0LFxuICB0ZXh0LFxuICB0ZXh0YXJlYSxcbiAgdXBsb2FkLFxufVxuIl0sIm5hbWVzIjpbInRleHQiLCJwYXNzd29yZCIsImVtYWlsIiwidGV4dGFyZWEiLCJjb2RlIiwianNvbiIsImNoZWNrYm94IiwiZGF0ZSIsInJpY2hUZXh0IiwibnVtYmVyIiwiYXJyYXkiLCJibG9ja3MiLCJ1cGxvYWQiLCJyZWxhdGlvbnNoaXAiLCJzZWxlY3QiLCJyYWRpbyIsInBvaW50IiwidmFsdWUiLCJjb25maWciLCJtYXhMZW5ndGgiLCJmaWVsZE1heExlbmd0aCIsIm1pbkxlbmd0aCIsInJlcXVpcmVkIiwidCIsImRlZmF1bHRNYXhUZXh0TGVuZ3RoIiwibGVuZ3RoIiwicGF5bG9hZCIsInRlc3QiLCJ1bmRlZmluZWQiLCJqc29uRXJyb3IiLCJpc05hTiIsIkRhdGUiLCJwYXJzZSIsInRvU3RyaW5nIiwib3B0aW9ucyIsImVkaXRvciIsInZhbGlkYXRlIiwidmFsaWRhdGVBcnJheUxlbmd0aCIsIm1heFJvd3MiLCJtaW5Sb3dzIiwiYXJyYXlMZW5ndGgiLCJBcnJheSIsImlzQXJyYXkiLCJjb3VudCIsImxhYmVsIiwiaGFzTWFueSIsIm1heCIsIm1pbiIsImxlbmd0aFZhbGlkYXRpb25SZXN1bHQiLCJudW1iZXJzVG9WYWxpZGF0ZSIsImlzTnVtYmVyIiwibnVtYmVyVmFsdWUiLCJwYXJzZUZsb2F0IiwidmFsaWRhdGVGaWx0ZXJPcHRpb25zIiwiaWQiLCJkYXRhIiwiZmlsdGVyT3B0aW9ucyIsInJlbGF0aW9uVG8iLCJyZXEiLCJzaWJsaW5nRGF0YSIsInVzZXIiLCJjYW5Vc2VET00iLCJjb2xsZWN0aW9ucyIsInZhbHVlcyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJjb2xsZWN0aW9uIiwib3B0aW9uRmlsdGVyIiwidmFsdWVJRHMiLCJmb3JFYWNoIiwidmFsIiwicHVzaCIsImZpbmRXaGVyZSIsImFuZCIsImluIiwicmVzdWx0IiwiZmluZCIsImRlcHRoIiwibGltaXQiLCJwYWdpbmF0aW9uIiwid2hlcmUiLCJkb2NzIiwiZG9jIiwiaW52YWxpZFJlbGF0aW9uc2hpcHMiLCJmaWx0ZXIiLCJyZXF1ZXN0ZWRJRCIsImluZGV4T2YiLCJyZWR1Y2UiLCJlcnIiLCJpbnZhbGlkIiwiaSIsIkpTT04iLCJzdHJpbmdpZnkiLCJpZEZpZWxkIiwic2x1ZyIsImZpZWxkcyIsImZpZWxkIiwiZmllbGRBZmZlY3RzRGF0YSIsIm5hbWUiLCJ0eXBlIiwiZ2V0SURUeXBlIiwiZGIiLCJkZWZhdWx0SURUeXBlIiwiaXNWYWxpZElEIiwiY29sbGVjdGlvblNsdWciLCJqb2luIiwic29tZSIsImlucHV0Iiwib3B0aW9uIiwidmFsdWVNYXRjaGVzT3B0aW9uIiwibG5nIiwiU3RyaW5nIiwibGF0IiwiTnVtYmVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQTRCYUEsSUFBSTtlQUFKQTs7SUF5QkFDLFFBQVE7ZUFBUkE7O0lBd0JBQyxLQUFLO2VBQUxBOztJQVFBQyxRQUFRO2VBQVJBOztJQXVCQUMsSUFBSTtlQUFKQTs7SUFRQUMsSUFBSTtlQUFKQTs7SUFlQUMsUUFBUTtlQUFSQTs7SUFXQUMsSUFBSTtlQUFKQTs7SUFpQkFDLFFBQVE7ZUFBUkE7O0lBdUNBQyxNQUFNO2VBQU5BOztJQStCQUMsS0FBSztlQUFMQTs7SUFPQUMsTUFBTTtlQUFOQTs7SUFxR0FDLE1BQU07ZUFBTkE7O0lBb0JBQyxZQUFZO2VBQVpBOztJQWdFQUMsTUFBTTtlQUFOQTs7SUFxQ0FDLEtBQUs7ZUFBTEE7O0lBV0FDLEtBQUs7ZUFBTEE7O0lBdUJiLE9Ba0JDO2VBbEJEOzs7a0VBdGRzQjsyQkFDSTswQkFDRDsyQkFDQzt1QkFDTzs7Ozs7O0FBRTFCLE1BQU1oQixPQUE4QyxDQUN6RGlCLE9BQ0EsRUFBRUMsTUFBTSxFQUFFQyxXQUFXQyxjQUFjLEVBQUVDLFNBQVMsRUFBRUMsUUFBUSxFQUFFQyxDQUFDLEVBQUU7SUFFN0QsSUFBSUo7SUFFSixJQUFJLE9BQU9ELFFBQVFNLHlCQUF5QixVQUFVTCxZQUFZRCxPQUFPTSxvQkFBb0I7SUFDN0YsSUFBSSxPQUFPSixtQkFBbUIsVUFBVUQsWUFBWUM7SUFDcEQsSUFBSUgsU0FBU0UsYUFBYUYsTUFBTVEsTUFBTSxHQUFHTixXQUFXO1FBQ2xELE9BQU9JLEVBQUUsNkJBQTZCO1lBQUVKO1FBQVU7SUFDcEQ7SUFFQSxJQUFJRixTQUFTSSxhQUFhSixPQUFPUSxTQUFTSixXQUFXO1FBQ25ELE9BQU9FLEVBQUUsNEJBQTRCO1lBQUVGO1FBQVU7SUFDbkQ7SUFFQSxJQUFJQyxVQUFVO1FBQ1osSUFBSSxPQUFPTCxVQUFVLFlBQVlBLE9BQU9RLFdBQVcsR0FBRztZQUNwRCxPQUFPRixFQUFFO1FBQ1g7SUFDRjtJQUVBLE9BQU87QUFDVDtBQUVPLE1BQU10QixXQUFrRCxDQUM3RGdCLE9BQ0EsRUFBRUMsTUFBTSxFQUFFQyxXQUFXQyxjQUFjLEVBQUVDLFNBQVMsRUFBRUssT0FBTyxFQUFFSixRQUFRLEVBQUVDLENBQUMsRUFBRTtJQUV0RSxJQUFJSjtJQUVKLElBQUksT0FBT0QsUUFBUU0seUJBQXlCLFVBQVVMLFlBQVlELE9BQU9NLG9CQUFvQjtJQUM3RixJQUFJLE9BQU9KLG1CQUFtQixVQUFVRCxZQUFZQztJQUVwRCxJQUFJSCxTQUFTRSxhQUFhRixNQUFNUSxNQUFNLEdBQUdOLFdBQVc7UUFDbEQsT0FBT0ksRUFBRSw2QkFBNkI7WUFBRUo7UUFBVTtJQUNwRDtJQUVBLElBQUlGLFNBQVNJLGFBQWFKLE1BQU1RLE1BQU0sR0FBR0osV0FBVztRQUNsRCxPQUFPRSxFQUFFLDRCQUE0QjtZQUFFRjtRQUFVO0lBQ25EO0lBRUEsSUFBSUMsWUFBWSxDQUFDTCxPQUFPO1FBQ3RCLE9BQU9NLEVBQUU7SUFDWDtJQUVBLE9BQU87QUFDVDtBQUVPLE1BQU1yQixRQUFnRCxDQUFDZSxPQUFlLEVBQUVLLFFBQVEsRUFBRUMsQ0FBQyxFQUFFO0lBQzFGLElBQUksQUFBQ04sU0FBUyxDQUFDLHFCQUFxQlUsSUFBSSxDQUFDVixVQUFZLENBQUNBLFNBQVNLLFVBQVc7UUFDeEUsT0FBT0MsRUFBRTtJQUNYO0lBRUEsT0FBTztBQUNUO0FBRU8sTUFBTXBCLFdBQXNELENBQ2pFYyxPQUNBLEVBQUVDLE1BQU0sRUFBRUMsV0FBV0MsY0FBYyxFQUFFQyxTQUFTLEVBQUVLLE9BQU8sRUFBRUosUUFBUSxFQUFFQyxDQUFDLEVBQUU7SUFFdEUsSUFBSUo7SUFFSixJQUFJLE9BQU9ELFFBQVFNLHlCQUF5QixVQUFVTCxZQUFZRCxPQUFPTSxvQkFBb0I7SUFDN0YsSUFBSSxPQUFPSixtQkFBbUIsVUFBVUQsWUFBWUM7SUFDcEQsSUFBSUgsU0FBU0UsYUFBYUYsTUFBTVEsTUFBTSxHQUFHTixXQUFXO1FBQ2xELE9BQU9JLEVBQUUsNkJBQTZCO1lBQUVKO1FBQVU7SUFDcEQ7SUFFQSxJQUFJRixTQUFTSSxhQUFhSixNQUFNUSxNQUFNLEdBQUdKLFdBQVc7UUFDbEQsT0FBT0UsRUFBRSw0QkFBNEI7WUFBRUY7UUFBVTtJQUNuRDtJQUVBLElBQUlDLFlBQVksQ0FBQ0wsT0FBTztRQUN0QixPQUFPTSxFQUFFO0lBQ1g7SUFFQSxPQUFPO0FBQ1Q7QUFFTyxNQUFNbkIsT0FBOEMsQ0FBQ2EsT0FBZSxFQUFFSyxRQUFRLEVBQUVDLENBQUMsRUFBRTtJQUN4RixJQUFJRCxZQUFZTCxVQUFVVyxXQUFXO1FBQ25DLE9BQU9MLEVBQUU7SUFDWDtJQUVBLE9BQU87QUFDVDtBQUVPLE1BQU1sQixPQUF1RSxDQUNsRlksT0FDQSxFQUFFWSxTQUFTLEVBQUVQLFFBQVEsRUFBRUMsQ0FBQyxFQUFFO0lBRTFCLElBQUlELFlBQVksQ0FBQ0wsT0FBTztRQUN0QixPQUFPTSxFQUFFO0lBQ1g7SUFFQSxJQUFJTSxjQUFjRCxXQUFXO1FBQzNCLE9BQU9MLEVBQUU7SUFDWDtJQUVBLE9BQU87QUFDVDtBQUVPLE1BQU1qQixXQUFzRCxDQUNqRVcsT0FDQSxFQUFFSyxRQUFRLEVBQUVDLENBQUMsRUFBRTtJQUVmLElBQUksQUFBQ04sU0FBUyxPQUFPQSxVQUFVLGFBQWVLLFlBQVksT0FBT0wsVUFBVSxXQUFZO1FBQ3JGLE9BQU9NLEVBQUU7SUFDWDtJQUVBLE9BQU87QUFDVDtBQUVPLE1BQU1oQixPQUE4QyxDQUFDVSxPQUFPLEVBQUVLLFFBQVEsRUFBRUMsQ0FBQyxFQUFFO0lBQ2hGLElBQUlOLFNBQVMsQ0FBQ2EsTUFBTUMsS0FBS0MsS0FBSyxDQUFDZixNQUFNZ0IsUUFBUSxNQUFNO1FBQ2pELHVCQUF1QixHQUN2QixPQUFPO0lBQ1Q7SUFFQSxJQUFJaEIsT0FBTztRQUNULE9BQU9NLEVBQUUsMkJBQTJCO1lBQUVOO1FBQU07SUFDOUM7SUFFQSxJQUFJSyxVQUFVO1FBQ1osT0FBT0MsRUFBRTtJQUNYO0lBRUEsT0FBTztBQUNUO0FBRU8sTUFBTWYsV0FBb0UsT0FDL0VTLE9BQ0FpQjtJQUVBLE1BQU1DLFNBQTBCRCxTQUFTQztJQUV6QyxPQUFPLE1BQU1BLE9BQU9DLFFBQVEsQ0FBQ25CLE9BQU9pQjtBQUN0QztBQUVBLE1BQU1HLHNCQUEyQixDQUMvQnBCLE9BQ0FpQjtJQU9BLE1BQU0sRUFBRUksT0FBTyxFQUFFQyxPQUFPLEVBQUVqQixRQUFRLEVBQUVDLENBQUMsRUFBRSxHQUFHVztJQUUxQyxNQUFNTSxjQUFjQyxNQUFNQyxPQUFPLENBQUN6QixTQUFTQSxNQUFNUSxNQUFNLEdBQUc7SUFFMUQsSUFBSSxDQUFDSCxZQUFZa0IsZ0JBQWdCLEdBQUcsT0FBTztJQUUzQyxJQUFJRCxXQUFXQyxjQUFjRCxTQUFTO1FBQ3BDLE9BQU9oQixFQUFFLDhCQUE4QjtZQUFFb0IsT0FBT0o7WUFBU0ssT0FBT3JCLEVBQUU7UUFBUTtJQUM1RTtJQUVBLElBQUllLFdBQVdFLGNBQWNGLFNBQVM7UUFDcEMsT0FBT2YsRUFBRSxpQ0FBaUM7WUFBRW9CLE9BQU9MO1lBQVNNLE9BQU9yQixFQUFFO1FBQVE7SUFDL0U7SUFFQSxJQUFJRCxZQUFZLENBQUNrQixhQUFhO1FBQzVCLE9BQU9qQixFQUFFLDhCQUE4QjtZQUFFb0IsT0FBTztZQUFHQyxPQUFPckIsRUFBRTtRQUFPO0lBQ3JFO0lBRUEsT0FBTztBQUNUO0FBRU8sTUFBTWQsU0FBa0QsQ0FDN0RRLE9BQ0EsRUFBRTRCLE9BQU8sRUFBRUMsR0FBRyxFQUFFUixPQUFPLEVBQUVTLEdBQUcsRUFBRVIsT0FBTyxFQUFFakIsUUFBUSxFQUFFQyxDQUFDLEVBQUU7SUFFcEQsSUFBSXNCLFlBQVksTUFBTTtRQUNwQixNQUFNRyx5QkFBeUJYLG9CQUFvQnBCLE9BQU87WUFBRXFCO1lBQVNDO1lBQVNqQjtZQUFVQztRQUFFO1FBQzFGLElBQUksT0FBT3lCLDJCQUEyQixVQUFVLE9BQU9BO0lBQ3pEO0lBRUEsSUFBSSxDQUFDL0IsU0FBU0ssVUFBVSxPQUFPQyxFQUFFO0lBQ2pDLElBQUksQ0FBQ04sU0FBUyxDQUFDSyxVQUFVLE9BQU87SUFFaEMsTUFBTTJCLG9CQUE4QlIsTUFBTUMsT0FBTyxDQUFDekIsU0FBU0EsUUFBUTtRQUFDQTtLQUFNO0lBRTFFLEtBQUssTUFBTVIsVUFBVXdDLGtCQUFtQjtRQUN0QyxJQUFJLENBQUNDLElBQUFBLGtCQUFRLEVBQUN6QyxTQUFTLE9BQU9jLEVBQUU7UUFFaEMsTUFBTTRCLGNBQWNDLFdBQVczQztRQUUvQixJQUFJLE9BQU9xQyxRQUFRLFlBQVlLLGNBQWNMLEtBQUs7WUFDaEQsT0FBT3ZCLEVBQUUsNkJBQTZCO2dCQUFFcUIsT0FBT3JCLEVBQUU7Z0JBQVV1QjtnQkFBSzdCO1lBQU07UUFDeEU7UUFFQSxJQUFJLE9BQU84QixRQUFRLFlBQVlJLGNBQWNKLEtBQUs7WUFDaEQsT0FBT3hCLEVBQUUsMEJBQTBCO2dCQUFFcUIsT0FBT3JCLEVBQUU7Z0JBQVV3QjtnQkFBSzlCO1lBQU07UUFDckU7SUFDRjtJQUVBLE9BQU87QUFDVDtBQUVPLE1BQU1QLFFBQWdELENBQzNETyxPQUNBLEVBQUVxQixPQUFPLEVBQUVDLE9BQU8sRUFBRWpCLFFBQVEsRUFBRUMsQ0FBQyxFQUFFO0lBRWpDLE9BQU9jLG9CQUFvQnBCLE9BQU87UUFBRXFCO1FBQVNDO1FBQVNqQjtRQUFVQztJQUFFO0FBQ3BFO0FBRU8sTUFBTVosU0FBaUQsQ0FDNURNLE9BQ0EsRUFBRXFCLE9BQU8sRUFBRUMsT0FBTyxFQUFFakIsUUFBUSxFQUFFQyxDQUFDLEVBQUU7SUFFakMsT0FBT2Msb0JBQW9CcEIsT0FBTztRQUFFcUI7UUFBU0M7UUFBU2pCO1FBQVVDO0lBQUU7QUFDcEU7QUFFQSxNQUFNOEIsd0JBQWtDLE9BQ3RDcEMsT0FDQSxFQUFFcUMsRUFBRSxFQUFFQyxJQUFJLEVBQUVDLGFBQWEsRUFBRTlCLE9BQU8sRUFBRStCLFVBQVUsRUFBRUMsR0FBRyxFQUFFQyxXQUFXLEVBQUVwQyxDQUFDLEVBQUVxQyxJQUFJLEVBQUU7SUFFM0UsSUFBSSxDQUFDQyxrQkFBUyxJQUFJLE9BQU9MLGtCQUFrQixlQUFldkMsT0FBTztRQUMvRCxNQUFNaUIsVUFFRixDQUFDO1FBRUwsTUFBTTRCLGNBQWMsT0FBT0wsZUFBZSxXQUFXO1lBQUNBO1NBQVcsR0FBR0E7UUFDcEUsTUFBTU0sU0FBU3RCLE1BQU1DLE9BQU8sQ0FBQ3pCLFNBQVNBLFFBQVE7WUFBQ0E7U0FBTTtRQUVyRCxNQUFNK0MsUUFBUUMsR0FBRyxDQUNmSCxZQUFZSSxHQUFHLENBQUMsT0FBT0M7WUFDckIsTUFBTUMsZUFDSixPQUFPWixrQkFBa0IsYUFDckIsTUFBTUEsY0FBYztnQkFDbEJGO2dCQUNBQztnQkFDQUUsWUFBWVU7Z0JBQ1pSO2dCQUNBQztZQUNGLEtBQ0FKO1lBRU4sTUFBTWEsV0FBZ0MsRUFBRTtZQUV4Q04sT0FBT08sT0FBTyxDQUFDLENBQUNDO2dCQUNkLElBQUksT0FBT0EsUUFBUSxZQUFZQSxLQUFLdEQsT0FBTztvQkFDekNvRCxTQUFTRyxJQUFJLENBQUNELElBQUl0RCxLQUFLO2dCQUN6QjtnQkFFQSxJQUFJLE9BQU9zRCxRQUFRLFlBQVksT0FBT0EsUUFBUSxVQUFVO29CQUN0REYsU0FBU0csSUFBSSxDQUFDRDtnQkFDaEI7WUFDRjtZQUVBLElBQUlGLFNBQVM1QyxNQUFNLEdBQUcsR0FBRztnQkFDdkIsTUFBTWdELFlBQVk7b0JBQ2hCQyxLQUFLO3dCQUFDOzRCQUFFcEIsSUFBSTtnQ0FBRXFCLElBQUlOOzRCQUFTO3dCQUFFO3FCQUFFO2dCQUNqQztnQkFFQSxJQUFJRCxjQUFjSyxVQUFVQyxHQUFHLENBQUNGLElBQUksQ0FBQ0o7Z0JBRXJDLE1BQU1RLFNBQVMsTUFBTWxELFFBQVFtRCxJQUFJLENBQUM7b0JBQ2hDVjtvQkFDQVcsT0FBTztvQkFDUEMsT0FBTztvQkFDUEMsWUFBWTtvQkFDWnRCO29CQUNBdUIsT0FBT1I7Z0JBQ1Q7Z0JBRUF2QyxPQUFPLENBQUNpQyxXQUFXLEdBQUdTLE9BQU9NLElBQUksQ0FBQ2hCLEdBQUcsQ0FBQyxDQUFDaUIsTUFBUUEsSUFBSTdCLEVBQUU7WUFDdkQsT0FBTztnQkFDTHBCLE9BQU8sQ0FBQ2lDLFdBQVcsR0FBRyxFQUFFO1lBQzFCO1FBQ0Y7UUFHRixNQUFNaUIsdUJBQXVCckIsT0FBT3NCLE1BQU0sQ0FBQyxDQUFDZDtZQUMxQyxJQUFJSjtZQUNKLElBQUltQjtZQUVKLElBQUksT0FBTzdCLGVBQWUsVUFBVTtnQkFDbENVLGFBQWFWO2dCQUViLElBQUksT0FBT2MsUUFBUSxZQUFZLE9BQU9BLFFBQVEsVUFBVTtvQkFDdERlLGNBQWNmO2dCQUNoQjtZQUNGO1lBRUEsSUFBSTlCLE1BQU1DLE9BQU8sQ0FBQ2UsZUFBZSxPQUFPYyxRQUFRLFlBQVlBLEtBQUtkLFlBQVk7Z0JBQzNFVSxhQUFhSSxJQUFJZCxVQUFVO2dCQUMzQjZCLGNBQWNmLElBQUl0RCxLQUFLO1lBQ3pCO1lBRUEsT0FBT2lCLE9BQU8sQ0FBQ2lDLFdBQVcsQ0FBQ29CLE9BQU8sQ0FBQ0QsaUJBQWlCLENBQUM7UUFDdkQ7UUFFQSxJQUFJRixxQkFBcUIzRCxNQUFNLEdBQUcsR0FBRztZQUNuQyxPQUFPMkQscUJBQXFCSSxNQUFNLENBQUMsQ0FBQ0MsS0FBS0MsU0FBU0M7Z0JBQ2hELE9BQU8sQ0FBQyxFQUFFRixJQUFJLENBQUMsRUFBRUcsS0FBS0MsU0FBUyxDQUFDSCxTQUFTLEVBQ3ZDTixxQkFBcUIzRCxNQUFNLEtBQUtrRSxJQUFJLElBQUksTUFBTSxHQUMvQyxDQUFDLENBQUM7WUFDTCxHQUFHcEUsRUFBRTtRQUNQO1FBRUEsT0FBTztJQUNUO0lBRUEsT0FBTztBQUNUO0FBRU8sTUFBTVgsU0FBa0QsQ0FBQ0ssT0FBZWlCO0lBQzdFLElBQUksQ0FBQ2pCLFNBQVNpQixRQUFRWixRQUFRLEVBQUU7UUFDOUIsT0FBT1ksUUFBUVgsQ0FBQyxDQUFDO0lBQ25CO0lBRUEsSUFBSSxDQUFDc0Msa0JBQVMsSUFBSSxPQUFPNUMsVUFBVSxlQUFlQSxVQUFVLE1BQU07UUFDaEUsTUFBTTZFLFVBQVU1RCxTQUFTaEIsUUFBUTRDLGFBQzdCZSxLQUFLLENBQUNWLGFBQWVBLFdBQVc0QixJQUFJLEtBQUs3RCxRQUFRdUIsVUFBVSxHQUMzRHVDLFFBQVFuQixLQUFLLENBQUNvQixRQUFVQyxJQUFBQSx1QkFBZ0IsRUFBQ0QsVUFBVUEsTUFBTUUsSUFBSSxLQUFLO1FBRXRFLE1BQU1DLE9BQU9DLElBQUFBLG9CQUFTLEVBQUNQLFNBQVM1RCxTQUFTUixTQUFTNEUsSUFBSUM7UUFFdEQsSUFBSSxDQUFDQyxJQUFBQSxvQkFBUyxFQUFDdkYsT0FBT21GLE9BQU87WUFDM0IsT0FBT2xFLFFBQVFYLENBQUMsQ0FBQztRQUNuQjtJQUNGO0lBRUEsT0FBTzhCLHNCQUFzQnBDLE9BQU9pQjtBQUN0QztBQUVPLE1BQU1yQixlQUE4RCxPQUN6RUksT0FDQWlCO0lBRUEsTUFBTSxFQUFFaEIsTUFBTSxFQUFFb0IsT0FBTyxFQUFFQyxPQUFPLEVBQUViLE9BQU8sRUFBRStCLFVBQVUsRUFBRW5DLFFBQVEsRUFBRUMsQ0FBQyxFQUFFLEdBQUdXO0lBRXZFLElBQUksQUFBQyxDQUFBLENBQUNqQixTQUFVd0IsTUFBTUMsT0FBTyxDQUFDekIsVUFBVUEsTUFBTVEsTUFBTSxLQUFLLENBQUMsS0FBTUgsVUFBVTtRQUN4RSxPQUFPQyxFQUFFO0lBQ1g7SUFFQSxJQUFJa0IsTUFBTUMsT0FBTyxDQUFDekIsVUFBVUEsTUFBTVEsTUFBTSxHQUFHLEdBQUc7UUFDNUMsSUFBSWMsV0FBV3RCLE1BQU1RLE1BQU0sR0FBR2MsU0FBUztZQUNyQyxPQUFPaEIsRUFBRSwwQkFBMEI7Z0JBQUVxQixPQUFPckIsRUFBRTtnQkFBU3dCLEtBQUtSO2dCQUFTdEIsT0FBT0EsTUFBTVEsTUFBTTtZQUFDO1FBQzNGO1FBRUEsSUFBSWEsV0FBV3JCLE1BQU1RLE1BQU0sR0FBR2EsU0FBUztZQUNyQyxPQUFPZixFQUFFLDZCQUE2QjtnQkFBRXFCLE9BQU9yQixFQUFFO2dCQUFTdUIsS0FBS1I7Z0JBQVNyQixPQUFPQSxNQUFNUSxNQUFNO1lBQUM7UUFDOUY7SUFDRjtJQUVBLElBQUksQ0FBQ29DLGtCQUFTLElBQUksT0FBTzVDLFVBQVUsZUFBZUEsVUFBVSxNQUFNO1FBQ2hFLE1BQU04QyxTQUFTdEIsTUFBTUMsT0FBTyxDQUFDekIsU0FBU0EsUUFBUTtZQUFDQTtTQUFNO1FBRXJELE1BQU1tRSx1QkFBdUJyQixPQUFPc0IsTUFBTSxDQUFDLENBQUNkO1lBQzFDLElBQUlrQztZQUNKLElBQUluQjtZQUVKLElBQUksT0FBTzdCLGVBQWUsVUFBVTtnQkFDbENnRCxpQkFBaUJoRDtnQkFFakIsWUFBWTtnQkFDWixJQUFJYyxLQUFLO29CQUNQZSxjQUFjZjtnQkFDaEI7WUFDRjtZQUVBLElBQUk5QixNQUFNQyxPQUFPLENBQUNlLGVBQWUsT0FBT2MsUUFBUSxZQUFZQSxLQUFLZCxZQUFZO2dCQUMzRWdELGlCQUFpQmxDLElBQUlkLFVBQVU7Z0JBQy9CNkIsY0FBY2YsSUFBSXRELEtBQUs7WUFDekI7WUFFQSxJQUFJcUUsZ0JBQWdCLE1BQU0sT0FBTztZQUVqQyxNQUFNUSxVQUFVNUUsUUFBUTRDLGFBQ3BCZSxLQUFLLENBQUNWLGFBQWVBLFdBQVc0QixJQUFJLEtBQUtVLGlCQUN6Q1QsUUFBUW5CLEtBQUssQ0FBQ29CLFFBQVVDLElBQUFBLHVCQUFnQixFQUFDRCxVQUFVQSxNQUFNRSxJQUFJLEtBQUs7WUFFdEUsTUFBTUMsT0FBT0MsSUFBQUEsb0JBQVMsRUFBQ1AsU0FBU3BFLFNBQVM0RSxJQUFJQztZQUU3QyxPQUFPLENBQUNDLElBQUFBLG9CQUFTLEVBQUNsQixhQUFhYztRQUNqQztRQUVBLElBQUloQixxQkFBcUIzRCxNQUFNLEdBQUcsR0FBRztZQUNuQyxPQUFPLENBQUMsaUVBQWlFLEVBQUUyRCxxQkFDeEVsQixHQUFHLENBQUMsQ0FBQ3VCLEtBQUtDO2dCQUNULE9BQU8sQ0FBQyxFQUFFRCxJQUFJLENBQUMsRUFBRUcsS0FBS0MsU0FBUyxDQUFDSCxTQUFTLENBQUM7WUFDNUMsR0FDQ2dCLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDakI7SUFDRjtJQUVBLE9BQU9yRCxzQkFBc0JwQyxPQUFPaUI7QUFDdEM7QUFFTyxNQUFNcEIsU0FBa0QsQ0FDN0RHLE9BQ0EsRUFBRTRCLE9BQU8sRUFBRVgsT0FBTyxFQUFFWixRQUFRLEVBQUVDLENBQUMsRUFBRTtJQUVqQyxJQUNFa0IsTUFBTUMsT0FBTyxDQUFDekIsVUFDZEEsTUFBTTBGLElBQUksQ0FDUixDQUFDQyxRQUNDLENBQUMxRSxRQUFReUUsSUFBSSxDQUNYLENBQUNFLFNBQVdBLFdBQVdELFNBQVUsT0FBT0MsV0FBVyxZQUFZQSxRQUFRNUYsVUFBVTJGLFNBR3ZGO1FBQ0EsT0FBT3JGLEVBQUU7SUFDWDtJQUVBLElBQ0UsT0FBT04sVUFBVSxZQUNqQixDQUFDaUIsUUFBUXlFLElBQUksQ0FDWCxDQUFDRSxTQUFXQSxXQUFXNUYsU0FBVSxPQUFPNEYsV0FBVyxZQUFZQSxPQUFPNUYsS0FBSyxLQUFLQSxRQUVsRjtRQUNBLE9BQU9NLEVBQUU7SUFDWDtJQUVBLElBQ0VELFlBQ0MsQ0FBQSxPQUFPTCxVQUFVLGVBQ2hCQSxVQUFVLFFBQ1Q0QixXQUFXSixNQUFNQyxPQUFPLENBQUN6QixVQUFVLEFBQUNBLE9BQWNRLFdBQVcsQ0FBQyxHQUNqRTtRQUNBLE9BQU9GLEVBQUU7SUFDWDtJQUVBLE9BQU87QUFDVDtBQUVPLE1BQU1SLFFBQWdELENBQUNFLE9BQU8sRUFBRWlCLE9BQU8sRUFBRVosUUFBUSxFQUFFQyxDQUFDLEVBQUU7SUFDM0YsSUFBSU4sT0FBTztRQUNULE1BQU02RixxQkFBcUI1RSxRQUFReUUsSUFBSSxDQUNyQyxDQUFDRSxTQUFXQSxXQUFXNUYsU0FBVSxPQUFPNEYsV0FBVyxZQUFZQSxPQUFPNUYsS0FBSyxLQUFLQTtRQUVsRixPQUFPNkYsc0JBQXNCdkYsRUFBRTtJQUNqQztJQUVBLE9BQU9ELFdBQVdDLEVBQUUseUJBQXlCO0FBQy9DO0FBRU8sTUFBTVAsUUFBZ0QsQ0FDM0RDLFFBQTRDO0lBQUM7SUFBSTtDQUFHLEVBQ3BELEVBQUVLLFFBQVEsRUFBRUMsQ0FBQyxFQUFFO0lBRWYsTUFBTXdGLE1BQU0zRCxXQUFXNEQsT0FBTy9GLEtBQUssQ0FBQyxFQUFFO0lBQ3RDLE1BQU1nRyxNQUFNN0QsV0FBVzRELE9BQU8vRixLQUFLLENBQUMsRUFBRTtJQUN0QyxJQUNFSyxZQUNDLENBQUEsQUFBQ0wsS0FBSyxDQUFDLEVBQUUsSUFBSUEsS0FBSyxDQUFDLEVBQUUsSUFBSSxPQUFPOEYsUUFBUSxZQUFZLE9BQU9FLFFBQVEsWUFDbEVDLE9BQU9wRixLQUFLLENBQUNpRixRQUNiRyxPQUFPcEYsS0FBSyxDQUFDbUYsUUFDWnhFLE1BQU1DLE9BQU8sQ0FBQ3pCLFVBQVVBLE1BQU1RLE1BQU0sS0FBSyxDQUFDLEdBQzdDO1FBQ0EsT0FBT0YsRUFBRTtJQUNYO0lBRUEsSUFBSSxBQUFDTixLQUFLLENBQUMsRUFBRSxJQUFJaUcsT0FBT3BGLEtBQUssQ0FBQ2lGLFFBQVU5RixLQUFLLENBQUMsRUFBRSxJQUFJaUcsT0FBT3BGLEtBQUssQ0FBQ21GLE1BQU87UUFDdEUsT0FBTzFGLEVBQUU7SUFDWDtJQUVBLE9BQU87QUFDVDtNQUVBLFdBQWU7SUFDYmI7SUFDQUM7SUFDQUw7SUFDQUY7SUFDQUc7SUFDQUw7SUFDQUc7SUFDQUk7SUFDQVI7SUFDQWU7SUFDQUQ7SUFDQUY7SUFDQUw7SUFDQU07SUFDQWQ7SUFDQUc7SUFDQVM7QUFDRiJ9