@gravitee/ui-components 3.24.4 → 3.24.5-renovate-github-markdown-css-5-x-d2ffdad

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 (117) hide show
  1. package/CHANGELOG.md +1260 -0
  2. package/LICENSE.txt +202 -0
  3. package/README.md +195 -0
  4. package/assets/css/github-markdown-css/github-markdown.css +500 -545
  5. package/assets/i18n/en.json +0 -3
  6. package/assets/i18n/fr.json +0 -3
  7. package/package.json +19 -21
  8. package/src/.eslintrc.js +19 -0
  9. package/src/atoms/gv-autocomplete.js +156 -132
  10. package/src/atoms/gv-button.js +248 -73
  11. package/src/atoms/gv-checkbox.js +103 -45
  12. package/src/atoms/gv-date-picker-calendar.js +393 -312
  13. package/src/atoms/gv-date-picker-cell.js +81 -57
  14. package/src/atoms/gv-date-picker.js +319 -180
  15. package/src/atoms/gv-file-upload.js +195 -85
  16. package/src/atoms/gv-icon.js +34 -13
  17. package/src/atoms/gv-image.js +66 -31
  18. package/src/atoms/gv-input-message.js +37 -12
  19. package/src/atoms/gv-input.js +169 -139
  20. package/src/atoms/gv-link.js +125 -47
  21. package/src/atoms/gv-message.js +69 -18
  22. package/src/atoms/gv-metric.js +68 -19
  23. package/src/atoms/gv-relative-time.js +38 -67
  24. package/src/atoms/gv-select-native.js +215 -96
  25. package/src/atoms/gv-select.js +230 -110
  26. package/src/atoms/gv-spinner.js +26 -5
  27. package/src/atoms/gv-state.js +66 -25
  28. package/src/atoms/gv-switch.js +160 -40
  29. package/src/atoms/gv-tag.js +78 -26
  30. package/src/atoms/gv-text.js +83 -22
  31. package/src/charts/gv-chart-bar.js +18 -22
  32. package/src/charts/gv-chart-gauge.js +31 -28
  33. package/src/charts/gv-chart-histogram.js +10 -18
  34. package/src/charts/gv-chart-line.js +59 -70
  35. package/src/charts/gv-chart-map.js +42 -44
  36. package/src/charts/gv-chart-pie.js +14 -18
  37. package/src/index.js +0 -2
  38. package/src/lib/cron-expression.js +35 -40
  39. package/src/lib/date.js +1 -10
  40. package/src/lib/events.js +1 -3
  41. package/src/lib/http-client-schema-form.js +12 -13
  42. package/src/lib/http.js +56 -57
  43. package/src/lib/i18n.js +22 -30
  44. package/src/lib/item.js +12 -13
  45. package/src/lib/properties.js +42 -77
  46. package/src/lib/schema-form.js +5 -4
  47. package/src/lib/studio.js +60 -13
  48. package/src/lib/style.js +8 -8
  49. package/src/lib/text-format.js +7 -14
  50. package/src/lib/theme.js +5 -8
  51. package/src/lib/utils.js +18 -17
  52. package/src/mixins/chart-element.js +54 -31
  53. package/src/mixins/input-element.js +49 -60
  54. package/src/mixins/item-resource.js +32 -34
  55. package/src/mixins/keyboard-element.js +5 -6
  56. package/src/mixins/update-after-browser.js +1 -4
  57. package/src/mixins/with-resize-observer.js +13 -23
  58. package/src/mixins/with-skeleton-attribute.js +48 -54
  59. package/src/molecules/gv-card-full.js +147 -26
  60. package/src/molecules/gv-card-list.js +42 -13
  61. package/src/molecules/gv-card.js +91 -17
  62. package/src/molecules/gv-category-list.js +17 -6
  63. package/src/molecules/gv-category.js +103 -23
  64. package/src/molecules/gv-code.js +263 -189
  65. package/src/molecules/gv-confirm.js +71 -41
  66. package/src/molecules/gv-cron-editor.js +389 -143
  67. package/src/molecules/gv-dropdown-menu.js +46 -14
  68. package/src/molecules/gv-expandable.js +59 -31
  69. package/src/molecules/gv-expression-language.js +208 -552
  70. package/src/molecules/gv-identity-picture.js +65 -42
  71. package/src/molecules/gv-list.js +134 -42
  72. package/src/molecules/gv-metrics.js +49 -37
  73. package/src/molecules/gv-modal.js +95 -28
  74. package/src/molecules/gv-nav.js +75 -49
  75. package/src/molecules/gv-option.js +130 -57
  76. package/src/molecules/gv-plans.js +209 -86
  77. package/src/molecules/gv-popover.js +177 -57
  78. package/src/molecules/gv-promote.js +146 -28
  79. package/src/molecules/gv-rating-list.js +195 -69
  80. package/src/molecules/gv-rating.js +105 -52
  81. package/src/molecules/gv-row-expandable.js +11 -5
  82. package/src/molecules/gv-row.js +147 -21
  83. package/src/molecules/gv-stats.js +48 -23
  84. package/src/molecules/gv-stepper.js +187 -43
  85. package/src/molecules/gv-table.js +309 -199
  86. package/src/molecules/gv-tree.js +156 -33
  87. package/src/organisms/gv-documentation.js +127 -44
  88. package/src/organisms/gv-header.js +195 -37
  89. package/src/organisms/gv-http-client.js +168 -32
  90. package/src/organisms/gv-menu.js +158 -37
  91. package/src/organisms/gv-newsletter-subscription.js +189 -48
  92. package/src/organisms/gv-pagination.js +77 -49
  93. package/src/organisms/gv-properties.js +492 -271
  94. package/src/organisms/gv-resizable-views.js +259 -41
  95. package/src/organisms/gv-resources.js +275 -168
  96. package/src/organisms/gv-schema-form-array.js +159 -49
  97. package/src/organisms/gv-schema-form-control-object.js +73 -59
  98. package/src/organisms/gv-schema-form-control.js +134 -107
  99. package/src/organisms/gv-schema-form.js +280 -195
  100. package/src/organisms/gv-tabs.js +98 -66
  101. package/src/organisms/gv-user-menu.js +201 -36
  102. package/src/organisms/gv-vertical-menu.js +61 -20
  103. package/src/policy-studio/gv-flow-step.js +245 -105
  104. package/src/policy-studio/gv-flow.js +304 -125
  105. package/src/policy-studio/gv-policy-studio-menu.js +471 -157
  106. package/src/policy-studio/gv-policy-studio.js +761 -692
  107. package/src/styles/empty.js +20 -3
  108. package/src/styles/input.js +247 -3
  109. package/src/styles/link.js +16 -3
  110. package/src/styles/shapes.js +0 -1
  111. package/src/styles/skeleton.js +37 -3
  112. package/src/styles/zoom.js +24 -3
  113. package/src/theme/definition.json +1762 -0
  114. package/src/theme/gv-theme.js +60 -21
  115. package/assets/css/codemirror/all.css +0 -476
  116. package/src/molecules/gv-code-hint.js +0 -49
  117. package/wc/gv-code-hint.js +0 -1
@@ -32,7 +32,9 @@ import { empty } from '../styles/empty';
32
32
  import { cache } from 'lit/directives/cache';
33
33
  import { deepClone, deepEqual } from '../lib/utils';
34
34
  import { KeyboardElement, KEYS } from '../mixins/keyboard-element';
35
+
35
36
  const FLOW_STEP_FORM_ID = 'flow-step-form';
37
+
36
38
  /**
37
39
  * Studio Policy component
38
40
  *
@@ -66,167 +68,273 @@ const FLOW_STEP_FORM_ID = 'flow-step-form';
66
68
  * @attr {Boolean} can-debug - true if debug tab should be displayed
67
69
  * @attr {Object} debugResponse - true if debug tab should be displayed
68
70
  */
69
-
70
71
  export class GvPolicyStudio extends KeyboardElement(LitElement) {
71
72
  static get properties() {
72
73
  return {
73
- policies: {
74
- type: Array
75
- },
76
- services: {
77
- type: Object
78
- },
79
- resourceTypes: {
80
- type: Array,
81
- attribute: 'resource-types'
82
- },
83
- propertyProviders: {
84
- type: Array,
85
- attribute: 'property-providers'
86
- },
87
- dynamicPropertySchema: {
88
- type: Object,
89
- attribute: 'dynamic-property-schema'
90
- },
91
- tabId: {
92
- type: String,
93
- attribute: 'tab-id'
94
- },
95
- _tabId: {
96
- type: String,
97
- attribute: false
98
- },
99
- definition: {
100
- type: Object
101
- },
102
- _definition: {
103
- type: Object,
104
- attribute: false
105
- },
106
- documentation: {
107
- type: Object
108
- },
109
- flowSchema: {
110
- type: Object,
111
- attribute: 'flow-schema'
112
- },
113
- configurationSchema: {
114
- type: Object,
115
- attribute: 'configuration-schema'
116
- },
117
- _configurationSchema: {
118
- type: Object,
119
- attribute: false
120
- },
121
- configurationInformation: {
122
- type: String,
123
- attribute: 'configuration-information'
124
- },
125
- isDirty: {
126
- type: Boolean,
127
- attribute: 'dirty',
128
- reflect: true
129
- },
130
- _dragPolicy: {
131
- type: Object,
132
- attribute: false
133
- },
134
- _dropPolicy: {
135
- type: Object,
136
- attribute: false
137
- },
138
- selectedFlowsId: {
139
- type: Array,
140
- attribute: 'selected-flows-id'
141
- },
142
- _selectedFlowsId: {
143
- type: Array,
144
- attribute: false
145
- },
146
- _currentPolicyId: {
147
- type: String,
148
- attribute: false
149
- },
150
- _searchPolicyQuery: {
151
- type: String,
152
- attribute: false
153
- },
154
- _searchFlowQuery: {
155
- type: String,
156
- attribute: false
157
- },
158
- _flowStepSchema: {
159
- type: Object,
160
- attribute: false
161
- },
162
- _currentFlowStep: {
163
- type: Object,
164
- attribute: false
165
- },
166
- _policyFilter: {
167
- type: Array,
168
- attribute: false
169
- },
170
- _flowFilter: {
171
- type: Array,
172
- attribute: false
173
- },
174
- _currentAskConfirmation: {
175
- type: Boolean,
176
- attribute: false
177
- },
178
- hasProperties: {
179
- type: Boolean,
180
- attribute: 'has-properties'
181
- },
182
- _hasProperties: {
183
- type: Boolean,
184
- attribute: false
185
- },
186
- hasResources: {
187
- type: Boolean,
188
- attribute: 'has-resources'
189
- },
190
- hasPolicyFilter: {
191
- type: Boolean,
192
- attribute: 'has-policy-filter'
193
- },
194
- flowsTitle: {
195
- type: String,
196
- attribute: 'flows-title'
197
- },
198
- sortable: {
199
- type: Boolean
200
- },
201
- canAdd: {
202
- type: Boolean,
203
- attribute: 'can-add'
204
- },
205
- readonly: {
206
- type: Boolean
207
- },
208
- readonlyPlans: {
209
- type: Boolean,
210
- attribute: 'readonly-plans'
211
- },
212
- canDebug: {
213
- type: Boolean,
214
- attribute: 'can-debug'
215
- },
216
- _canDebug: {
217
- type: Boolean,
218
- attribute: false
219
- },
220
- debugResponse: {
221
- type: Object,
222
- attribute: 'debug-response'
223
- }
74
+ policies: { type: Array },
75
+ services: { type: Object },
76
+ resourceTypes: { type: Array, attribute: 'resource-types' },
77
+ propertyProviders: { type: Array, attribute: 'property-providers' },
78
+ dynamicPropertySchema: { type: Object, attribute: 'dynamic-property-schema' },
79
+ tabId: { type: String, attribute: 'tab-id' },
80
+ _tabId: { type: String, attribute: false },
81
+ definition: { type: Object },
82
+ _definition: { type: Object, attribute: false },
83
+ documentation: { type: Object },
84
+ flowSchema: { type: Object, attribute: 'flow-schema' },
85
+ configurationSchema: { type: Object, attribute: 'configuration-schema' },
86
+ _configurationSchema: { type: Object, attribute: false },
87
+ configurationInformation: { type: String, attribute: 'configuration-information' },
88
+ isDirty: { type: Boolean, attribute: 'dirty', reflect: true },
89
+ _dragPolicy: { type: Object, attribute: false },
90
+ _dropPolicy: { type: Object, attribute: false },
91
+ selectedFlowsId: { type: Array, attribute: 'selected-flows-id' },
92
+ _selectedFlowsId: { type: Array, attribute: false },
93
+ _currentPolicyId: { type: String, attribute: false },
94
+ _searchPolicyQuery: { type: String, attribute: false },
95
+ _searchFlowQuery: { type: String, attribute: false },
96
+ _flowStepSchema: { type: Object, attribute: false },
97
+ _currentFlowStep: { type: Object, attribute: false },
98
+ _policyFilter: { type: Array, attribute: false },
99
+ _flowFilter: { type: Array, attribute: false },
100
+ _currentAskConfirmation: { type: Boolean, attribute: false },
101
+ hasProperties: { type: Boolean, attribute: 'has-properties' },
102
+ _hasProperties: { type: Boolean, attribute: false },
103
+ hasResources: { type: Boolean, attribute: 'has-resources' },
104
+ hasPolicyFilter: { type: Boolean, attribute: 'has-policy-filter' },
105
+ flowsTitle: { type: String, attribute: 'flows-title' },
106
+ sortable: { type: Boolean },
107
+ canAdd: { type: Boolean, attribute: 'can-add' },
108
+ readonly: { type: Boolean },
109
+ readonlyPlans: { type: Boolean, attribute: 'readonly-plans' },
110
+ canDebug: { type: Boolean, attribute: 'can-debug' },
111
+ _canDebug: { type: Boolean, attribute: false },
112
+ debugResponse: { type: Object, attribute: 'debug-response' },
224
113
  };
225
114
  }
226
115
 
227
116
  static get styles() {
228
- return [empty, methods, // language=CSS
229
- css`:host{box-sizing:border-box;--height:var(--gv-policy-studio--h, calc(100vh - 32px));height:var(--height);--height-in-tabs:calc(var(--height) - 25px)}.box{height:var(--height);display:flex}.design,.properties{display:flex}gv-resizable-views{width:100%}.editable-name{padding:.5rem 1rem;font-size:16px}.editable-name span{color:#bfbfbf;font-size:12px}.form__control{margin:.5rem}gv-input{width:100%}.flow-name{display:flex;align-items:center}.flow-name.dirty{font-style:italic;opacity:.8}.flow-name gv-icon{--gv-icon--s:24px;margin-right:.2rem}.flow-path{margin-left:.2rem}.title_methods{margin-left:.5rem}.two-cols{display:flex;width:100%;height:100%}.two-cols>*{flex:1}.left-menu{border-left:1px solid #d9d9d9;height:var(--height-in-tabs)}.right-menu{border-right:1px solid #d9d9d9;height:var(--height-in-tabs)}.two-cols>:first-child{border-right:1px solid #d9d9d9}.flow-step__container{overflow:hidden;position:relative;overflow:hidden;height:99%}.flow-step__form{padding:0 .5rem;overflow:auto}.flow-step__form-title{text-transform:uppercase;letter-spacing:.2rem}gv-tabs{width:100%;height:100%;display:inline-block}gv-properties,gv-resizable-views,gv-resources{height:var(--height-in-tabs)}gv-properties,gv-resources{width:100%}gv-properties.properties{--gv-properties-table--colmg:10px}.api-settings{display:flex;flex-direction:column;border-left:1px solid #bfbfbf;height:var(--height-in-tabs)}.debug{display:flex;flex-direction:column;border-left:1px solid #bfbfbf;height:var(--height-in-tabs)}.api-settings-information{display:flex;align-items:center}.api-settings-information__icon{--gv-icon--c:var(--gv-theme-color, #5a7684);--gv-icon-opacity--c:var(--gv-theme-color-info-light, #64b5f6)}.api-settings-information__blockquote,.debug-information__blockquote{border-left:1px solid var(--gv-theme-color,#5a7684);margin:15px;padding-left:15px;font-size:14px}.flow-settings gv-schema-form{flex:1;padding:.5rem}.search{display:flex;justify-content:stretch}gv-input{margin:.2rem 0;width:100%}.header-actions,.search-policies{display:flex;flex-direction:column;align-items:center;margin:.5rem}.search-policies{margin:1.5rem .5rem .5rem}.footer-actions>gv-button.btn-large,.footer-actions>gv-option{width:100%}.footer-actions{display:flex;flex-direction:column;align-items:center;padding:.5rem 0;margin:.5rem 15px;border-top:1px solid #bfbfbf}.header-actions .title{text-transform:uppercase;text-align:center;letter-spacing:.3rem;color:#bfbfbf;font-size:18px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:240px;min-height:25px}.header-actions>*,.search-policies>*{margin-bottom:1rem}`];
117
+ return [
118
+ empty,
119
+ methods,
120
+ // language=CSS
121
+ css`
122
+ :host {
123
+ box-sizing: border-box;
124
+ --height: var(--gv-policy-studio--h, calc(100vh - 32px));
125
+ height: var(--height);
126
+ --height-in-tabs: calc(var(--height) - 25px);
127
+ }
128
+
129
+ .box {
130
+ height: var(--height);
131
+ display: flex;
132
+ }
133
+
134
+ .design,
135
+ .properties {
136
+ display: flex;
137
+ }
138
+
139
+ gv-resizable-views {
140
+ width: 100%;
141
+ }
142
+
143
+ .editable-name {
144
+ padding: 0.5rem 1rem;
145
+ font-size: 16px;
146
+ }
147
+
148
+ .editable-name span {
149
+ color: #bfbfbf;
150
+ font-size: 12px;
151
+ }
152
+
153
+ .form__control {
154
+ margin: 0.5rem;
155
+ }
156
+
157
+ gv-input {
158
+ width: 100%;
159
+ }
160
+
161
+ .flow-name {
162
+ display: flex;
163
+ align-items: center;
164
+ }
165
+
166
+ .flow-name.dirty {
167
+ font-style: italic;
168
+ opacity: 0.8;
169
+ }
170
+
171
+ .flow-name gv-icon {
172
+ --gv-icon--s: 24px;
173
+ margin-right: 0.2rem;
174
+ }
175
+
176
+ .flow-path {
177
+ margin-left: 0.2rem;
178
+ }
179
+
180
+ .title_methods {
181
+ margin-left: 0.5rem;
182
+ }
183
+
184
+ .two-cols {
185
+ display: flex;
186
+ width: 100%;
187
+ height: 100%;
188
+ }
189
+
190
+ .two-cols > * {
191
+ flex: 1;
192
+ }
193
+
194
+ .left-menu {
195
+ border-left: 1px solid #d9d9d9;
196
+ height: var(--height-in-tabs);
197
+ }
198
+
199
+ .right-menu {
200
+ border-right: 1px solid #d9d9d9;
201
+ height: var(--height-in-tabs);
202
+ }
203
+
204
+ .two-cols > *:first-child {
205
+ border-right: 1px solid #d9d9d9;
206
+ }
207
+
208
+ .flow-step__container {
209
+ overflow: hidden;
210
+ position: relative;
211
+ overflow: hidden;
212
+ height: 99%;
213
+ }
214
+
215
+ .flow-step__form {
216
+ padding: 0 0.5rem;
217
+ overflow: auto;
218
+ }
219
+
220
+ .flow-step__form-title {
221
+ text-transform: uppercase;
222
+ letter-spacing: 0.2rem;
223
+ }
224
+
225
+ gv-tabs {
226
+ width: 100%;
227
+ height: 100%;
228
+ display: inline-block;
229
+ }
230
+
231
+ gv-resizable-views,
232
+ gv-properties,
233
+ gv-resources {
234
+ height: var(--height-in-tabs);
235
+ }
236
+
237
+ gv-properties,
238
+ gv-resources {
239
+ width: 100%;
240
+ }
241
+
242
+ gv-properties.properties {
243
+ --gv-properties-table--colmg: 10px;
244
+ }
245
+
246
+ .api-settings {
247
+ display: flex;
248
+ flex-direction: column;
249
+ border-left: 1px solid #bfbfbf;
250
+ height: var(--height-in-tabs);
251
+ }
252
+
253
+ .debug {
254
+ display: flex;
255
+ flex-direction: column;
256
+ border-left: 1px solid #bfbfbf;
257
+ height: var(--height-in-tabs);
258
+ }
259
+
260
+ .api-settings-information {
261
+ display: flex;
262
+ align-items: center;
263
+ }
264
+
265
+ .api-settings-information__icon {
266
+ --gv-icon--c: var(--gv-theme-color, #5a7684);
267
+ --gv-icon-opacity--c: var(--gv-theme-color-info-light, #64b5f6);
268
+ }
269
+
270
+ .api-settings-information__blockquote,
271
+ .debug-information__blockquote {
272
+ border-left: 1px solid var(--gv-theme-color, #5a7684);
273
+ margin: 15px;
274
+ padding-left: 15px;
275
+ font-size: 14px;
276
+ }
277
+
278
+ .flow-settings gv-schema-form {
279
+ flex: 1;
280
+ padding: 0.5rem;
281
+ }
282
+
283
+ .search {
284
+ display: flex;
285
+ justify-content: stretch;
286
+ }
287
+
288
+ gv-input {
289
+ margin: 0.2rem 0;
290
+ width: 100%;
291
+ }
292
+
293
+ .header-actions,
294
+ .search-policies {
295
+ display: flex;
296
+ flex-direction: column;
297
+ align-items: center;
298
+ margin: 0.5rem;
299
+ }
300
+
301
+ .search-policies {
302
+ margin: 1.5rem 0.5rem 0.5rem;
303
+ }
304
+
305
+ .footer-actions > gv-button.btn-large,
306
+ .footer-actions > gv-option {
307
+ width: 100%;
308
+ }
309
+
310
+ .footer-actions {
311
+ display: flex;
312
+ flex-direction: column;
313
+ align-items: center;
314
+ padding: 0.5rem 0;
315
+ margin: 0.5rem 15px;
316
+ border-top: 1px solid #bfbfbf;
317
+ }
318
+
319
+ .header-actions .title {
320
+ text-transform: uppercase;
321
+ text-align: center;
322
+ letter-spacing: 0.3rem;
323
+ color: #bfbfbf;
324
+ font-size: 18px;
325
+ white-space: nowrap;
326
+ overflow: hidden;
327
+ text-overflow: ellipsis;
328
+ width: 240px;
329
+ min-height: 25px;
330
+ }
331
+
332
+ .header-actions > *,
333
+ .search-policies > * {
334
+ margin-bottom: 1rem;
335
+ }
336
+ `,
337
+ ];
230
338
  }
231
339
 
232
340
  constructor() {
@@ -240,13 +348,9 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
240
348
  this.sortable = false;
241
349
  this.services = {};
242
350
  this._definition = {
243
- flows: []
351
+ flows: [],
244
352
  };
245
- this._tabs = [{
246
- id: 'design',
247
- title: 'Design',
248
- icon: 'navigation:exchange'
249
- }];
353
+ this._tabs = [{ id: 'design', title: 'Design', icon: 'navigation:exchange' }];
250
354
  this._policyFilter = [];
251
355
  this._flowFilter = [];
252
356
  }
@@ -254,15 +358,10 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
254
358
  set hasProperties(value) {
255
359
  if (value) {
256
360
  import('../organisms/gv-properties').then(() => {
257
- this._tabs = [...this._tabs, {
258
- id: 'properties',
259
- title: 'Properties',
260
- icon: 'general:settings#1'
261
- }];
361
+ this._tabs = [...this._tabs, { id: 'properties', title: 'Properties', icon: 'general:settings#1' }];
262
362
  this.requestUpdate();
263
363
  });
264
364
  }
265
-
266
365
  this._hasProperties = value;
267
366
  }
268
367
 
@@ -273,11 +372,7 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
273
372
  set hasResources(value) {
274
373
  if (value) {
275
374
  import('../organisms/gv-resources').then(() => {
276
- this._tabs = [...this._tabs, {
277
- id: 'resources',
278
- title: 'Resources',
279
- icon: 'general:settings#5'
280
- }];
375
+ this._tabs = [...this._tabs, { id: 'resources', title: 'Resources', icon: 'general:settings#5' }];
281
376
  this.requestUpdate();
282
377
  });
283
378
  }
@@ -285,49 +380,31 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
285
380
 
286
381
  set canDebug(value) {
287
382
  if (value) {
288
- this._tabs = [...this._tabs, {
289
- id: 'debug',
290
- title: 'Try it',
291
- icon: 'content:send'
292
- }];
383
+ this._tabs = [...this._tabs, { id: 'debug', title: 'Try it', icon: 'content:send' }];
293
384
  }
294
385
  }
295
386
 
296
387
  get _flowFilterOptions() {
297
388
  if (this.definedPlans.length > 0) {
298
- return [{
299
- id: 'api',
300
- title: 'Api',
301
- icon: 'shopping:box#3'
302
- }, {
303
- id: 'plan',
304
- title: 'Plans',
305
- icon: 'shopping:sale#2'
306
- }];
389
+ return [
390
+ { id: 'api', title: 'Api', icon: 'shopping:box#3' },
391
+ { id: 'plan', title: 'Plans', icon: 'shopping:sale#2' },
392
+ ];
307
393
  }
308
394
  }
309
395
 
310
396
  set hasPolicyFilter(value) {
311
397
  if (value) {
312
- this._policyFilterOptions = [{
313
- id: 'onRequest',
314
- title: 'Request',
315
- icon: 'navigation:arrow-from-left'
316
- }, {
317
- id: 'onResponse',
318
- title: 'Response',
319
- icon: 'navigation:arrow-from-right'
320
- }];
398
+ this._policyFilterOptions = [
399
+ { id: 'onRequest', title: 'Request', icon: 'navigation:arrow-from-left' },
400
+ { id: 'onResponse', title: 'Response', icon: 'navigation:arrow-from-right' },
401
+ ];
321
402
  }
322
403
  }
323
404
 
324
405
  set configurationSchema(value) {
325
406
  if (value) {
326
- this._tabs.splice(1, 0, {
327
- id: 'settings',
328
- title: 'Configuration',
329
- icon: 'general:settings#2'
330
- });
407
+ this._tabs.splice(1, 0, { id: 'settings', title: 'Configuration', icon: 'general:settings#2' });
331
408
  }
332
409
 
333
410
  this._configurationSchema = value;
@@ -341,23 +418,15 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
341
418
  if (this._currentAskConfirmation == null) {
342
419
  if (this.isPressed(KEYS.Shift, KEYS.Ctrl, KEYS.Space)) {
343
420
  const search = this.shadowRoot.querySelector('#search-policy');
344
-
345
421
  if (search) {
346
422
  search.focus();
347
423
  }
348
424
  } else if (this.isPressed(KEYS.Ctrl, KEYS.Space)) {
349
425
  const search = this.shadowRoot.querySelector('#search-flow');
350
-
351
426
  if (search) {
352
427
  search.focus();
353
428
  }
354
429
  }
355
-
356
- if (this.isPressed(KEYS.Esc)) {
357
- this._closeFlowStepForm();
358
-
359
- this._onCloseDocumentation();
360
- }
361
430
  }
362
431
  }
363
432
 
@@ -376,22 +445,16 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
376
445
  set definition(definition) {
377
446
  if (definition) {
378
447
  const flows = this._generateFlowsId(definition.flows);
379
-
380
448
  const resources = this._generateId('resource-', definition.resources);
381
-
382
- const plans = definition.plans == null ? [] : definition.plans.map(plan => {
383
- return { ...plan,
384
- flows: this._generatePlanFlowsId(plan)
385
- };
386
- });
387
- this._initialDefinition = { ...definition,
388
- flows,
389
- resources,
390
- plans
391
- };
449
+ const plans =
450
+ definition.plans == null
451
+ ? []
452
+ : definition.plans.map((plan) => {
453
+ return { ...plan, flows: this._generatePlanFlowsId(plan) };
454
+ });
455
+ this._initialDefinition = { ...definition, flows, resources, plans };
392
456
  this._definition = deepClone(this._initialDefinition);
393
457
  this.isDirty = false;
394
-
395
458
  this._selectFirstFlow();
396
459
  }
397
460
  }
@@ -402,8 +465,7 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
402
465
 
403
466
  set selectedFlowsId(selectedFlowsId) {
404
467
  if (selectedFlowsId != null && Array.isArray(selectedFlowsId)) {
405
- this._selectedFlowsId = selectedFlowsId.filter(id => this._findFlowById(id) != null);
406
-
468
+ this._selectedFlowsId = selectedFlowsId.filter((id) => this._findFlowById(id) != null);
407
469
  if (selectedFlowsId.length !== this._selectedFlowsId.length) {
408
470
  this._selectFirstFlow(true);
409
471
  }
@@ -411,30 +473,25 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
411
473
  }
412
474
 
413
475
  get selectedFlowsId() {
414
- return this._selectedFlowsId.filter(id => this._findFlowById(id) != null);
476
+ return this._selectedFlowsId.filter((id) => this._findFlowById(id) != null);
415
477
  }
416
478
 
417
479
  _updateSelectedFlows(selectedFlowsId) {
418
480
  this.selectedFlowsId = selectedFlowsId;
419
- dispatchCustomEvent(this, 'select-flows', {
420
- flows: this.selectedFlowsId
421
- });
481
+ dispatchCustomEvent(this, 'select-flows', { flows: this.selectedFlowsId });
422
482
  }
423
483
 
424
484
  _selectFirstFlow(dispatch = false) {
425
485
  if (this.selectedFlowsId.length === 0) {
426
486
  let candidate = null;
427
-
428
487
  if (this.definedFlows.length > 0 && this.definedFlows[0]._id != null) {
429
488
  candidate = this.definedFlows[0];
430
489
  } else if (this.definedPlans.length > 0) {
431
- const plan = this.definedPlans.find(plan => plan.flows != null && plan.flows.length > 0 && plan.flows[0]._id != null);
432
-
490
+ const plan = this.definedPlans.find((plan) => plan.flows != null && plan.flows.length > 0 && plan.flows[0]._id != null);
433
491
  if (plan) {
434
492
  candidate = plan.flows[0];
435
493
  }
436
494
  }
437
-
438
495
  if (candidate != null) {
439
496
  if (dispatch) {
440
497
  this._updateSelectedFlows([candidate._id]);
@@ -450,26 +507,21 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
450
507
  }
451
508
 
452
509
  _onDragEndPolicy() {
453
- this.shadowRoot.querySelectorAll('gv-flow').forEach(e => e.onDragEnd());
510
+ this.shadowRoot.querySelectorAll('gv-flow').forEach((e) => e.onDragEnd());
454
511
  }
455
512
 
456
- async _onDropPolicy({
457
- detail
458
- }) {
513
+ async _onDropPolicy({ detail }) {
459
514
  try {
460
515
  await this._askToValidateForms();
461
- const policy = detail.policy;
462
516
 
517
+ const policy = detail.policy;
463
518
  const targetFlow = this._findFlowById(detail.flowId);
464
519
 
465
520
  let name = policy.name;
466
521
  let description = '';
467
522
  let configuration = {};
468
-
469
523
  let _id;
470
-
471
524
  let _new = false;
472
-
473
525
  if (detail.flowStep) {
474
526
  _id = detail.flowStep._id;
475
527
  name = detail.flowStep.name;
@@ -480,28 +532,18 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
480
532
  _new = true;
481
533
  }
482
534
 
483
- const flowStep = {
484
- _id,
485
- _new,
486
- name,
487
- policy: policy.id,
488
- description,
489
- enabled: true,
490
- configuration
491
- };
535
+ const flowStep = { _id, _new, name, policy: policy.id, description, enabled: true, configuration };
492
536
  const sourceFlow = detail.sourceFlowId != null ? this._findFlowById(detail.sourceFlowId) : targetFlow;
493
537
 
494
538
  if (detail.sourcePosition != null) {
495
539
  if (detail.sourceFlowKey && detail.sourceFlowKey !== detail.flowKey) {
496
540
  sourceFlow[detail.sourceFlowKey].splice(detail.sourcePosition, 1);
497
541
  targetFlow[detail.flowKey].splice(detail.position, 0, flowStep);
498
-
499
542
  if (this._currentFlowStep != null && this._currentFlowStep.step._id === _id) {
500
- this._currentFlowStep.group = detail.flowKey; // Special case for update schema after change request to response or inverse
501
-
543
+ this._currentFlowStep.group = detail.flowKey;
544
+ // Special case for update schema after change request to response or inverse
502
545
  const schema = this.buildSchema(this._currentFlowStep.policy);
503
546
  await this._setCurrentFlowStep(this._currentFlowStep, schema, true);
504
-
505
547
  this._getFlowElement(targetFlow._id).requestUpdate();
506
548
  }
507
549
  } else {
@@ -512,20 +554,16 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
512
554
  sourceFlow[detail.flowKey].splice(detail.sourcePosition, 1);
513
555
  targetFlow[detail.flowKey].splice(detail.position, 0, flowStep);
514
556
  }
515
- } // Force Refresh source flow element when move to other flow
516
-
517
-
557
+ }
558
+ // Force Refresh source flow element when move to other flow
518
559
  if (targetFlow._id !== sourceFlow._id) {
519
560
  this._getFlowElement(targetFlow._id).requestUpdate();
520
561
  }
521
562
  } else {
522
563
  targetFlow[detail.flowKey].splice(detail.position, 0, flowStep);
523
-
524
564
  const currentFlowForm = this._getFlowStepForm();
525
-
526
565
  if (currentFlowForm == null || currentFlowForm.dirty !== true) {
527
566
  let step = targetFlow[detail.flowKey][detail.position];
528
-
529
567
  if (step == null) {
530
568
  // When confirm lose change after drop policy
531
569
  step = targetFlow[detail.flowKey][detail.position - 1];
@@ -533,15 +571,9 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
533
571
 
534
572
  if (detail.cancelEdit !== true) {
535
573
  setTimeout(async () => {
536
- await this._editFlowStep({
537
- step,
538
- policy,
539
- flow: targetFlow,
540
- group: detail.flowKey
541
- });
574
+ await this._editFlowStep({ step, policy, flow: targetFlow, group: detail.flowKey });
542
575
  this.updateComplete.then(() => {
543
576
  const flowElement = this._getFlowElement(targetFlow._id);
544
-
545
577
  flowElement.selectedStepId = step._id;
546
578
  flowElement.requestUpdate();
547
579
  });
@@ -549,11 +581,10 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
549
581
  }
550
582
  }
551
583
  }
552
-
553
584
  targetFlow._dirty = true;
554
585
  sourceFlow._dirty = true;
555
586
  this.isDirty = true;
556
- this.shadowRoot.querySelectorAll('gv-flow').forEach(gvFlow => gvFlow.removeCandidate());
587
+ this.shadowRoot.querySelectorAll('gv-flow').forEach((gvFlow) => gvFlow.removeCandidate());
557
588
  setTimeout(() => {
558
589
  this._dragPolicy = null;
559
590
  this._dropPolicy = null;
@@ -563,78 +594,45 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
563
594
  }
564
595
  }
565
596
 
566
- _onDeletePolicy({
567
- detail
568
- }) {
597
+ _onDeletePolicy({ detail }) {
569
598
  const targetFlow = this._findFlowById(detail.flowId);
570
-
571
599
  targetFlow[detail.flowKey].splice(detail.position, 1);
572
600
  targetFlow._dirty = true;
573
601
  this.isDirty = true;
574
-
575
602
  if (detail.target.editing) {
576
603
  this._closeFlowStepForm(true);
577
604
  }
578
-
579
605
  this._getFlowElement(detail.flowId).requestUpdate();
580
606
  }
581
607
 
582
608
  _onDesign() {
583
609
  this._changeTab('design');
584
-
585
610
  this._splitMainViews();
586
611
  }
587
612
 
588
- buildSchema({
589
- schema
590
- }) {
613
+ buildSchema({ schema }) {
591
614
  const description = {
592
615
  title: 'Description',
593
616
  description: 'Description of flow step',
594
- type: 'string'
617
+ type: 'string',
595
618
  };
596
-
597
619
  if (schema) {
598
620
  const jsonSchema = typeof schema === 'string' ? JSON.parse(schema) : schema;
599
- const properties = {
600
- description,
601
- ...jsonSchema.properties
602
- };
603
- return { ...jsonSchema,
604
- properties
605
- };
621
+ const properties = { description, ...jsonSchema.properties };
622
+ return { ...jsonSchema, properties };
606
623
  }
607
-
608
- return {
609
- properties: {
610
- description
611
- }
612
- };
624
+ return { properties: { description } };
613
625
  }
614
626
 
615
- async _editFlowStep({
616
- step,
617
- flow,
618
- policy,
619
- group
620
- }) {
627
+ async _editFlowStep({ step, flow, policy, group }) {
621
628
  if (step) {
622
629
  this._currentPolicyId = policy.id;
623
- const currentFlowStep = {
624
- flow,
625
- step,
626
- policy,
627
- group
628
- };
630
+ const currentFlowStep = { flow, step, policy, group };
629
631
  const schema = this.buildSchema(policy);
630
-
631
632
  try {
632
633
  await this._setCurrentFlowStep(currentFlowStep, schema);
633
-
634
634
  this._updateSelectedFlows([flow._id]);
635
-
636
635
  this._splitMainViews();
637
-
638
636
  if (localStorage.getItem('gv-policy-studio:keep-documentation-close') == null) {
639
637
  this._onOpenDocumentation();
640
638
  }
@@ -643,25 +641,12 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
643
641
  }
644
642
  } else {
645
643
  await this._closeFlowStepForm();
646
-
647
644
  this._maximizeTopView();
648
645
  }
649
646
  }
650
647
 
651
- async _onEditFlowStep({
652
- detail: {
653
- step,
654
- flow,
655
- policy,
656
- group
657
- }
658
- }) {
659
- return this._editFlowStep({
660
- step,
661
- flow,
662
- policy,
663
- group
664
- });
648
+ async _onEditFlowStep({ detail: { step, flow, policy, group } }) {
649
+ return this._editFlowStep({ step, flow, policy, group });
665
650
  }
666
651
 
667
652
  _getResizableViews() {
@@ -682,11 +667,8 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
682
667
  this._getResizableViews().split();
683
668
  }
684
669
 
685
- _onChangeFlowStepState({
686
- detail
687
- }) {
670
+ _onChangeFlowStepState({ detail }) {
688
671
  const targetFlow = this._findFlowById(detail.flowId);
689
-
690
672
  const step = targetFlow[detail.flowKey][detail.position];
691
673
  step.enabled = detail.enabled;
692
674
  targetFlow._dirty = true;
@@ -708,13 +690,13 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
708
690
  async _askToValidateForms() {
709
691
  if (this._currentAskConfirmation == null) {
710
692
  this._currentAskConfirmation = true;
711
- return Promise.all(this._submitOrConfirmForms()).then(forms => {
712
- if (forms.filter(r => r != null).length > 0) {
693
+ return Promise.all(this._submitOrConfirmForms()).then((forms) => {
694
+ if (forms.filter((r) => r != null).length > 0) {
713
695
  this._definition = this._buildDefinitionToSave();
714
- this.getChildren().forEach(e => e.requestUpdate()); // Refresh if lose changes lost current step selection
715
-
696
+ this.getChildren().forEach((e) => e.requestUpdate());
697
+ // Refresh if lose changes lost current step selection
716
698
  return this._checkCurrentFlowStep().then(() => {
717
- this.getChildren().forEach(e => e.requestUpdate());
699
+ this.getChildren().forEach((e) => e.requestUpdate());
718
700
  return this.updateComplete.then(() => {
719
701
  this._currentAskConfirmation = null;
720
702
  return forms;
@@ -726,7 +708,6 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
726
708
  }
727
709
  });
728
710
  }
729
-
730
711
  throw new Error('ask already waiting');
731
712
  }
732
713
 
@@ -736,33 +717,26 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
736
717
  }
737
718
 
738
719
  const schema = deepClone(flowStepSchema);
739
-
740
720
  if (currentFlowStep != null) {
741
- const configuration = typeof currentFlowStep.step.configuration === 'string' ? JSON.parse(currentFlowStep.step.configuration) : currentFlowStep.step.configuration;
742
- const step = { ...currentFlowStep.step,
743
- configuration
744
- };
745
- const _initialValues = { ...step.configuration,
746
- description: step.description
747
- };
748
- this._currentFlowStep = { ...currentFlowStep,
749
- step,
750
- _initialValues
751
- };
721
+ const configuration =
722
+ typeof currentFlowStep.step.configuration === 'string'
723
+ ? JSON.parse(currentFlowStep.step.configuration)
724
+ : currentFlowStep.step.configuration;
725
+ const step = { ...currentFlowStep.step, configuration };
726
+
727
+ const _initialValues = { ...step.configuration, description: step.description };
728
+ this._currentFlowStep = { ...currentFlowStep, step, _initialValues };
752
729
 
753
730
  if (flowStepSchema && flowStepSchema.properties.scope) {
754
731
  const _enum = schema.properties.scope.enum;
755
-
756
- if (_enum.find(scope => ['REQUEST', 'REQUEST_CONTENT', 'RESPONSE', 'RESPONSE_CONTENT'].includes(scope)) != null) {
732
+ if (_enum.find((scope) => ['REQUEST', 'REQUEST_CONTENT', 'RESPONSE', 'RESPONSE_CONTENT'].includes(scope)) != null) {
757
733
  const filtered = this._currentFlowStep.group === 'pre' ? ['REQUEST', 'REQUEST_CONTENT'] : ['RESPONSE', 'RESPONSE_CONTENT'];
758
- schema.properties.scope.enum = _enum.filter(scope => filtered.includes(scope));
734
+ schema.properties.scope.enum = _enum.filter((scope) => filtered.includes(scope));
759
735
  const scope = this._currentFlowStep.step.configuration.scope;
760
-
761
736
  if (scope == null || !schema.properties.scope.enum.includes(scope)) {
762
737
  schema.properties.scope.default = schema.properties.scope.enum[0];
763
738
  this._currentFlowStep.step.configuration.scope = schema.properties.scope.enum[0];
764
739
  this._currentFlowStep._initialValues.scope = schema.properties.scope.enum[0];
765
-
766
740
  if (this._currentFlowStep._values) {
767
741
  this._currentFlowStep._values.scope = schema.properties.scope.enum[0];
768
742
  }
@@ -780,54 +754,38 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
780
754
  if (closeStepForm) {
781
755
  this._closeFlowStepForm(true);
782
756
  }
783
-
784
757
  this._definition = deepClone(this._definition);
785
758
  }
786
759
 
787
- async _onSelectFlows({
788
- detail
789
- }) {
760
+ async _onSelectFlows({ detail }) {
790
761
  try {
791
762
  await this._closeFlowStepForm();
792
-
793
763
  this._onCloseDocumentation();
794
-
795
764
  this._updateSelectedFlows(detail.flows);
796
-
797
765
  this._onDesign();
798
766
  } catch (e) {
799
767
  this._currentAskConfirmation = null;
800
768
  }
801
769
  }
802
770
 
803
- async _onOpenDocumentationFromMenu({
804
- detail: {
805
- policy
806
- }
807
- }) {
771
+ async _onOpenDocumentationFromMenu({ detail: { policy } }) {
808
772
  try {
809
773
  if (this.documentation == null || this.documentation.id !== policy.id) {
810
774
  await this._closeFlowStepForm();
811
775
  this._currentPolicyId = policy.id;
812
-
813
776
  if (this.getSelectedFlow()) {
814
777
  this._splitMainViews();
815
778
  } else {
816
779
  this._maximizeBottomView();
817
780
  }
818
-
819
- dispatchCustomEvent(this, 'fetch-documentation', {
820
- policy
821
- });
781
+ dispatchCustomEvent(this, 'fetch-documentation', { policy });
822
782
  }
823
783
  } catch (e) {}
824
784
  }
825
785
 
826
786
  _fetchDocumentation(policy) {
827
787
  if (this.documentation == null || this.documentation.id !== policy.id) {
828
- dispatchCustomEvent(this, 'fetch-documentation', {
829
- policy
830
- });
788
+ dispatchCustomEvent(this, 'fetch-documentation', { policy });
831
789
  }
832
790
  }
833
791
 
@@ -839,26 +797,20 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
839
797
 
840
798
  _onOpenDocumentationFromForm() {
841
799
  localStorage.removeItem('gv-policy-studio:keep-documentation-close');
842
-
843
800
  this._onOpenDocumentation();
844
801
  }
845
802
 
846
803
  _findFlowCollection(flowId) {
847
- const plan = this.definedPlans.find(plan => plan.flows.find(flow => flow._id === flowId) != null);
848
- return {
849
- plan,
850
- flows: plan != null ? plan.flows : this.definedFlows
851
- };
804
+ const plan = this.definedPlans.find((plan) => plan.flows.find((flow) => flow._id === flowId) != null);
805
+ return { plan, flows: plan != null ? plan.flows : this.definedFlows };
852
806
  }
853
807
 
854
808
  _findFlowById(flowId) {
855
- let flow = this.definedFlows.find(flow => flow._id === flowId);
856
-
809
+ let flow = this.definedFlows.find((flow) => flow._id === flowId);
857
810
  if (flow == null) {
858
- const plansFlows = this.definedPlans.map(plan => plan.flows).reduce((acc, val) => acc.concat(val), []);
859
- flow = plansFlows.find(flow => flow._id === flowId);
811
+ const plansFlows = this.definedPlans.map((plan) => plan.flows).reduce((acc, val) => acc.concat(val), []);
812
+ flow = plansFlows.find((flow) => flow._id === flowId);
860
813
  }
861
-
862
814
  return flow;
863
815
  }
864
816
 
@@ -867,30 +819,25 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
867
819
  return this._findFlowById(selectedFlowId);
868
820
  }
869
821
 
870
- _onTargetPolicy({
871
- detail
872
- }) {
822
+ _onTargetPolicy({ detail }) {
873
823
  if (this._currentAskConfirmation == null) {
874
824
  this._dragPolicy = detail;
875
825
  }
876
826
  }
877
827
 
878
- _onChangeFlowStep({
879
- detail
880
- }) {
828
+ _onChangeFlowStep({ detail }) {
881
829
  this._currentFlowStep._values = detail.values;
882
830
  }
883
831
 
884
832
  _writeFlowStep(values) {
885
- const {
886
- description,
887
- ...configuration
888
- } = values;
889
-
890
- if (this._currentFlowStep.step._new || this._currentFlowStep.step.description !== description || !deepEqual(this._currentFlowStep.step.configuration, configuration)) {
833
+ const { description, ...configuration } = values;
834
+ if (
835
+ this._currentFlowStep.step._new ||
836
+ this._currentFlowStep.step.description !== description ||
837
+ !deepEqual(this._currentFlowStep.step.configuration, configuration)
838
+ ) {
891
839
  const flow = this._findFlowById(this._currentFlowStep.flow._id);
892
-
893
- const position = flow[this._currentFlowStep.group].findIndex(step => step._id === this._currentFlowStep.step._id);
840
+ const position = flow[this._currentFlowStep.group].findIndex((step) => step._id === this._currentFlowStep.step._id);
894
841
 
895
842
  flow[this._currentFlowStep.group][position].description = description;
896
843
  flow[this._currentFlowStep.group][position].configuration = deepClone(configuration);
@@ -903,36 +850,23 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
903
850
  }
904
851
  }
905
852
 
906
- async _onSubmitFlowStep({
907
- detail
908
- }) {
853
+ async _onSubmitFlowStep({ detail }) {
909
854
  this._writeFlowStep(detail.values);
910
-
911
855
  await this.requestUpdate('_definition');
912
- this.getChildren().forEach(c => c.requestUpdate());
856
+ this.getChildren().forEach((c) => c.requestUpdate());
913
857
  }
914
858
 
915
859
  _onCancelFlow() {
916
860
  this._onDesign();
917
861
  }
918
862
 
919
- _onSubmitFlow({
920
- detail: {
921
- values
922
- }
923
- }) {
863
+ _onSubmitFlow({ detail: { values } }) {
924
864
  const selectedFlow = this.getSelectedFlow();
925
-
926
865
  const _values = Object.assign({}, this._createFlowFromSchema(), values);
927
-
928
866
  const selectedFlowUpdated = Object.assign({}, selectedFlow, _values);
929
-
930
867
  if (!deepEqual(selectedFlow, selectedFlowUpdated)) {
931
- Object.assign(selectedFlow, selectedFlowUpdated, {
932
- _dirty: true
933
- });
868
+ Object.assign(selectedFlow, selectedFlowUpdated, { _dirty: true });
934
869
  this.isDirty = true;
935
-
936
870
  this._refresh();
937
871
  }
938
872
  }
@@ -941,36 +875,24 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
941
875
  this._onDesign();
942
876
  }
943
877
 
944
- _onSubmitFlowMode({
945
- detail: {
946
- values
947
- }
948
- }) {
878
+ _onSubmitFlowMode({ detail: { values } }) {
949
879
  this._definition['flow-mode'] = values['flow-mode'] || 'DEFAULT';
950
880
  this.isDirty = true;
951
-
952
881
  this._refresh();
953
882
  }
954
883
 
955
- _onChangeTab({
956
- detail
957
- }) {
884
+ _onChangeTab({ detail }) {
958
885
  this._changeTab(detail.value);
959
886
  }
960
887
 
961
- async _changeTabValidator({
962
- from,
963
- to
964
- }) {
888
+ async _changeTabValidator({ from, to }) {
965
889
  if (from === 'properties') {
966
890
  const component = this.shadowRoot.querySelector('gv-properties');
967
-
968
891
  if (component.dirty) {
969
892
  return component.confirm();
970
893
  }
971
894
  } else if (from === 'resources') {
972
895
  const component = this.shadowRoot.querySelector('gv-resources');
973
-
974
896
  if (component.dirty) {
975
897
  return component.confirm();
976
898
  }
@@ -982,7 +904,6 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
982
904
  throw e;
983
905
  }
984
906
  }
985
-
986
907
  return Promise.resolve();
987
908
  }
988
909
 
@@ -993,9 +914,7 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
993
914
  }
994
915
  }
995
916
 
996
- _onDragStartFlowStep(flow, {
997
- detail
998
- }) {
917
+ _onDragStartFlowStep(flow, { detail }) {
999
918
  if (this._currentAskConfirmation == null) {
1000
919
  this._dropPolicy = detail;
1001
920
  this._dragPolicy = detail;
@@ -1003,57 +922,88 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1003
922
  }
1004
923
 
1005
924
  _renderFlowEmptyState(readonlyMode) {
1006
- return html`<div slot="content" class="empty"> <div> Select a flow ${readonlyMode !== true ? html`or <gv-button @gv-button:click="${this._onAddFlow}" outlined icon="code:plus" large>design new one</gv-button>` : ''} </div> </div>`;
925
+ return html`<div slot="content" class="empty">
926
+ <div>
927
+ Select a flow
928
+ ${readonlyMode !== true
929
+ ? html`or <gv-button @gv-button:click="${this._onAddFlow}" outlined icon="code:plus" large>design new one</gv-button>`
930
+ : ''}
931
+ </div>
932
+ </div>`;
1007
933
  }
1008
934
 
1009
935
  _renderFlow(index = 0, hasEmptyState = true, readonlyMode) {
1010
936
  const flow = this.getSelectedFlow(index);
1011
-
1012
937
  if (flow) {
1013
- const {
1014
- plan
1015
- } = this._findFlowCollection(flow._id);
1016
-
938
+ const { plan } = this._findFlowCollection(flow._id);
1017
939
  const selectedStepId = this._currentFlowStep ? this._currentFlowStep.step._id : null;
1018
- return html` <gv-flow style="height:100%" .id="${flow._id}" .flow="${flow}" .plan="${plan}" .policies="${this.policies}" slot="content" ?disabled="${this._currentAskConfirmation}" .dragPolicy="${this._dragPolicy}" .dropPolicy="${this._dropPolicy}" .selectedStepId="${selectedStepId}" ?readonly="${readonlyMode}" ?has-policy-filter="${this._policyFilterOptions != null}" flows-title="${this.flowsTitle}" @gv-flow:drag-start="${this._onDragStartFlowStep.bind(this, flow)}" @gv-flow:edit="${this._onEditFlowStep}" @gv-flow:change-state="${this._onChangeFlowStepState}" @gv-flow:drop="${this._onDropPolicy}" @gv-flow:delete="${this._onDeletePolicy}"></gv-flow>`;
940
+ return html` <gv-flow
941
+ style="height: 100%"
942
+ .id="${flow._id}"
943
+ .flow="${flow}"
944
+ .plan="${plan}"
945
+ .policies="${this.policies}"
946
+ slot="content"
947
+ ?disabled="${this._currentAskConfirmation}"
948
+ .dragPolicy="${this._dragPolicy}"
949
+ .dropPolicy="${this._dropPolicy}"
950
+ .selectedStepId="${selectedStepId}"
951
+ ?readonly="${readonlyMode}"
952
+ ?has-policy-filter="${this._policyFilterOptions != null}"
953
+ flows-title="${this.flowsTitle}"
954
+ @gv-flow:drag-start="${this._onDragStartFlowStep.bind(this, flow)}"
955
+ @gv-flow:edit="${this._onEditFlowStep}"
956
+ @gv-flow:change-state="${this._onChangeFlowStepState}"
957
+ @gv-flow:drop="${this._onDropPolicy}"
958
+ @gv-flow:delete="${this._onDeletePolicy}"
959
+ ></gv-flow>`;
1019
960
  } else if (hasEmptyState) {
1020
961
  return this._renderFlowEmptyState(readonlyMode);
1021
962
  }
1022
-
1023
963
  return html``;
1024
964
  }
1025
965
 
1026
966
  _onFetchResources(event) {
1027
- const {
1028
- currentTarget,
1029
- regexTypes
1030
- } = event.detail;
1031
- const options = this.definedResources.filter(resource => regexTypes == null || new RegExp(regexTypes).test(resource.type)).map((resource, index) => {
1032
- const resourceType = this.resourceTypes.find(type => type.id === resource.type);
1033
- const row = document.createElement('gv-row');
1034
- const picture = resourceType.icon ? resourceType.icon : null;
1035
- row.item = {
1036
- picture,
1037
- name: resource.name
1038
- };
1039
- return {
1040
- element: row,
1041
- value: resource.name,
1042
- id: resource.type
1043
- };
1044
- });
967
+ const { currentTarget, regexTypes } = event.detail;
968
+ const options = this.definedResources
969
+ .filter((resource) => regexTypes == null || new RegExp(regexTypes).test(resource.type))
970
+ .map((resource, index) => {
971
+ const resourceType = this.resourceTypes.find((type) => type.id === resource.type);
972
+ const row = document.createElement('gv-row');
973
+ const picture = resourceType.icon ? resourceType.icon : null;
974
+ row.item = { picture, name: resource.name };
975
+ return {
976
+ element: row,
977
+ value: resource.name,
978
+ id: resource.type,
979
+ };
980
+ });
1045
981
  currentTarget.options = options;
1046
982
  }
1047
983
 
1048
984
  _renderPolicy(readonlyMode) {
1049
985
  if (this._flowStepSchema && this.documentation) {
1050
- return html`<gv-resizable-views direction="horizontal" no-overflow> <div slot="top">${this._renderFlowStepForm(readonlyMode)}</div> <div slot="bottom"> <gv-documentation .text="${this.documentation.content}" .image="${this.documentation.image}" ?disabled="${this._currentAskConfirmation}" @gv-documentation:close="${this._onCloseDocumentation}"></gv-documentation> </div> </gv-resizable-views>`;
986
+ return html`<gv-resizable-views direction="horizontal" no-overflow>
987
+ <div slot="top">${this._renderFlowStepForm(readonlyMode)}</div>
988
+ <div slot="bottom">
989
+ <gv-documentation
990
+ .text="${this.documentation.content}"
991
+ .image="${this.documentation.image}"
992
+ ?disabled="${this._currentAskConfirmation}"
993
+ @gv-documentation:close="${this._onCloseDocumentation}"
994
+ ></gv-documentation>
995
+ </div>
996
+ </gv-resizable-views>`;
1051
997
  } else if (this.documentation) {
1052
- return html`<gv-documentation .text="${this.documentation.content}" .image="${this.documentation.image}" ?disabled="${this._currentAskConfirmation}" @gv-documentation:close="${this._onCloseDocumentation}"></gv-documentation>`;
998
+ return html`<gv-documentation
999
+ .text="${this.documentation.content}"
1000
+ .image="${this.documentation.image}"
1001
+ ?disabled="${this._currentAskConfirmation}"
1002
+ @gv-documentation:close="${this._onCloseDocumentation}"
1003
+ ></gv-documentation>`;
1053
1004
  } else if (this._flowStepSchema) {
1054
1005
  return this._renderFlowStepForm(readonlyMode);
1055
1006
  }
1056
-
1057
1007
  return html``;
1058
1008
  }
1059
1009
 
@@ -1064,7 +1014,6 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1064
1014
  _onResetFlowStep() {
1065
1015
  if (this._currentFlowStep) {
1066
1016
  delete this._currentFlowStep._values;
1067
-
1068
1017
  this._getFlowStepForm().reset();
1069
1018
  }
1070
1019
  }
@@ -1085,51 +1034,45 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1085
1034
  if (list) {
1086
1035
  return list.map((e, index) => {
1087
1036
  const _id = `${prefix}_${index}`;
1088
-
1089
1037
  if (isFlow) {
1090
1038
  if (e.pre) {
1091
- e.pre.forEach((step, stepIndex) => step._id = this._generateFlowStepId(_id, 'pre', stepIndex));
1039
+ e.pre.forEach((step, stepIndex) => (step._id = this._generateFlowStepId(_id, 'pre', stepIndex)));
1092
1040
  }
1093
-
1094
1041
  if (e.post) {
1095
- e.post.forEach((step, stepIndex) => step._id = this._generateFlowStepId(_id, 'post', stepIndex));
1042
+ e.post.forEach((step, stepIndex) => (step._id = this._generateFlowStepId(_id, 'post', stepIndex)));
1096
1043
  }
1097
1044
  }
1098
-
1099
1045
  if (force || e._id == null) {
1100
- return { ...e,
1101
- _id
1102
- };
1046
+ return { ...e, _id };
1103
1047
  }
1104
-
1105
1048
  return e;
1106
1049
  });
1107
1050
  }
1108
-
1109
1051
  return list;
1110
1052
  }
1111
1053
 
1112
1054
  getChildren() {
1113
- return [...Array.from(this.shadowRoot.querySelectorAll('gv-flow')), ...Array.from(this.shadowRoot.querySelectorAll('gv-resizable-views'))];
1055
+ return [
1056
+ ...Array.from(this.shadowRoot.querySelectorAll('gv-flow')),
1057
+ ...Array.from(this.shadowRoot.querySelectorAll('gv-resizable-views')),
1058
+ ];
1114
1059
  }
1115
1060
 
1116
1061
  async getUpdateComplete() {
1117
1062
  await super.getUpdateComplete();
1118
- await Promise.all(this.getChildren().map(e => e.updateComplete));
1063
+ await Promise.all(this.getChildren().map((e) => e.updateComplete));
1119
1064
  }
1120
1065
 
1121
1066
  shouldUpdate(changedProperties) {
1122
1067
  // Just refresh gv-flow components
1123
1068
  if (changedProperties.has('_dragPolicy')) {
1124
- this.shadowRoot.querySelectorAll('gv-flow').forEach(flow => flow.dragPolicy = this._dragPolicy);
1069
+ this.shadowRoot.querySelectorAll('gv-flow').forEach((flow) => (flow.dragPolicy = this._dragPolicy));
1125
1070
  return false;
1126
1071
  }
1127
-
1128
1072
  if (changedProperties.has('_dropPolicy')) {
1129
- this.shadowRoot.querySelectorAll('gv-flow').forEach(flow => flow.dropPolicy = this._dropPolicy);
1073
+ this.shadowRoot.querySelectorAll('gv-flow').forEach((flow) => (flow.dropPolicy = this._dropPolicy));
1130
1074
  return false;
1131
1075
  }
1132
-
1133
1076
  return super.shouldUpdate(changedProperties);
1134
1077
  }
1135
1078
 
@@ -1141,12 +1084,52 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1141
1084
 
1142
1085
  _renderFlowStepForm(readonlyMode) {
1143
1086
  const values = this._currentFlowStep._values || this._currentFlowStep._initialValues;
1144
- return html`${cache(this._flowStepSchema && this._currentFlowStep ? html`<div class="flow-step__container"> <div class="flow-step__form"> <gv-schema-form .id="${FLOW_STEP_FORM_ID}" .schema="${this._flowStepSchema}" .icon="design:edit" has-header validate-on-render .values="${values}" .dirty="${this._currentFlowStep._values != null}" ?readonly="${readonlyMode}" scrollable @gv-schema-form:change="${this._onChangeFlowStep}" @gv-schema-form:reset="${this._onResetFlowStep}" @gv-schema-form:fetch-resources="${this._onFetchResources}" @gv-schema-form:submit="${this._onSubmitFlowStep}"> <div slot="title" class="flow-step__form-title">${this._currentFlowStep.step.name}</div> <gv-button slot="header-left" icon="general:close" outlined small @gv-button:click="${this._onCloseFlowStepForm}" title="Close (esc)"></gv-button> <gv-button slot="header-left" icon="home:book" ?disabled="${this.documentation != null}" outlined small @gv-button:click="${this._onOpenDocumentationFromForm}" title="Open documentation"></gv-button> </gv-schema-form> </div> </div>` : '')}`;
1087
+ return html`${cache(
1088
+ this._flowStepSchema && this._currentFlowStep
1089
+ ? html`<div class="flow-step__container">
1090
+ <div class="flow-step__form">
1091
+ <gv-schema-form
1092
+ .id="${FLOW_STEP_FORM_ID}"
1093
+ .schema="${this._flowStepSchema}"
1094
+ .icon="design:edit"
1095
+ has-header
1096
+ validate-on-render
1097
+ .values="${values}"
1098
+ .dirty="${this._currentFlowStep._values != null}"
1099
+ ?readonly="${readonlyMode}"
1100
+ scrollable
1101
+ @gv-schema-form:change="${this._onChangeFlowStep}"
1102
+ @gv-schema-form:reset="${this._onResetFlowStep}"
1103
+ @gv-schema-form:fetch-resources="${this._onFetchResources}"
1104
+ @gv-schema-form:submit="${this._onSubmitFlowStep}"
1105
+ >
1106
+ <div slot="title" class="flow-step__form-title">${this._currentFlowStep.step.name}</div>
1107
+ <gv-button
1108
+ slot="header-left"
1109
+ icon="general:close"
1110
+ outlined
1111
+ small
1112
+ @gv-button:click="${this._onCloseFlowStepForm}"
1113
+ title="Close"
1114
+ ></gv-button>
1115
+ <gv-button
1116
+ slot="header-left"
1117
+ icon="home:book"
1118
+ ?disabled="${this.documentation != null}"
1119
+ outlined
1120
+ small
1121
+ @gv-button:click="${this._onOpenDocumentationFromForm}"
1122
+ title="Open documentation"
1123
+ ></gv-button>
1124
+ </gv-schema-form>
1125
+ </div>
1126
+ </div>`
1127
+ : '',
1128
+ )}`;
1145
1129
  }
1146
1130
 
1147
1131
  _onCloseDocumentation() {
1148
1132
  this.documentation = null;
1149
-
1150
1133
  if (this._currentFlowStep == null) {
1151
1134
  this._maximizeTopView();
1152
1135
  } else {
@@ -1154,17 +1137,10 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1154
1137
  }
1155
1138
  }
1156
1139
 
1157
- _onDeleteFlow({
1158
- detail
1159
- }) {
1140
+ _onDeleteFlow({ detail }) {
1160
1141
  const flowId = detail.content._id;
1161
-
1162
- const {
1163
- flows
1164
- } = this._findFlowCollection(flowId);
1165
-
1166
- const flow = flows.find(flow => flow._id === flowId);
1167
-
1142
+ const { flows } = this._findFlowCollection(flowId);
1143
+ const flow = flows.find((flow) => flow._id === flowId);
1168
1144
  this._deleteFlow(flows, flow);
1169
1145
  }
1170
1146
 
@@ -1184,20 +1160,13 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1184
1160
  return this._definition && this._definition.properties ? this._definition.properties : [];
1185
1161
  }
1186
1162
 
1187
- async _onDuplicateFlow({
1188
- detail
1189
- }) {
1163
+ async _onDuplicateFlow({ detail }) {
1190
1164
  try {
1191
1165
  await this._askToValidateForms();
1192
- const flowId = detail.content._id;
1193
-
1194
- const {
1195
- plan,
1196
- flows
1197
- } = this._findFlowCollection(flowId);
1198
1166
 
1167
+ const flowId = detail.content._id;
1168
+ const { plan, flows } = this._findFlowCollection(flowId);
1199
1169
  this._addFlow(flows, this._findFlowById(flowId));
1200
-
1201
1170
  if (plan != null) {
1202
1171
  let planIndex = null;
1203
1172
  this.definedPlans.find((p, i) => {
@@ -1205,16 +1174,13 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1205
1174
  planIndex = i;
1206
1175
  return true;
1207
1176
  }
1208
-
1209
1177
  return false;
1210
1178
  });
1211
1179
  plan.flows = flows;
1212
1180
  this.definedPlans[planIndex].flows = this._generatePlanFlowsId(plan, true);
1213
-
1214
1181
  this._updateSelectedFlows([this.definedPlans[planIndex].flows[flows.length - 1]._id]);
1215
1182
  } else {
1216
1183
  this._definition.flows = this._generateFlowsId(this._definition.flows);
1217
-
1218
1184
  this._updateSelectedFlows([this._definition.flows[this._definition.flows.length - 1]._id]);
1219
1185
  }
1220
1186
  } catch (err) {
@@ -1222,26 +1188,18 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1222
1188
  }
1223
1189
  }
1224
1190
 
1225
- _onChangeFlowState({
1226
- detail
1227
- }) {
1191
+ _onChangeFlowState({ detail }) {
1228
1192
  const flow = this._findFlowById(detail.content._id);
1229
-
1230
1193
  flow.enabled = detail.enabled;
1231
1194
  flow._dirty = true;
1232
1195
  this.isDirty = true;
1233
1196
  }
1234
1197
 
1235
- async _onAddFlowPlan({
1236
- detail
1237
- }) {
1198
+ async _onAddFlowPlan({ detail }) {
1238
1199
  try {
1239
1200
  await this._askToValidateForms();
1240
-
1241
1201
  this._addFlow(this.definedPlans[detail.planIndex].flows);
1242
-
1243
1202
  this.definedPlans[detail.planIndex].flows = this._generatePlanFlowsId(this.definedPlans[detail.planIndex]);
1244
-
1245
1203
  this._updateSelectedFlows([this.definedPlans[detail.planIndex].flows[this.definedPlans[detail.planIndex].flows.length - 1]._id]);
1246
1204
  } catch (err) {
1247
1205
  this._currentAskConfirmation = null;
@@ -1253,9 +1211,7 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1253
1211
  await this._askToValidateForms();
1254
1212
 
1255
1213
  this._addFlow(this._definition.flows);
1256
-
1257
1214
  this._definition.flows = this._generateFlowsId(this._definition.flows);
1258
-
1259
1215
  this._updateSelectedFlows([this._definition.flows[this._definition.flows.length - 1]._id]);
1260
1216
  } catch (err) {
1261
1217
  this._currentAskConfirmation = null;
@@ -1263,12 +1219,17 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1263
1219
  }
1264
1220
 
1265
1221
  _addFlow(collection, duplicate = null) {
1266
- const flow = duplicate == null ? this._createFlowFromSchema() : { ...duplicate,
1267
- _id: null,
1268
- // reset the id to avoid issue with AM that persists the ID
1269
- id: null,
1270
- _dirty: true
1271
- };
1222
+ const flow =
1223
+ duplicate == null
1224
+ ? this._createFlowFromSchema()
1225
+ : {
1226
+ ...duplicate,
1227
+ _id: null,
1228
+ // reset the id to avoid issue with AM that persists the ID
1229
+ id: null,
1230
+ _dirty: true,
1231
+ };
1232
+
1272
1233
  collection.push(flow);
1273
1234
  this.isDirty = true;
1274
1235
  return collection;
@@ -1279,23 +1240,22 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1279
1240
  name: '',
1280
1241
  pre: [],
1281
1242
  post: [],
1282
- _dirty: true
1243
+ _dirty: true,
1283
1244
  };
1245
+
1284
1246
  return this._instantiate(this.flowSchema.properties, newFlow);
1285
1247
  }
1286
1248
 
1287
1249
  _instantiate(propertiesDefinition, initiator = {}) {
1288
- const property = { ...initiator
1289
- };
1250
+ const property = { ...initiator };
1290
1251
 
1291
1252
  if (propertiesDefinition) {
1292
1253
  for (const key of Object.keys(propertiesDefinition)) {
1293
1254
  const entry = propertiesDefinition[key];
1294
1255
 
1295
1256
  if (entry.type === 'object') {
1296
- property[key] = this._instantiate(entry.properties, initiator = {});
1257
+ property[key] = this._instantiate(entry.properties, (initiator = {}));
1297
1258
  }
1298
-
1299
1259
  if (entry.default !== undefined) {
1300
1260
  property[key] = entry.default;
1301
1261
  } else if (entry.type === 'string') {
@@ -1310,18 +1270,14 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1310
1270
  _deleteFlow(collection, flow) {
1311
1271
  const index = collection.indexOf(flow);
1312
1272
  collection.splice(index, 1);
1313
- const selectedFlows = this.selectedFlowsId.filter(flowId => flowId !== flow._id);
1314
-
1273
+ const selectedFlows = this.selectedFlowsId.filter((flowId) => flowId !== flow._id);
1315
1274
  if (selectedFlows.length === 1) {
1316
1275
  this._updateSelectedFlows(selectedFlows);
1317
1276
  } else {
1318
1277
  this._selectFirstFlow(true);
1319
1278
  }
1320
-
1321
1279
  this._changeTab('design');
1322
-
1323
1280
  this._refresh();
1324
-
1325
1281
  this.isDirty = true;
1326
1282
  }
1327
1283
 
@@ -1332,44 +1288,36 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1332
1288
  index = i;
1333
1289
  return true;
1334
1290
  }
1335
-
1336
1291
  return false;
1337
1292
  });
1338
1293
  return index;
1339
1294
  }
1340
1295
 
1341
- async _onReorderFlows({
1342
- detail: {
1343
- plan
1344
- }
1345
- }) {
1296
+ async _onReorderFlows({ detail: { plan } }) {
1346
1297
  try {
1347
1298
  await this._askToValidateForms();
1348
1299
  this.isDirty = true;
1349
-
1350
1300
  if (plan != null) {
1351
1301
  const newOrder = this._generatePlanFlowsId(plan, true);
1352
-
1353
1302
  if (this.selectedFlowsId) {
1354
- this._updateSelectedFlows(this.selectedFlowsId.map(flowId => {
1355
- const index = this._findFlowIndex(plan.flows, flowId);
1356
-
1357
- return index != null ? newOrder[index]._id : flowId;
1358
- }));
1303
+ this._updateSelectedFlows(
1304
+ this.selectedFlowsId.map((flowId) => {
1305
+ const index = this._findFlowIndex(plan.flows, flowId);
1306
+ return index != null ? newOrder[index]._id : flowId;
1307
+ }),
1308
+ );
1359
1309
  }
1360
-
1361
1310
  plan.flows = newOrder;
1362
1311
  } else {
1363
1312
  const newOrder = this._generateFlowsId(this._definition.flows, true);
1364
-
1365
1313
  if (this.selectedFlowsId) {
1366
- this._updateSelectedFlows(this.selectedFlowsId.map(flowId => {
1367
- const index = this._findFlowIndex(this._definition.flows, flowId);
1368
-
1369
- return index != null ? newOrder[index]._id : flowId;
1370
- }));
1314
+ this._updateSelectedFlows(
1315
+ this.selectedFlowsId.map((flowId) => {
1316
+ const index = this._findFlowIndex(this._definition.flows, flowId);
1317
+ return index != null ? newOrder[index]._id : flowId;
1318
+ }),
1319
+ );
1371
1320
  }
1372
-
1373
1321
  this._definition.flows = newOrder;
1374
1322
  }
1375
1323
  } catch (err) {
@@ -1377,9 +1325,7 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1377
1325
  }
1378
1326
  }
1379
1327
 
1380
- _onSearchPolicy({
1381
- detail
1382
- }) {
1328
+ _onSearchPolicy({ detail }) {
1383
1329
  this._searchPolicyQuery = detail;
1384
1330
  }
1385
1331
 
@@ -1387,9 +1333,7 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1387
1333
  this._searchPolicyQuery = null;
1388
1334
  }
1389
1335
 
1390
- _onSearchFlows({
1391
- detail
1392
- }) {
1336
+ _onSearchFlows({ detail }) {
1393
1337
  this._searchFlowQuery = detail;
1394
1338
  }
1395
1339
 
@@ -1411,26 +1355,27 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1411
1355
  }
1412
1356
 
1413
1357
  _removePrivateProperties(o) {
1414
- const copy = { ...o
1415
- };
1416
- Object.keys(o).filter(key => key.startsWith('_')).forEach(key => {
1417
- delete copy[key];
1418
- });
1358
+ const copy = { ...o };
1359
+ Object.keys(o)
1360
+ .filter((key) => key.startsWith('_'))
1361
+ .forEach((key) => {
1362
+ delete copy[key];
1363
+ });
1419
1364
  return copy;
1420
1365
  }
1421
1366
 
1422
1367
  _submitOrConfirmForms() {
1423
- return [...this.shadowRoot.querySelectorAll('gv-schema-form')].filter(form => {
1424
- const isValid = form.isValid();
1425
-
1426
- if (isValid) {
1427
- form.submit();
1428
- } else {
1429
- form.dirty = true;
1430
- }
1431
-
1432
- return !isValid;
1433
- }).map(form => form.confirm());
1368
+ return [...this.shadowRoot.querySelectorAll('gv-schema-form')]
1369
+ .filter((form) => {
1370
+ const isValid = form.isValid();
1371
+ if (isValid) {
1372
+ form.submit();
1373
+ } else {
1374
+ form.dirty = true;
1375
+ }
1376
+ return !isValid;
1377
+ })
1378
+ .map((form) => form.confirm());
1434
1379
  }
1435
1380
 
1436
1381
  getPropertiesElement() {
@@ -1439,20 +1384,18 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1439
1384
 
1440
1385
  async _checkCurrentFlowStep() {
1441
1386
  if (this._currentFlowStep && this.selectedFlowsId) {
1442
- const closePromises = this.selectedFlowsId.map(flowId => {
1443
- const flow = this._findFlowById(flowId);
1444
-
1445
- const currentStep = [...flow.pre, ...flow.post].find(step => step._id === this._currentFlowStep.step._id);
1446
-
1447
- if (currentStep == null) {
1448
- return this._closeFlowStepForm(true);
1449
- }
1450
-
1451
- return null;
1452
- }).filter(p => p !== null);
1387
+ const closePromises = this.selectedFlowsId
1388
+ .map((flowId) => {
1389
+ const flow = this._findFlowById(flowId);
1390
+ const currentStep = [...flow.pre, ...flow.post].find((step) => step._id === this._currentFlowStep.step._id);
1391
+ if (currentStep == null) {
1392
+ return this._closeFlowStepForm(true);
1393
+ }
1394
+ return null;
1395
+ })
1396
+ .filter((p) => p !== null);
1453
1397
  return Promise.all(closePromises);
1454
1398
  }
1455
-
1456
1399
  return Promise.resolve();
1457
1400
  }
1458
1401
 
@@ -1462,95 +1405,71 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1462
1405
  this._definition = deepClone(this._definitionSaved);
1463
1406
  this._definitionSaved = null;
1464
1407
  this.isDirty = false;
1465
-
1466
1408
  this._checkCurrentFlowStep();
1467
-
1468
- this.definedPlans.forEach(plan => {
1469
- plan.flows.forEach(flow => flow._dirty = false);
1409
+ this.definedPlans.forEach((plan) => {
1410
+ plan.flows.forEach((flow) => (flow._dirty = false));
1470
1411
  });
1471
- this.definedFlows.forEach(flow => flow._dirty = false);
1472
- this.getChildren().forEach(e => e.requestUpdate());
1412
+ this.definedFlows.forEach((flow) => (flow._dirty = false));
1413
+ this.getChildren().forEach((e) => e.requestUpdate());
1473
1414
  }
1474
1415
  }
1475
1416
 
1476
1417
  _buildDefinitionToSave() {
1477
1418
  // Copy definition and remove invalid step
1478
1419
  // Keep private properties like _id and others stuff useful for render
1479
- const flows = this._definition.flows.map(flow => {
1420
+ const flows = this._definition.flows.map((flow) => {
1480
1421
  flow.pre = flow.pre.filter(this._filterNotValidStep);
1481
1422
  flow.post = flow.post.filter(this._filterNotValidStep);
1482
1423
  return flow;
1483
1424
  });
1484
1425
 
1485
- let definition = { ...this._definition,
1486
- flows
1487
- };
1426
+ let definition = { ...this._definition, flows };
1488
1427
 
1489
1428
  if (this._definition.plans != null) {
1490
- const plans = this._definition.plans.map(plan => {
1491
- const flows = plan.flows.map(flow => {
1429
+ const plans = this._definition.plans.map((plan) => {
1430
+ const flows = plan.flows.map((flow) => {
1492
1431
  flow.pre = flow.pre.filter(this._filterNotValidStep);
1493
1432
  flow.post = flow.post.filter(this._filterNotValidStep);
1494
1433
  return flow;
1495
1434
  });
1496
- return { ...plan,
1497
- flows
1498
- };
1435
+ return { ...plan, flows };
1499
1436
  });
1500
-
1501
- definition = { ...definition,
1502
- plans
1503
- };
1437
+ definition = { ...definition, plans };
1504
1438
  }
1505
-
1506
1439
  return definition;
1507
1440
  }
1508
1441
 
1509
1442
  _buildDefinitionToSend(definitionToSave) {
1510
1443
  // Copy definition and remove all private properties
1511
- const flows = definitionToSave.flows.map(f => {
1444
+ const flows = definitionToSave.flows.map((f) => {
1512
1445
  const flow = this._removePrivateProperties(f);
1513
-
1514
1446
  flow.pre = flow.pre.map(this._removePrivateProperties);
1515
1447
  flow.post = flow.post.map(this._removePrivateProperties);
1516
1448
  return flow;
1517
1449
  });
1518
- let definition = { ...this._definition,
1519
- flows
1520
- };
1521
1450
 
1451
+ let definition = { ...this._definition, flows };
1522
1452
  if (this._definition.plans != null) {
1523
- const plans = definitionToSave.plans.map(plan => {
1524
- const flows = plan.flows.map(f => {
1453
+ const plans = definitionToSave.plans.map((plan) => {
1454
+ const flows = plan.flows.map((f) => {
1525
1455
  const flow = this._removePrivateProperties(f);
1526
-
1527
1456
  flow.pre = flow.pre.map(this._removePrivateProperties);
1528
1457
  flow.post = flow.post.map(this._removePrivateProperties);
1529
1458
  return flow;
1530
1459
  });
1531
- return { ...plan,
1532
- flows
1533
- };
1460
+ return { ...plan, flows };
1534
1461
  });
1535
- definition = { ...definition,
1536
- plans
1537
- };
1462
+ definition = { ...definition, plans };
1538
1463
  }
1539
1464
 
1540
1465
  if (this._definition.properties != null) {
1541
1466
  const properties = this._definition.properties.map(this._removePrivateProperties);
1542
-
1543
- definition = { ...definition,
1544
- properties
1545
- };
1467
+ definition = { ...definition, properties };
1546
1468
  }
1547
1469
 
1548
1470
  if (this._definition.resources != null) {
1549
1471
  const resources = this._definition.resources.map(this._removePrivateProperties);
1550
-
1551
- definition = { ...definition,
1552
- resources
1553
- };
1472
+ definition = { ...definition, resources };
1554
1473
  }
1555
1474
 
1556
1475
  return definition;
@@ -1561,18 +1480,15 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1561
1480
  this.getPropertiesElement().submit();
1562
1481
  }
1563
1482
 
1564
- Promise.all(this._submitOrConfirmForms()).then(() => {
1565
- this._definitionSaved = this._buildDefinitionToSave();
1566
-
1567
- const definition = this._buildDefinitionToSend(this._definitionSaved);
1568
-
1569
- dispatchCustomEvent(this, 'save', {
1570
- definition,
1571
- services: this.services
1483
+ Promise.all(this._submitOrConfirmForms())
1484
+ .then(() => {
1485
+ this._definitionSaved = this._buildDefinitionToSave();
1486
+ const definition = this._buildDefinitionToSend(this._definitionSaved);
1487
+ dispatchCustomEvent(this, 'save', { definition, services: this.services });
1488
+ })
1489
+ .catch((err) => {
1490
+ console.error(`[policy-studio] Error on save`, err);
1572
1491
  });
1573
- }).catch(err => {
1574
- console.error(`[policy-studio] Error on save`, err);
1575
- });
1576
1492
  }
1577
1493
 
1578
1494
  _onDebug(requestEvent) {
@@ -1580,24 +1496,20 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1580
1496
  this.getPropertiesElement().submit();
1581
1497
  }
1582
1498
 
1583
- Promise.all(this._submitOrConfirmForms()).then(() => {
1584
- const definition = this._buildDefinitionToSend(this._buildDefinitionToSave());
1585
-
1586
- dispatchCustomEvent(this, 'debug', {
1587
- definition,
1588
- services: this.services,
1589
- request: requestEvent.detail.request
1499
+ Promise.all(this._submitOrConfirmForms())
1500
+ .then(() => {
1501
+ const definition = this._buildDefinitionToSend(this._buildDefinitionToSave());
1502
+ dispatchCustomEvent(this, 'debug', { definition, services: this.services, request: requestEvent.detail.request });
1503
+ })
1504
+ .catch((err) => {
1505
+ console.error(`[policy-studio] Error on debug`, err);
1590
1506
  });
1591
- }).catch(err => {
1592
- console.error(`[policy-studio] Error on debug`, err);
1593
- });
1594
1507
  }
1595
1508
 
1596
1509
  get filteredFlows() {
1597
1510
  if (this._flowFilter.length === 0 || this._flowFilter.includes('api')) {
1598
1511
  return this.definedFlows;
1599
1512
  }
1600
-
1601
1513
  return null;
1602
1514
  }
1603
1515
 
@@ -1605,13 +1517,10 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1605
1517
  if (this._flowFilter.length === 0 || this._flowFilter.includes('plan')) {
1606
1518
  return this.definedPlans;
1607
1519
  }
1608
-
1609
1520
  return null;
1610
1521
  }
1611
1522
 
1612
- _onFilterFlows({
1613
- detail
1614
- }) {
1523
+ _onFilterFlows({ detail }) {
1615
1524
  if (this._flowFilter.includes(detail.id)) {
1616
1525
  this._flowFilter = [];
1617
1526
  } else {
@@ -1621,17 +1530,16 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1621
1530
 
1622
1531
  _getFilteredPolicies() {
1623
1532
  if (this._policyFilter.length > 0) {
1624
- return this.policies.filter(policy => {
1625
- return policy.onRequest && this._policyFilter.includes('onRequest') || policy.onResponse && this._policyFilter.includes('onResponse');
1533
+ return this.policies.filter((policy) => {
1534
+ return (
1535
+ (policy.onRequest && this._policyFilter.includes('onRequest')) || (policy.onResponse && this._policyFilter.includes('onResponse'))
1536
+ );
1626
1537
  });
1627
1538
  }
1628
-
1629
1539
  return this.policies;
1630
1540
  }
1631
1541
 
1632
- _onFilterPolicies({
1633
- detail
1634
- }) {
1542
+ _onFilterPolicies({ detail }) {
1635
1543
  if (this._policyFilter.includes(detail.id)) {
1636
1544
  this._policyFilter = [];
1637
1545
  } else {
@@ -1640,7 +1548,52 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1640
1548
  }
1641
1549
 
1642
1550
  _renderDesign(readonlyMode) {
1643
- return html` <div id="design" slot="content" class="design"> <gv-resizable-views no-overflow> <div slot="top">${this._renderFlow(0, true, readonlyMode)}</div> <div slot="bottom"> ${this._renderFlow(1, false, readonlyMode)} ${this._renderPolicy(readonlyMode)} ${this._renderFlowForm(readonlyMode)} </div> </gv-resizable-views> ${readonlyMode !== true ? html`<gv-policy-studio-menu class="right-menu" ?disabled="${this._currentAskConfirmation}" .policies="${this._getFilteredPolicies()}" .selectedIds="${[this._currentPolicyId]}" .query="${this._searchPolicyQuery}" ?has-policy-filter="${this._policyFilterOptions != null}" ?readonly="${readonlyMode}" @gv-policy-studio-menu:target-policy="${this._onTargetPolicy}" @gv-policy-studio-menu:fetch-documentation="${this._onOpenDocumentationFromMenu}" @gv-policy-studio-menu:dragend-policy="${this._onDragEndPolicy}"> <div slot="header" class="search-policies"> ${this._policyFilterOptions != null ? html`<gv-option ?disabled="${this._currentAskConfirmation}" .options="${this._policyFilterOptions}" multiple="multiple" outlined .value="${this._policyFilter}" small @gv-option:select="${this._onFilterPolicies}"></gv-option>` : ''} <gv-input id="search-policy" ?disabled="${this._currentAskConfirmation}" placeholder="Filter policies (Shift + Ctrl + Space)" type="search" small @gv-input:input="${this._onSearchPolicy}" @gv-input:clear="${this._onClearPolicy}"></gv-input> </div> </gv-policy-studio-menu>` : ''} </div>`;
1551
+ return html` <div id="design" slot="content" class="design">
1552
+ <gv-resizable-views no-overflow>
1553
+ <div slot="top">${this._renderFlow(0, true, readonlyMode)}</div>
1554
+
1555
+ <div slot="bottom">
1556
+ ${this._renderFlow(1, false, readonlyMode)} ${this._renderPolicy(readonlyMode)} ${this._renderFlowForm(readonlyMode)}
1557
+ </div>
1558
+ </gv-resizable-views>
1559
+ ${readonlyMode !== true
1560
+ ? html`<gv-policy-studio-menu
1561
+ class="right-menu"
1562
+ ?disabled="${this._currentAskConfirmation}"
1563
+ .policies="${this._getFilteredPolicies()}"
1564
+ .selectedIds="${[this._currentPolicyId]}"
1565
+ .query="${this._searchPolicyQuery}"
1566
+ ?has-policy-filter="${this._policyFilterOptions != null}"
1567
+ ?readonly="${readonlyMode}"
1568
+ @gv-policy-studio-menu:target-policy="${this._onTargetPolicy}"
1569
+ @gv-policy-studio-menu:fetch-documentation="${this._onOpenDocumentationFromMenu}"
1570
+ @gv-policy-studio-menu:dragend-policy="${this._onDragEndPolicy}"
1571
+ >
1572
+ <div slot="header" class="search-policies">
1573
+ ${this._policyFilterOptions != null
1574
+ ? html`<gv-option
1575
+ ?disabled="${this._currentAskConfirmation}"
1576
+ .options="${this._policyFilterOptions}"
1577
+ multiple
1578
+ outlined
1579
+ .value="${this._policyFilter}"
1580
+ small
1581
+ @gv-option:select="${this._onFilterPolicies}"
1582
+ ></gv-option>`
1583
+ : ''}
1584
+ <gv-input
1585
+ id="search-policy"
1586
+ ?disabled="${this._currentAskConfirmation}"
1587
+ placeholder="Filter policies (Shift + Ctrl + Space)"
1588
+ type="search"
1589
+ small
1590
+ @gv-input:input="${this._onSearchPolicy}"
1591
+ @gv-input:clear="${this._onClearPolicy}"
1592
+ ></gv-input>
1593
+ </div>
1594
+ </gv-policy-studio-menu>`
1595
+ : ''}
1596
+ </div>`;
1644
1597
  }
1645
1598
 
1646
1599
  _renderDebug() {
@@ -1648,61 +1601,189 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1648
1601
  const isLoading = this.debugResponse ? this.debugResponse.isLoading : undefined;
1649
1602
  const path = this.debugResponse && this.debugResponse.request ? this.debugResponse.request.path : undefined;
1650
1603
  const method = this.debugResponse && this.debugResponse.request ? this.debugResponse.request.method : undefined;
1651
- return html`<gv-http-client id="debug" slot="content" class="debug" @gv-http-client:send="${this._onDebug}" .response="${response}" .path="${path}" .method="${method}" ?loading="${isLoading}"> </gv-http-client>`;
1604
+ return html`<gv-http-client
1605
+ id="debug"
1606
+ slot="content"
1607
+ class="debug"
1608
+ @gv-http-client:send="${this._onDebug}"
1609
+ .response="${response}"
1610
+ .path="${path}"
1611
+ .method="${method}"
1612
+ ?loading="${isLoading}"
1613
+ >
1614
+ </gv-http-client>`;
1652
1615
  }
1653
1616
 
1654
1617
  _renderConfigurationForm(readonlyMode) {
1655
1618
  if (this.configurationSchema) {
1656
1619
  const values = deepClone(this._definition);
1657
- return html` <div id="settings" slot="content" class="api-settings" @dragover="${this._onDesign}"> <gv-schema-form .schema="${this.configurationSchema}" id="api-settings-form" .values="${values}" has-header has-footer scrollable ?readonly="${readonlyMode}" @gv-schema-form:cancel="${this._onCancelFlowMode}" @gv-schema-form:submit="${this._onSubmitFlowMode}"> ${!this.configurationInformation ? '' : html` <div class="api-settings-information" slot="title"> <gv-icon class="api-settings-information__icon" title="Info" shape="code:info"></gv-icon> <blockquote class="api-settings-information__blockquote">${this.configurationInformation}</blockquote> </div> `} </gv-schema-form> </div>`;
1620
+ return html` <div id="settings" slot="content" class="api-settings" @dragover="${this._onDesign}">
1621
+ <gv-schema-form
1622
+ .schema="${this.configurationSchema}"
1623
+ id="api-settings-form"
1624
+ .values="${values}"
1625
+ has-header
1626
+ has-footer
1627
+ scrollable
1628
+ ?readonly="${readonlyMode}"
1629
+ @gv-schema-form:cancel="${this._onCancelFlowMode}"
1630
+ @gv-schema-form:submit="${this._onSubmitFlowMode}"
1631
+ >
1632
+ ${!this.configurationInformation
1633
+ ? ''
1634
+ : html`
1635
+ <div class="api-settings-information" slot="title">
1636
+ <gv-icon class="api-settings-information__icon" title="Info" shape="code:info"></gv-icon>
1637
+ <blockquote class="api-settings-information__blockquote">${this.configurationInformation}</blockquote>
1638
+ </div>
1639
+ `}
1640
+ </gv-schema-form>
1641
+ </div>`;
1658
1642
  }
1659
-
1660
1643
  return html``;
1661
1644
  }
1662
1645
 
1663
1646
  _renderFlowForm(readonlyMode) {
1664
1647
  if (this.flowSchema && this._flowStepSchema == null && this.documentation == null && this.selectedFlowsId.length === 1) {
1665
1648
  const flow = this.getSelectedFlow();
1666
-
1667
1649
  if (flow) {
1668
1650
  const values = deepClone(flow);
1669
- return html`<div slot="content" class="flow-settings"> <gv-schema-form .schema="${this.flowSchema}" id="settings-form" .values="${values}" has-header scrollable ?readonly="${readonlyMode}" @gv-schema-form:cancel="${this._onCancelFlow}" @gv-schema-form:submit="${this._onSubmitFlow}"> <div slot="title" class="flow-step__form-title">Flow configuration</div> </gv-schema-form> </div>`;
1651
+ return html`<div slot="content" class="flow-settings">
1652
+ <gv-schema-form
1653
+ .schema="${this.flowSchema}"
1654
+ id="settings-form"
1655
+ .values="${values}"
1656
+ has-header
1657
+ scrollable
1658
+ ?readonly="${readonlyMode}"
1659
+ @gv-schema-form:cancel="${this._onCancelFlow}"
1660
+ @gv-schema-form:submit="${this._onSubmitFlow}"
1661
+ >
1662
+ <div slot="title" class="flow-step__form-title">Flow configuration</div>
1663
+ </gv-schema-form>
1664
+ </div>`;
1670
1665
  }
1671
1666
  }
1672
1667
  }
1673
1668
 
1674
- _onResourcesChange({
1675
- detail
1676
- }) {
1669
+ _onResourcesChange({ detail }) {
1677
1670
  this.definition.resources = detail.resources;
1678
1671
  this.isDirty = true;
1679
1672
  }
1680
1673
 
1681
- _onPropertiesChange({
1682
- detail
1683
- }) {
1674
+ _onPropertiesChange({ detail }) {
1684
1675
  this.definition.properties = detail.properties;
1685
1676
  this.isDirty = true;
1686
1677
  }
1687
1678
 
1688
- _onSaveProvider({
1689
- detail
1690
- }) {
1679
+ _onSaveProvider({ detail }) {
1691
1680
  this.services['dynamic-property'] = detail.provider;
1692
1681
  this.isDirty = true;
1693
1682
  }
1694
1683
 
1695
- _onSwitchEncryptedProperty({
1696
- detail
1697
- }) {
1684
+ _onSwitchEncryptedProperty({ detail }) {
1698
1685
  this.isDirty = true;
1699
1686
  }
1700
1687
 
1701
1688
  render() {
1702
1689
  const readonlyMode = this._getReadonlyModeForDesign();
1703
1690
 
1704
- return html`<div class="box"> <gv-policy-studio-menu class="left-menu" .api-name="${this._definition.name}" .flows="${this.filteredFlows}" .plans="${this.filteredPlans}" .selectedIds="${this.selectedFlowsId}" ?disabled="${this._currentAskConfirmation}" ?sortable="${this.sortable && this.readonly !== true}" ?readonly="${this.readonly}" ?readonlyPlans="${this.readonlyPlans}" flows-title="${this.flowsTitle}" .query="${this._searchFlowQuery}" ?can-add="${this.canAdd && !this.readonly}" @gv-policy-studio-menu:reorder-flows="${this._onReorderFlows}" @gv-policy-studio-menu:change-flow-state="${this._onChangeFlowState}" @gv-policy-studio-menu:add-flow="${this._onAddFlow}" @gv-policy-studio-menu:add-flow-plan="${this._onAddFlowPlan}" @gv-policy-studio-menu:delete-flow="${this._onDeleteFlow}" @gv-policy-studio-menu:duplicate-flow="${this._onDuplicateFlow}" @gv-policy-studio-menu:select-flows="${this._onSelectFlows}"> <div slot="header" class="header-actions"> <div class="title">${this._definition.name}</div> ${this._flowFilterOptions != null ? html`<gv-option ?disabled="${this._currentAskConfirmation}" .options="${this._flowFilterOptions}" multiple="multiple" outlined .value="${this._flowFilter}" small @gv-option:select="${this._onFilterFlows}"></gv-option>` : ''} <gv-input ?disabled="${this._currentAskConfirmation}" id="search-flow" placeholder="Filter flows (Ctrl + Space)" type="search" small @gv-input:input="${this._onSearchFlows}" @gv-input:clear="${this._onClearFlows}"></gv-input> </div> ${this.readonly !== true ? html` <div slot="footer" class="footer-actions"> <gv-button class="btn-large" .disabled="${!this.isDirty || this._currentAskConfirmation}" @gv-button:click="${this._onSaveAll}">Save</gv-button> <gv-button link .disabled="${!this.isDirty || this._currentAskConfirmation}" @gv-button:click="${this._onResetAll}">Reset</gv-button> </div>` : ''} </gv-policy-studio-menu> <gv-tabs .value="${this.tabId}" .options="${this._tabs}" .disabled="${this._currentAskConfirmation}" @gv-tabs:change="${this._onChangeTab}" .validator="${this._changeTabValidator.bind(this)}"> ${this._renderDesign(readonlyMode)} ${this._renderConfigurationForm(readonlyMode)} ${this._renderDebug()} <gv-properties id="properties" slot="content" class="properties" .provider="${this.services['dynamic-property']}" @gv-properties:change="${this._onPropertiesChange}" @gv-properties:save-provider="${this._onSaveProvider}" @gv-properties:switch-encrypted="${this._onSwitchEncryptedProperty}" ?readonly="${readonlyMode}" encryptable="true" .properties="${this.definedProperties}" .providers="${this.propertyProviders}" .dynamicPropertySchema="${this.dynamicPropertySchema}"></gv-properties> <gv-resources id="resources" slot="content" class="resources" @gv-resources:change="${this._onResourcesChange}" ?readonly="${readonlyMode}" .resources="${this.definedResources}" .types="${this.resourceTypes}"></gv-resources> </gv-tabs> </div>`;
1691
+ return html`<div class="box">
1692
+ <gv-policy-studio-menu
1693
+ class="left-menu"
1694
+ .api-name="${this._definition.name}"
1695
+ .flows="${this.filteredFlows}"
1696
+ .plans="${this.filteredPlans}"
1697
+ .selectedIds="${this.selectedFlowsId}"
1698
+ ?disabled="${this._currentAskConfirmation}"
1699
+ ?sortable="${this.sortable && this.readonly !== true}"
1700
+ ?readonly="${this.readonly}"
1701
+ ?readonlyPlans="${this.readonlyPlans}"
1702
+ flows-title="${this.flowsTitle}"
1703
+ .query="${this._searchFlowQuery}"
1704
+ ?can-add="${this.canAdd && !this.readonly}"
1705
+ @gv-policy-studio-menu:reorder-flows="${this._onReorderFlows}"
1706
+ @gv-policy-studio-menu:change-flow-state="${this._onChangeFlowState}"
1707
+ @gv-policy-studio-menu:add-flow="${this._onAddFlow}"
1708
+ @gv-policy-studio-menu:add-flow-plan="${this._onAddFlowPlan}"
1709
+ @gv-policy-studio-menu:delete-flow="${this._onDeleteFlow}"
1710
+ @gv-policy-studio-menu:duplicate-flow="${this._onDuplicateFlow}"
1711
+ @gv-policy-studio-menu:select-flows="${this._onSelectFlows}"
1712
+ >
1713
+ <div slot="header" class="header-actions">
1714
+ <div class="title">${this._definition.name}</div>
1715
+ ${this._flowFilterOptions != null
1716
+ ? html`<gv-option
1717
+ ?disabled="${this._currentAskConfirmation}"
1718
+ .options="${this._flowFilterOptions}"
1719
+ multiple
1720
+ outlined
1721
+ .value="${this._flowFilter}"
1722
+ small
1723
+ @gv-option:select="${this._onFilterFlows}"
1724
+ ></gv-option>`
1725
+ : ''}
1726
+ <gv-input
1727
+ ?disabled="${this._currentAskConfirmation}"
1728
+ id="search-flow"
1729
+ placeholder="Filter flows (Ctrl + Space)"
1730
+ type="search"
1731
+ small
1732
+ @gv-input:input="${this._onSearchFlows}"
1733
+ @gv-input:clear="${this._onClearFlows}"
1734
+ ></gv-input>
1735
+ </div>
1736
+
1737
+ ${this.readonly !== true
1738
+ ? html` <div slot="footer" class="footer-actions">
1739
+ <gv-button
1740
+ class="btn-large"
1741
+ .disabled="${!this.isDirty || this._currentAskConfirmation}"
1742
+ @gv-button:click="${this._onSaveAll}"
1743
+ >Save</gv-button
1744
+ >
1745
+ <gv-button link .disabled="${!this.isDirty || this._currentAskConfirmation}" @gv-button:click="${this._onResetAll}"
1746
+ >Reset</gv-button
1747
+ >
1748
+ </div>`
1749
+ : ''}
1750
+ </gv-policy-studio-menu>
1751
+
1752
+ <gv-tabs
1753
+ .value="${this.tabId}"
1754
+ .options="${this._tabs}"
1755
+ .disabled="${this._currentAskConfirmation}"
1756
+ @gv-tabs:change="${this._onChangeTab}"
1757
+ .validator="${this._changeTabValidator.bind(this)}"
1758
+ >
1759
+ ${this._renderDesign(readonlyMode)} ${this._renderConfigurationForm(readonlyMode)} ${this._renderDebug()}
1760
+ <gv-properties
1761
+ id="properties"
1762
+ slot="content"
1763
+ class="properties"
1764
+ .provider="${this.services['dynamic-property']}"
1765
+ @gv-properties:change="${this._onPropertiesChange}"
1766
+ @gv-properties:save-provider="${this._onSaveProvider}"
1767
+ @gv-properties:switch-encrypted="${this._onSwitchEncryptedProperty}"
1768
+ ?readonly="${readonlyMode}"
1769
+ encryptable="true"
1770
+ .properties="${this.definedProperties}"
1771
+ .providers="${this.propertyProviders}"
1772
+ .dynamicPropertySchema="${this.dynamicPropertySchema}"
1773
+ ></gv-properties>
1774
+ <gv-resources
1775
+ id="resources"
1776
+ slot="content"
1777
+ class="resources"
1778
+ @gv-resources:change="${this._onResourcesChange}"
1779
+ ?readonly="${readonlyMode}"
1780
+ .resources="${this.definedResources}"
1781
+ .types="${this.resourceTypes}"
1782
+ ></gv-resources>
1783
+ </gv-tabs>
1784
+ </div>`;
1705
1785
  }
1786
+
1706
1787
  /**
1707
1788
  * Determine if the design view should be in readonly mode or not
1708
1789
  * It is in readonly mode if:
@@ -1714,42 +1795,30 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1714
1795
  * @returns {boolean|*|{type: BooleanConstructor}|{attribute: string, type: BooleanConstructor}|{type: *}|{attribute: string, type: *}}
1715
1796
  * @private
1716
1797
  */
1717
-
1718
-
1719
1798
  _getReadonlyModeForDesign() {
1720
1799
  if (this.readonly) {
1721
1800
  return true;
1722
1801
  }
1723
1802
 
1724
1803
  const flow = this.getSelectedFlow(0);
1725
-
1726
1804
  if (!flow) {
1727
1805
  return false;
1728
1806
  }
1729
1807
 
1730
- const {
1731
- plan: flowPlan
1732
- } = this._findFlowCollection(flow._id);
1733
-
1808
+ const { plan: flowPlan } = this._findFlowCollection(flow._id);
1734
1809
  const readonlyMode = flowPlan && this.readonlyPlans;
1735
-
1736
1810
  if (readonlyMode) {
1737
1811
  return true;
1738
1812
  }
1739
1813
 
1740
1814
  const comparedFlow = this.getSelectedFlow(1);
1741
-
1742
1815
  if (!comparedFlow) {
1743
1816
  return false;
1744
1817
  }
1745
1818
 
1746
- const {
1747
- plan: comparedFlowPlan
1748
- } = this._findFlowCollection(comparedFlow._id);
1749
-
1819
+ const { plan: comparedFlowPlan } = this._findFlowCollection(comparedFlow._id);
1750
1820
  return comparedFlowPlan && this.readonlyPlans;
1751
1821
  }
1752
-
1753
1822
  }
1823
+
1754
1824
  window.customElements.define('gv-policy-studio', GvPolicyStudio);
1755
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL3BvbGljeS1zdHVkaW8vZ3YtcG9saWN5LXN0dWRpby5qcyJdLCJuYW1lcyI6WyJjc3MiLCJodG1sIiwiTGl0RWxlbWVudCIsIm1ldGhvZHMiLCJkaXNwYXRjaEN1c3RvbUV2ZW50IiwiZW1wdHkiLCJjYWNoZSIsImRlZXBDbG9uZSIsImRlZXBFcXVhbCIsIktleWJvYXJkRWxlbWVudCIsIktFWVMiLCJGTE9XX1NURVBfRk9STV9JRCIsIkd2UG9saWN5U3R1ZGlvIiwicHJvcGVydGllcyIsInBvbGljaWVzIiwidHlwZSIsIkFycmF5Iiwic2VydmljZXMiLCJPYmplY3QiLCJyZXNvdXJjZVR5cGVzIiwiYXR0cmlidXRlIiwicHJvcGVydHlQcm92aWRlcnMiLCJkeW5hbWljUHJvcGVydHlTY2hlbWEiLCJ0YWJJZCIsIlN0cmluZyIsIl90YWJJZCIsImRlZmluaXRpb24iLCJfZGVmaW5pdGlvbiIsImRvY3VtZW50YXRpb24iLCJmbG93U2NoZW1hIiwiY29uZmlndXJhdGlvblNjaGVtYSIsIl9jb25maWd1cmF0aW9uU2NoZW1hIiwiY29uZmlndXJhdGlvbkluZm9ybWF0aW9uIiwiaXNEaXJ0eSIsIkJvb2xlYW4iLCJyZWZsZWN0IiwiX2RyYWdQb2xpY3kiLCJfZHJvcFBvbGljeSIsInNlbGVjdGVkRmxvd3NJZCIsIl9zZWxlY3RlZEZsb3dzSWQiLCJfY3VycmVudFBvbGljeUlkIiwiX3NlYXJjaFBvbGljeVF1ZXJ5IiwiX3NlYXJjaEZsb3dRdWVyeSIsIl9mbG93U3RlcFNjaGVtYSIsIl9jdXJyZW50Rmxvd1N0ZXAiLCJfcG9saWN5RmlsdGVyIiwiX2Zsb3dGaWx0ZXIiLCJfY3VycmVudEFza0NvbmZpcm1hdGlvbiIsImhhc1Byb3BlcnRpZXMiLCJfaGFzUHJvcGVydGllcyIsImhhc1Jlc291cmNlcyIsImhhc1BvbGljeUZpbHRlciIsImZsb3dzVGl0bGUiLCJzb3J0YWJsZSIsImNhbkFkZCIsInJlYWRvbmx5IiwicmVhZG9ubHlQbGFucyIsImNhbkRlYnVnIiwiX2NhbkRlYnVnIiwiZGVidWdSZXNwb25zZSIsInN0eWxlcyIsImNvbnN0cnVjdG9yIiwiZmxvd3MiLCJfdGFicyIsImlkIiwidGl0bGUiLCJpY29uIiwidmFsdWUiLCJ0aGVuIiwicmVxdWVzdFVwZGF0ZSIsIl9mbG93RmlsdGVyT3B0aW9ucyIsImRlZmluZWRQbGFucyIsImxlbmd0aCIsIl9wb2xpY3lGaWx0ZXJPcHRpb25zIiwic3BsaWNlIiwib25LZXlib2FyZCIsImlzUHJlc3NlZCIsIlNoaWZ0IiwiQ3RybCIsIlNwYWNlIiwic2VhcmNoIiwic2hhZG93Um9vdCIsInF1ZXJ5U2VsZWN0b3IiLCJmb2N1cyIsIkVzYyIsIl9jbG9zZUZsb3dTdGVwRm9ybSIsIl9vbkNsb3NlRG9jdW1lbnRhdGlvbiIsImluY2x1ZGVzIiwiX2dlbmVyYXRlRmxvd3NJZCIsInJlc291cmNlcyIsIl9nZW5lcmF0ZUlkIiwicGxhbnMiLCJtYXAiLCJwbGFuIiwiX2dlbmVyYXRlUGxhbkZsb3dzSWQiLCJfaW5pdGlhbERlZmluaXRpb24iLCJfc2VsZWN0Rmlyc3RGbG93IiwiaXNBcnJheSIsImZpbHRlciIsIl9maW5kRmxvd0J5SWQiLCJfdXBkYXRlU2VsZWN0ZWRGbG93cyIsImRpc3BhdGNoIiwiY2FuZGlkYXRlIiwiZGVmaW5lZEZsb3dzIiwiX2lkIiwiZmluZCIsIl9nZXRGbG93RWxlbWVudCIsImZsb3dJZCIsIl9vbkRyYWdFbmRQb2xpY3kiLCJxdWVyeVNlbGVjdG9yQWxsIiwiZm9yRWFjaCIsImUiLCJvbkRyYWdFbmQiLCJfb25Ecm9wUG9saWN5IiwiZGV0YWlsIiwiX2Fza1RvVmFsaWRhdGVGb3JtcyIsInBvbGljeSIsInRhcmdldEZsb3ciLCJuYW1lIiwiZGVzY3JpcHRpb24iLCJjb25maWd1cmF0aW9uIiwiX25ldyIsImZsb3dTdGVwIiwiX2dlbmVyYXRlRmxvd1N0ZXBJZCIsImZsb3dLZXkiLCJwb3NpdGlvbiIsImVuYWJsZWQiLCJzb3VyY2VGbG93Iiwic291cmNlRmxvd0lkIiwic291cmNlUG9zaXRpb24iLCJzb3VyY2VGbG93S2V5Iiwic3RlcCIsImdyb3VwIiwic2NoZW1hIiwiYnVpbGRTY2hlbWEiLCJfc2V0Q3VycmVudEZsb3dTdGVwIiwiY3VycmVudEZsb3dGb3JtIiwiX2dldEZsb3dTdGVwRm9ybSIsImRpcnR5IiwiY2FuY2VsRWRpdCIsInNldFRpbWVvdXQiLCJfZWRpdEZsb3dTdGVwIiwiZmxvdyIsInVwZGF0ZUNvbXBsZXRlIiwiZmxvd0VsZW1lbnQiLCJzZWxlY3RlZFN0ZXBJZCIsIl9kaXJ0eSIsImd2RmxvdyIsInJlbW92ZUNhbmRpZGF0ZSIsIl9vbkRlbGV0ZVBvbGljeSIsInRhcmdldCIsImVkaXRpbmciLCJfb25EZXNpZ24iLCJfY2hhbmdlVGFiIiwiX3NwbGl0TWFpblZpZXdzIiwianNvblNjaGVtYSIsIkpTT04iLCJwYXJzZSIsImN1cnJlbnRGbG93U3RlcCIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJfb25PcGVuRG9jdW1lbnRhdGlvbiIsIl9tYXhpbWl6ZVRvcFZpZXciLCJfb25FZGl0Rmxvd1N0ZXAiLCJfZ2V0UmVzaXphYmxlVmlld3MiLCJtYXhpbWl6ZVRvcCIsIl9tYXhpbWl6ZUJvdHRvbVZpZXciLCJtYXhpbWl6ZUJvdHRvbSIsInNwbGl0IiwiX29uQ2hhbmdlRmxvd1N0ZXBTdGF0ZSIsIl9vbkNsb3NlRmxvd1N0ZXBGb3JtIiwiZXJyIiwiZm9yY2UiLCJQcm9taXNlIiwiYWxsIiwiX3N1Ym1pdE9yQ29uZmlybUZvcm1zIiwiZm9ybXMiLCJyIiwiX2J1aWxkRGVmaW5pdGlvblRvU2F2ZSIsImdldENoaWxkcmVuIiwiX2NoZWNrQ3VycmVudEZsb3dTdGVwIiwiRXJyb3IiLCJmbG93U3RlcFNjaGVtYSIsIl9pbml0aWFsVmFsdWVzIiwic2NvcGUiLCJfZW51bSIsImVudW0iLCJmaWx0ZXJlZCIsImRlZmF1bHQiLCJfdmFsdWVzIiwiX3JlZnJlc2giLCJjbG9zZVN0ZXBGb3JtIiwiX29uU2VsZWN0Rmxvd3MiLCJfb25PcGVuRG9jdW1lbnRhdGlvbkZyb21NZW51IiwiZ2V0U2VsZWN0ZWRGbG93IiwiX2ZldGNoRG9jdW1lbnRhdGlvbiIsIl9vbk9wZW5Eb2N1bWVudGF0aW9uRnJvbUZvcm0iLCJyZW1vdmVJdGVtIiwiX2ZpbmRGbG93Q29sbGVjdGlvbiIsInBsYW5zRmxvd3MiLCJyZWR1Y2UiLCJhY2MiLCJ2YWwiLCJjb25jYXQiLCJpbmRleCIsInNlbGVjdGVkRmxvd0lkIiwiX29uVGFyZ2V0UG9saWN5IiwiX29uQ2hhbmdlRmxvd1N0ZXAiLCJ2YWx1ZXMiLCJfd3JpdGVGbG93U3RlcCIsImZpbmRJbmRleCIsIl9vblN1Ym1pdEZsb3dTdGVwIiwiYyIsIl9vbkNhbmNlbEZsb3ciLCJfb25TdWJtaXRGbG93Iiwic2VsZWN0ZWRGbG93IiwiYXNzaWduIiwiX2NyZWF0ZUZsb3dGcm9tU2NoZW1hIiwic2VsZWN0ZWRGbG93VXBkYXRlZCIsIl9vbkNhbmNlbEZsb3dNb2RlIiwiX29uU3VibWl0Rmxvd01vZGUiLCJfb25DaGFuZ2VUYWIiLCJfY2hhbmdlVGFiVmFsaWRhdG9yIiwiZnJvbSIsInRvIiwiY29tcG9uZW50IiwiY29uZmlybSIsInJlc29sdmUiLCJfb25EcmFnU3RhcnRGbG93U3RlcCIsIl9yZW5kZXJGbG93RW1wdHlTdGF0ZSIsInJlYWRvbmx5TW9kZSIsIl9vbkFkZEZsb3ciLCJfcmVuZGVyRmxvdyIsImhhc0VtcHR5U3RhdGUiLCJiaW5kIiwiX29uRmV0Y2hSZXNvdXJjZXMiLCJldmVudCIsImN1cnJlbnRUYXJnZXQiLCJyZWdleFR5cGVzIiwib3B0aW9ucyIsImRlZmluZWRSZXNvdXJjZXMiLCJyZXNvdXJjZSIsIlJlZ0V4cCIsInRlc3QiLCJyZXNvdXJjZVR5cGUiLCJyb3ciLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJwaWN0dXJlIiwiaXRlbSIsImVsZW1lbnQiLCJfcmVuZGVyUG9saWN5IiwiX3JlbmRlckZsb3dTdGVwRm9ybSIsImNvbnRlbnQiLCJpbWFnZSIsIl9vblJlc2V0Rmxvd1N0ZXAiLCJyZXNldCIsImxpc3QiLCJwcmVmaXgiLCJpc0Zsb3ciLCJwcmUiLCJzdGVwSW5kZXgiLCJwb3N0IiwiZ2V0VXBkYXRlQ29tcGxldGUiLCJzaG91bGRVcGRhdGUiLCJjaGFuZ2VkUHJvcGVydGllcyIsImhhcyIsImRyYWdQb2xpY3kiLCJkcm9wUG9saWN5IiwidXBkYXRlZCIsInByb3BzIiwic2V0SXRlbSIsIl9vbkRlbGV0ZUZsb3ciLCJfZGVsZXRlRmxvdyIsImRlZmluZWRQcm9wZXJ0aWVzIiwiX29uRHVwbGljYXRlRmxvdyIsIl9hZGRGbG93IiwicGxhbkluZGV4IiwicCIsImkiLCJfb25DaGFuZ2VGbG93U3RhdGUiLCJfb25BZGRGbG93UGxhbiIsImNvbGxlY3Rpb24iLCJkdXBsaWNhdGUiLCJwdXNoIiwibmV3RmxvdyIsIl9pbnN0YW50aWF0ZSIsInByb3BlcnRpZXNEZWZpbml0aW9uIiwiaW5pdGlhdG9yIiwicHJvcGVydHkiLCJrZXkiLCJrZXlzIiwiZW50cnkiLCJ1bmRlZmluZWQiLCJpbmRleE9mIiwic2VsZWN0ZWRGbG93cyIsIl9maW5kRmxvd0luZGV4IiwiZiIsIl9vblJlb3JkZXJGbG93cyIsIm5ld09yZGVyIiwiX29uU2VhcmNoUG9saWN5IiwiX29uQ2xlYXJQb2xpY3kiLCJfb25TZWFyY2hGbG93cyIsIl9vbkNsZWFyRmxvd3MiLCJfb25SZXNldEFsbCIsIl9maWx0ZXJOb3RWYWxpZFN0ZXAiLCJfcmVtb3ZlUHJpdmF0ZVByb3BlcnRpZXMiLCJvIiwiY29weSIsInN0YXJ0c1dpdGgiLCJmb3JtIiwiaXNWYWxpZCIsInN1Ym1pdCIsImdldFByb3BlcnRpZXNFbGVtZW50IiwiY2xvc2VQcm9taXNlcyIsImN1cnJlbnRTdGVwIiwic2F2ZWQiLCJfZGVmaW5pdGlvblNhdmVkIiwiX2J1aWxkRGVmaW5pdGlvblRvU2VuZCIsImRlZmluaXRpb25Ub1NhdmUiLCJfb25TYXZlQWxsIiwiY2F0Y2giLCJjb25zb2xlIiwiZXJyb3IiLCJfb25EZWJ1ZyIsInJlcXVlc3RFdmVudCIsInJlcXVlc3QiLCJmaWx0ZXJlZEZsb3dzIiwiZmlsdGVyZWRQbGFucyIsIl9vbkZpbHRlckZsb3dzIiwiX2dldEZpbHRlcmVkUG9saWNpZXMiLCJvblJlcXVlc3QiLCJvblJlc3BvbnNlIiwiX29uRmlsdGVyUG9saWNpZXMiLCJfcmVuZGVyRGVzaWduIiwiX3JlbmRlckZsb3dGb3JtIiwiX3JlbmRlckRlYnVnIiwicmVzcG9uc2UiLCJpc0xvYWRpbmciLCJwYXRoIiwibWV0aG9kIiwiX3JlbmRlckNvbmZpZ3VyYXRpb25Gb3JtIiwiX29uUmVzb3VyY2VzQ2hhbmdlIiwiX29uUHJvcGVydGllc0NoYW5nZSIsIl9vblNhdmVQcm92aWRlciIsInByb3ZpZGVyIiwiX29uU3dpdGNoRW5jcnlwdGVkUHJvcGVydHkiLCJyZW5kZXIiLCJfZ2V0UmVhZG9ubHlNb2RlRm9yRGVzaWduIiwiZmxvd1BsYW4iLCJjb21wYXJlZEZsb3ciLCJjb21wYXJlZEZsb3dQbGFuIiwid2luZG93IiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLEdBQVQsRUFBY0MsSUFBZCxFQUFvQkMsVUFBcEIsUUFBc0MsS0FBdEM7QUFDQSxTQUFTQyxPQUFULFFBQXdCLGVBQXhCO0FBQ0EsU0FBU0MsbUJBQVQsUUFBb0MsZUFBcEM7QUFDQSxPQUFPLG9CQUFQO0FBQ0EsT0FBTyxrQkFBUDtBQUNBLE9BQU8sd0JBQVA7QUFDQSxPQUFPLCtCQUFQO0FBQ0EsT0FBTyxpQ0FBUDtBQUNBLE9BQU8sNkJBQVA7QUFDQSxPQUFPLDZCQUFQO0FBQ0EsT0FBTyxzQkFBUDtBQUNBLE9BQU8scUJBQVA7QUFDQSxPQUFPLFdBQVA7QUFDQSxPQUFPLGdCQUFQO0FBQ0EsT0FBTyx5QkFBUDtBQUNBLFNBQVNDLEtBQVQsUUFBc0IsaUJBQXRCO0FBQ0EsU0FBU0MsS0FBVCxRQUFzQixz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YUFBdEM7O0FBQ0EsUUFBSThLLFlBQUosRUFBa0I7QUFDaEIsYUFBTyxJQUFQO0FBQ0Q7O0FBRUQsVUFBTXdILFlBQVksR0FBRyxLQUFLNUosZUFBTCxDQUFxQixDQUFyQixDQUFyQjs7QUFDQSxRQUFJLENBQUM0SixZQUFMLEVBQW1CO0FBQ2pCLGFBQU8sS0FBUDtBQUNEOztBQUVELFVBQU07QUFBRWpRLE1BQUFBLElBQUksRUFBRWtRO0FBQVIsUUFBNkIsS0FBS3pKLG1CQUFMLENBQXlCd0osWUFBWSxDQUFDdFAsR0FBdEMsQ0FBbkM7O0FBQ0EsV0FBT3VQLGdCQUFnQixJQUFJLEtBQUt2UyxhQUFoQztBQUNEOztBQTF0RDZEO0FBNnREaEV3UyxNQUFNLENBQUNDLGNBQVAsQ0FBc0JDLE1BQXRCLENBQTZCLGtCQUE3QixFQUFpRHRWLGNBQWpEIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBtZXRob2RzIH0gZnJvbSAnLi4vbGliL3N0dWRpbyc7XG5pbXBvcnQgeyBkaXNwYXRjaEN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vbGliL2V2ZW50cyc7XG5pbXBvcnQgJy4uL2F0b21zL2d2LWJ1dHRvbic7XG5pbXBvcnQgJy4uL2F0b21zL2d2LWljb24nO1xuaW1wb3J0ICcuLi9tb2xlY3VsZXMvZ3Ytb3B0aW9uJztcbmltcG9ydCAnLi4vb3JnYW5pc21zL2d2LWRvY3VtZW50YXRpb24nO1xuaW1wb3J0ICcuLi9vcmdhbmlzbXMvZ3YtcmVzaXphYmxlLXZpZXdzJztcbmltcG9ydCAnLi4vb3JnYW5pc21zL2d2LXNjaGVtYS1mb3JtJztcbmltcG9ydCAnLi4vb3JnYW5pc21zL2d2LWh0dHAtY2xpZW50JztcbmltcG9ydCAnLi4vb3JnYW5pc21zL2d2LXRhYnMnO1xuaW1wb3J0ICcuLi9tb2xlY3VsZXMvZ3Ytcm93JztcbmltcG9ydCAnLi9ndi1mbG93JztcbmltcG9ydCAnLi9ndi1mbG93LXN0ZXAnO1xuaW1wb3J0ICcuL2d2LXBvbGljeS1zdHVkaW8tbWVudSc7XG5pbXBvcnQgeyBlbXB0eSB9IGZyb20gJy4uL3N0eWxlcy9lbXB0eSc7XG5pbXBvcnQgeyBjYWNoZSB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2NhY2hlJztcbmltcG9ydCB7IGRlZXBDbG9uZSwgZGVlcEVxdWFsIH0gZnJvbSAnLi4vbGliL3V0aWxzJztcbmltcG9ydCB7IEtleWJvYXJkRWxlbWVudCwgS0VZUyB9IGZyb20gJy4uL21peGlucy9rZXlib2FyZC1lbGVtZW50JztcblxuY29uc3QgRkxPV19TVEVQX0ZPUk1fSUQgPSAnZmxvdy1zdGVwLWZvcm0nO1xuXG4vKipcbiAqICBTdHVkaW8gUG9saWN5IGNvbXBvbmVudFxuICpcbiAqIOKaoO+4jyBUaGlzIGNvbXBvbmVudCBpcyBiYXNlZCBvbiBgYXNjaWlkb2N0b3JgLCBgaGlnaGxpZ2h0LmpzYCBhbmQgYGFzY2lpZG9jdG9yLWhpZ2hsaWdodC5qc2AuXG4gKiBUbyB1c2UgdGhpcyBjb21wb25lbnQgaW4geW91ciBwcm9qZWN0IGJlIHN1cmUgdGhlIGRlcGVuZGVuY2llcyBhcmUgaW5zdGFsbGVkIG9yXG4gKiBpbnN0YWxsIHRoZW0gd2l0aDogYG5wbSBpbnN0YWxsIGFzY2lpZG9jdG9yIGhpZ2hsaWdodC5qcyBhc2NpaWRvY3Rvci1oaWdobGlnaHQuanMgLS1zYXZlYFxuICpcbiAqIEBmaXJlcyBndi1wb2xpY3ktc3R1ZGlvOnNlbGVjdC1wb2xpY3kgLSBTZWxlY3QgcG9saWN5IGV2ZW50XG4gKiBAZmlyZXMgZ3YtcG9saWN5LXN0dWRpbzpzYXZlIC0gRXZlbnQgc2VudCB3aGVuIFwiU2F2ZVwiIGJ1dHRvbiBpcyBjbGlja2VkLCBpdCBjb250YWlucyB0aGUgd2hvbGUgZGVmaW5pdGlvbiBvZiB0aGUgQVBJXG4gKiBAZmlyZXMgZ3YtcG9saWN5LXN0dWRpbzpkZWJ1ZyAtIEV2ZW50IHNlbnQgd2hlbiB2YWxpZGF0aW9uIGJ1dHRvbiBvZiB0aGUgJ1RyeSBpdCcgdGFiIGlzIGNsaWNrZWQsIGl0IGNvbnRhaW5zIHRoZSB3aG9sZSBkZWZpbml0aW9uIG9mIHRoZSBBUEkgYW5kIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJ5IGl0IHJlcXVlc3QuXG4gKlxuICogQGF0dHIge0FycmF5fSBwb2xpY2llcyAtIFBvbGljaWVzIGF2YWlsYWJsZVxuICogQGF0dHIge0FycmF5fSBzZXJ2aWNlcyAtIFNlcnZpY2VzIGF2YWlsYWJsZVxuICogQGF0dHIge0FycmF5fSByZXNvdXJjZVR5cGVzIC0gUmVzb3VyY2VzIHR5cGVzIGF2YWlsYWJsZVxuICogQGF0dHIge0FycmF5fSBwcm9wZXJ0eVByb3ZpZGVycyAtIFByb3ZpZGVycyBvZiBwcm9wZXJ0aWVzXG4gKiBAYXR0ciB7QXJyYXl9IGR5bmFtaWNQcm9wZXJ0eVNjaGVtYSAtIFNjaGVtYSBmb3IgdGhlIGR5bmFtaWMgcHJvcGVydHkgZm9ybVxuICogQGF0dHIge1N0cmluZ30gdGFiSWQgLSBDdXJyZW50IHRhYklkIHRvIGRpc3BsYXkgKGRlc2lnbiwgc2V0dGluZ3MsIHByb3BlcnRpZXMgb3IgcmVzb3VyY2VzKVxuICogQGF0dHIge09iamVjdH0gZGVmaW5pdGlvbiAtIFRoZSBkZWZpbml0aW9uIG9mIGZsb3dzXG4gKiBAYXR0ciB7T2JqZWN0fSBkb2N1bWVudGF0aW9uIC0gVGhlIGRvY3VtZW50YXRpb24gdG8gZGlzcGxheVxuICogQGF0dHIge09iamVjdH0gZmxvd1NjaGVtYSAtIFRoZSBmbG93IGZvcm0gY29uZmlndXJhdGlvbiB0byBkaXNwbGF5IGluIGd2LXNjaGVtYS1mb3JtIGNvbXBvbmVudFxuICogQGF0dHIge09iamVjdH0gY29uZmlndXJhdGlvblNjaGVtYSAtIFRoZSBmb3JtIGNvbmZpZ3VyYXRpb24gdG8gZGlzcGxheSBpbiBndi1zY2hlbWEtZm9ybSBjb21wb25lbnRcbiAqIEBhdHRyIHtPYmplY3R9IGNvbmZpZ3VyYXRpb25JbmZvcm1hdGlvbiAtIFRoZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGFwaSBjb25maWd1cmF0aW9uIHRhYlxuICogQGF0dHIge0Jvb2xlYW59IGlzRGlydHkgLSB0cnVlIGlmIGNvbXBvbmVudCBpcyBkaXJ0eVxuICogQGF0dHIge0FycmF5fSBzZWxlY3RlZEZsb3dzSWQgLSBUaGUgc2VsZWN0ZWQgZmxvd3MgaWRcbiAqIEBhdHRyIHtCb29sZWFufSBzb3J0YWJsZSAtIHRydWUgaWYgZmxvd3MgYXJlIHNvcnRhYmxlXG4gKiBAYXR0ciB7Qm9vbGVhbn0gcmVhZG9ubHkgLSB0cnVlIGlmIHJlYWRvbmx5XG4gKiBAYXR0ciB7Qm9vbGVhbn0gcmVhZG9ubHktcGxhbnMgLSB0cnVlIGlmIHBsYW5zJyBmbG93cyBjYW4ndCBiZSBtb2RpZmllZFxuICogQGF0dHIge0Jvb2xlYW59IGNhbi1hZGQgLSB0cnVlIGlmIHVzZXIgY2FuIGFkZCBmbG93XG4gKiBAYXR0ciB7U3RyaW5nfSBmbG93c1RpdGxlIC0gZmxvd3MgbWVudSB0aXRsZVxuICogQGF0dHIge0Jvb2xlYW59IGhhcy1wb2xpY3ktZmlsdGVyIC0gdHJ1ZSBpZiBwb2xpY2llcyBoYXZlIG9uUmVxdWVzdC9vblJlc3BvbnNlIHByb3BlcnRpZXNcbiAqIEBhdHRyIHtCb29sZWFufSBjYW4tZGVidWcgLSB0cnVlIGlmIGRlYnVnIHRhYiBzaG91bGQgYmUgZGlzcGxheWVkXG4gKiBAYXR0ciB7T2JqZWN0fSBkZWJ1Z1Jlc3BvbnNlIC0gdHJ1ZSBpZiBkZWJ1ZyB0YWIgc2hvdWxkIGJlIGRpc3BsYXllZFxuICovXG5leHBvcnQgY2xhc3MgR3ZQb2xpY3lTdHVkaW8gZXh0ZW5kcyBLZXlib2FyZEVsZW1lbnQoTGl0RWxlbWVudCkge1xuICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvbGljaWVzOiB7IHR5cGU6IEFycmF5IH0sXG4gICAgICBzZXJ2aWNlczogeyB0eXBlOiBPYmplY3QgfSxcbiAgICAgIHJlc291cmNlVHlwZXM6IHsgdHlwZTogQXJyYXksIGF0dHJpYnV0ZTogJ3Jlc291cmNlLXR5cGVzJyB9LFxuICAgICAgcHJvcGVydHlQcm92aWRlcnM6IHsgdHlwZTogQXJyYXksIGF0dHJpYnV0ZTogJ3Byb3BlcnR5LXByb3ZpZGVycycgfSxcbiAgICAgIGR5bmFtaWNQcm9wZXJ0eVNjaGVtYTogeyB0eXBlOiBPYmplY3QsIGF0dHJpYnV0ZTogJ2R5bmFtaWMtcHJvcGVydHktc2NoZW1hJyB9LFxuICAgICAgdGFiSWQ6IHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICd0YWItaWQnIH0sXG4gICAgICBfdGFiSWQ6IHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBkZWZpbml0aW9uOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgX2RlZmluaXRpb246IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBkb2N1bWVudGF0aW9uOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgZmxvd1NjaGVtYTogeyB0eXBlOiBPYmplY3QsIGF0dHJpYnV0ZTogJ2Zsb3ctc2NoZW1hJyB9LFxuICAgICAgY29uZmlndXJhdGlvblNjaGVtYTogeyB0eXBlOiBPYmplY3QsIGF0dHJpYnV0ZTogJ2NvbmZpZ3VyYXRpb24tc2NoZW1hJyB9LFxuICAgICAgX2NvbmZpZ3VyYXRpb25TY2hlbWE6IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBjb25maWd1cmF0aW9uSW5mb3JtYXRpb246IHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjb25maWd1cmF0aW9uLWluZm9ybWF0aW9uJyB9LFxuICAgICAgaXNEaXJ0eTogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdkaXJ0eScsIHJlZmxlY3Q6IHRydWUgfSxcbiAgICAgIF9kcmFnUG9saWN5OiB7IHR5cGU6IE9iamVjdCwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgX2Ryb3BQb2xpY3k6IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBzZWxlY3RlZEZsb3dzSWQ6IHsgdHlwZTogQXJyYXksIGF0dHJpYnV0ZTogJ3NlbGVjdGVkLWZsb3dzLWlkJyB9LFxuICAgICAgX3NlbGVjdGVkRmxvd3NJZDogeyB0eXBlOiBBcnJheSwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgX2N1cnJlbnRQb2xpY3lJZDogeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIF9zZWFyY2hQb2xpY3lRdWVyeTogeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIF9zZWFyY2hGbG93UXVlcnk6IHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBfZmxvd1N0ZXBTY2hlbWE6IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBfY3VycmVudEZsb3dTdGVwOiB7IHR5cGU6IE9iamVjdCwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgX3BvbGljeUZpbHRlcjogeyB0eXBlOiBBcnJheSwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgX2Zsb3dGaWx0ZXI6IHsgdHlwZTogQXJyYXksIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIF9jdXJyZW50QXNrQ29uZmlybWF0aW9uOiB7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIGhhc1Byb3BlcnRpZXM6IHsgdHlwZTogQm9vbGVhbiwgYXR0cmlidXRlOiAnaGFzLXByb3BlcnRpZXMnIH0sXG4gICAgICBfaGFzUHJvcGVydGllczogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBoYXNSZXNvdXJjZXM6IHsgdHlwZTogQm9vbGVhbiwgYXR0cmlidXRlOiAnaGFzLXJlc291cmNlcycgfSxcbiAgICAgIGhhc1BvbGljeUZpbHRlcjogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdoYXMtcG9saWN5LWZpbHRlcicgfSxcbiAgICAgIGZsb3dzVGl0bGU6IHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdmbG93cy10aXRsZScgfSxcbiAgICAgIHNvcnRhYmxlOiB7IHR5cGU6IEJvb2xlYW4gfSxcbiAgICAgIGNhbkFkZDogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdjYW4tYWRkJyB9LFxuICAgICAgcmVhZG9ubHk6IHsgdHlwZTogQm9vbGVhbiB9LFxuICAgICAgcmVhZG9ubHlQbGFuczogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdyZWFkb25seS1wbGFucycgfSxcbiAgICAgIGNhbkRlYnVnOiB7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogJ2Nhbi1kZWJ1ZycgfSxcbiAgICAgIF9jYW5EZWJ1ZzogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBkZWJ1Z1Jlc3BvbnNlOiB7IHR5cGU6IE9iamVjdCwgYXR0cmlidXRlOiAnZGVidWctcmVzcG9uc2UnIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBlbXB0eSxcbiAgICAgIG1ldGhvZHMsXG4gICAgICAvLyBsYW5ndWFnZT1DU1NcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgLS1oZWlnaHQ6IHZhcigtLWd2LXBvbGljeS1zdHVkaW8tLWgsIGNhbGMoMTAwdmggLSAzMnB4KSk7XG4gICAgICAgICAgaGVpZ2h0OiB2YXIoLS1oZWlnaHQpO1xuICAgICAgICAgIC0taGVpZ2h0LWluLXRhYnM6IGNhbGModmFyKC0taGVpZ2h0KSAtIDI1cHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLmJveCB7XG4gICAgICAgICAgaGVpZ2h0OiB2YXIoLS1oZWlnaHQpO1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIH1cblxuICAgICAgICAuZGVzaWduLFxuICAgICAgICAucHJvcGVydGllcyB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgfVxuXG4gICAgICAgIGd2LXJlc2l6YWJsZS12aWV3cyB7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICAuZWRpdGFibGUtbmFtZSB7XG4gICAgICAgICAgcGFkZGluZzogMC41cmVtIDFyZW07XG4gICAgICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmVkaXRhYmxlLW5hbWUgc3BhbiB7XG4gICAgICAgICAgY29sb3I6ICNiZmJmYmY7XG4gICAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmZvcm1fX2NvbnRyb2wge1xuICAgICAgICAgIG1hcmdpbjogMC41cmVtO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3YtaW5wdXQge1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgLmZsb3ctbmFtZSB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgLmZsb3ctbmFtZS5kaXJ0eSB7XG4gICAgICAgICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgICAgICAgIG9wYWNpdHk6IDAuODtcbiAgICAgICAgfVxuXG4gICAgICAgIC5mbG93LW5hbWUgZ3YtaWNvbiB7XG4gICAgICAgICAgLS1ndi1pY29uLS1zOiAyNHB4O1xuICAgICAgICAgIG1hcmdpbi1yaWdodDogMC4ycmVtO1xuICAgICAgICB9XG5cbiAgICAgICAgLmZsb3ctcGF0aCB7XG4gICAgICAgICAgbWFyZ2luLWxlZnQ6IDAuMnJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC50aXRsZV9tZXRob2RzIHtcbiAgICAgICAgICBtYXJnaW4tbGVmdDogMC41cmVtO1xuICAgICAgICB9XG5cbiAgICAgICAgLnR3by1jb2xzIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgfVxuXG4gICAgICAgIC50d28tY29scyA+ICoge1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgIH1cblxuICAgICAgICAubGVmdC1tZW51IHtcbiAgICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkOWQ5ZDk7XG4gICAgICAgICAgaGVpZ2h0OiB2YXIoLS1oZWlnaHQtaW4tdGFicyk7XG4gICAgICAgIH1cblxuICAgICAgICAucmlnaHQtbWVudSB7XG4gICAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2Q5ZDlkOTtcbiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWhlaWdodC1pbi10YWJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC50d28tY29scyA+ICo6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkOWQ5ZDk7XG4gICAgICAgIH1cblxuICAgICAgICAuZmxvdy1zdGVwX19jb250YWluZXIge1xuICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgaGVpZ2h0OiA5OSU7XG4gICAgICAgIH1cblxuICAgICAgICAuZmxvdy1zdGVwX19mb3JtIHtcbiAgICAgICAgICBwYWRkaW5nOiAwIDAuNXJlbTtcbiAgICAgICAgICBvdmVyZmxvdzogYXV0bztcbiAgICAgICAgfVxuXG4gICAgICAgIC5mbG93LXN0ZXBfX2Zvcm0tdGl0bGUge1xuICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMnJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGd2LXRhYnMge1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgICAgIH1cblxuICAgICAgICBndi1yZXNpemFibGUtdmlld3MsXG4gICAgICAgIGd2LXByb3BlcnRpZXMsXG4gICAgICAgIGd2LXJlc291cmNlcyB7XG4gICAgICAgICAgaGVpZ2h0OiB2YXIoLS1oZWlnaHQtaW4tdGFicyk7XG4gICAgICAgIH1cblxuICAgICAgICBndi1wcm9wZXJ0aWVzLFxuICAgICAgICBndi1yZXNvdXJjZXMge1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3YtcHJvcGVydGllcy5wcm9wZXJ0aWVzIHtcbiAgICAgICAgICAtLWd2LXByb3BlcnRpZXMtdGFibGUtLWNvbG1nOiAxMHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmFwaS1zZXR0aW5ncyB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2JmYmZiZjtcbiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWhlaWdodC1pbi10YWJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5kZWJ1ZyB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2JmYmZiZjtcbiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWhlaWdodC1pbi10YWJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hcGktc2V0dGluZ3MtaW5mb3JtYXRpb24ge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hcGktc2V0dGluZ3MtaW5mb3JtYXRpb25fX2ljb24ge1xuICAgICAgICAgIC0tZ3YtaWNvbi0tYzogdmFyKC0tZ3YtdGhlbWUtY29sb3IsICM1YTc2ODQpO1xuICAgICAgICAgIC0tZ3YtaWNvbi1vcGFjaXR5LS1jOiB2YXIoLS1ndi10aGVtZS1jb2xvci1pbmZvLWxpZ2h0LCAjNjRiNWY2KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hcGktc2V0dGluZ3MtaW5mb3JtYXRpb25fX2Jsb2NrcXVvdGUsXG4gICAgICAgIC5kZWJ1Zy1pbmZvcm1hdGlvbl9fYmxvY2txdW90ZSB7XG4gICAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS1ndi10aGVtZS1jb2xvciwgIzVhNzY4NCk7XG4gICAgICAgICAgbWFyZ2luOiAxNXB4O1xuICAgICAgICAgIHBhZGRpbmctbGVmdDogMTVweDtcbiAgICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgIH1cblxuICAgICAgICAuZmxvdy1zZXR0aW5ncyBndi1zY2hlbWEtZm9ybSB7XG4gICAgICAgICAgZmxleDogMTtcbiAgICAgICAgICBwYWRkaW5nOiAwLjVyZW07XG4gICAgICAgIH1cblxuICAgICAgICAuc2VhcmNoIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3RyZXRjaDtcbiAgICAgICAgfVxuXG4gICAgICAgIGd2LWlucHV0IHtcbiAgICAgICAgICBtYXJnaW46IDAuMnJlbSAwO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgLmhlYWRlci1hY3Rpb25zLFxuICAgICAgICAuc2VhcmNoLXBvbGljaWVzIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICBtYXJnaW46IDAuNXJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5zZWFyY2gtcG9saWNpZXMge1xuICAgICAgICAgIG1hcmdpbjogMS41cmVtIDAuNXJlbSAwLjVyZW07XG4gICAgICAgIH1cblxuICAgICAgICAuZm9vdGVyLWFjdGlvbnMgPiBndi1idXR0b24uYnRuLWxhcmdlLFxuICAgICAgICAuZm9vdGVyLWFjdGlvbnMgPiBndi1vcHRpb24ge1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgLmZvb3Rlci1hY3Rpb25zIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICBwYWRkaW5nOiAwLjVyZW0gMDtcbiAgICAgICAgICBtYXJnaW46IDAuNXJlbSAxNXB4O1xuICAgICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjYmZiZmJmO1xuICAgICAgICB9XG5cbiAgICAgICAgLmhlYWRlci1hY3Rpb25zIC50aXRsZSB7XG4gICAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuM3JlbTtcbiAgICAgICAgICBjb2xvcjogI2JmYmZiZjtcbiAgICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICAgIHdpZHRoOiAyNDBweDtcbiAgICAgICAgICBtaW4taGVpZ2h0OiAyNXB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmhlYWRlci1hY3Rpb25zID4gKixcbiAgICAgICAgLnNlYXJjaC1wb2xpY2llcyA+ICoge1xuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDFyZW07XG4gICAgICAgIH1cbiAgICAgIGAsXG4gICAgXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5pc0RpcnR5ID0gZmFsc2U7XG4gICAgdGhpcy5wb2xpY2llcyA9IFtdO1xuICAgIHRoaXMucmVzb3VyY2VUeXBlcyA9IFtdO1xuICAgIHRoaXMudGFiSWQgPSAnZGVzaWduJztcbiAgICB0aGlzLnNlbGVjdGVkRmxvd3NJZCA9IFtdO1xuICAgIHRoaXMuZmxvd3NUaXRsZSA9ICdGbG93cyc7XG4gICAgdGhpcy5zb3J0YWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuc2VydmljZXMgPSB7fTtcbiAgICB0aGlzLl9kZWZpbml0aW9uID0ge1xuICAgICAgZmxvd3M6IFtdLFxuICAgIH07XG4gICAgdGhpcy5fdGFicyA9IFt7IGlkOiAnZGVzaWduJywgdGl0bGU6ICdEZXNpZ24nLCBpY29uOiAnbmF2aWdhdGlvbjpleGNoYW5nZScgfV07XG4gICAgdGhpcy5fcG9saWN5RmlsdGVyID0gW107XG4gICAgdGhpcy5fZmxvd0ZpbHRlciA9IFtdO1xuICB9XG5cbiAgc2V0IGhhc1Byb3BlcnRpZXModmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGltcG9ydCgnLi4vb3JnYW5pc21zL2d2LXByb3BlcnRpZXMnKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5fdGFicyA9IFsuLi50aGlzLl90YWJzLCB7IGlkOiAncHJvcGVydGllcycsIHRpdGxlOiAnUHJvcGVydGllcycsIGljb246ICdnZW5lcmFsOnNldHRpbmdzIzEnIH1dO1xuICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLl9oYXNQcm9wZXJ0aWVzID0gdmFsdWU7XG4gIH1cblxuICBnZXQgaGFzUHJvcGVydGllcygpIHtcbiAgICByZXR1cm4gdGhpcy5faGFzUHJvcGVydGllcztcbiAgfVxuXG4gIHNldCBoYXNSZXNvdXJjZXModmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGltcG9ydCgnLi4vb3JnYW5pc21zL2d2LXJlc291cmNlcycpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl90YWJzID0gWy4uLnRoaXMuX3RhYnMsIHsgaWQ6ICdyZXNvdXJjZXMnLCB0aXRsZTogJ1Jlc291cmNlcycsIGljb246ICdnZW5lcmFsOnNldHRpbmdzIzUnIH1dO1xuICAgICAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHNldCBjYW5EZWJ1Zyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fdGFicyA9IFsuLi50aGlzLl90YWJzLCB7IGlkOiAnZGVidWcnLCB0aXRsZTogJ1RyeSBpdCcsIGljb246ICdjb250ZW50OnNlbmQnIH1dO1xuICAgIH1cbiAgfVxuXG4gIGdldCBfZmxvd0ZpbHRlck9wdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuZGVmaW5lZFBsYW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIHsgaWQ6ICdhcGknLCB0aXRsZTogJ0FwaScsIGljb246ICdzaG9wcGluZzpib3gjMycgfSxcbiAgICAgICAgeyBpZDogJ3BsYW4nLCB0aXRsZTogJ1BsYW5zJywgaWNvbjogJ3Nob3BwaW5nOnNhbGUjMicgfSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgc2V0IGhhc1BvbGljeUZpbHRlcih2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fcG9saWN5RmlsdGVyT3B0aW9ucyA9IFtcbiAgICAgICAgeyBpZDogJ29uUmVxdWVzdCcsIHRpdGxlOiAnUmVxdWVzdCcsIGljb246ICduYXZpZ2F0aW9uOmFycm93LWZyb20tbGVmdCcgfSxcbiAgICAgICAgeyBpZDogJ29uUmVzcG9uc2UnLCB0aXRsZTogJ1Jlc3BvbnNlJywgaWNvbjogJ25hdmlnYXRpb246YXJyb3ctZnJvbS1yaWdodCcgfSxcbiAgICAgIF07XG4gICAgfVxuICB9XG5cbiAgc2V0IGNvbmZpZ3VyYXRpb25TY2hlbWEodmFsdWUpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuX3RhYnMuc3BsaWNlKDEsIDAsIHsgaWQ6ICdzZXR0aW5ncycsIHRpdGxlOiAnQ29uZmlndXJhdGlvbicsIGljb246ICdnZW5lcmFsOnNldHRpbmdzIzInIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX2NvbmZpZ3VyYXRpb25TY2hlbWEgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBjb25maWd1cmF0aW9uU2NoZW1hKCkge1xuICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0aW9uU2NoZW1hO1xuICB9XG5cbiAgb25LZXlib2FyZCgpIHtcbiAgICBpZiAodGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbiA9PSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5pc1ByZXNzZWQoS0VZUy5TaGlmdCwgS0VZUy5DdHJsLCBLRVlTLlNwYWNlKSkge1xuICAgICAgICBjb25zdCBzZWFyY2ggPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignI3NlYXJjaC1wb2xpY3knKTtcbiAgICAgICAgaWYgKHNlYXJjaCkge1xuICAgICAgICAgIHNlYXJjaC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNQcmVzc2VkKEtFWVMuQ3RybCwgS0VZUy5TcGFjZSkpIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJyNzZWFyY2gtZmxvdycpO1xuICAgICAgICBpZiAoc2VhcmNoKSB7XG4gICAgICAgICAgc2VhcmNoLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzUHJlc3NlZChLRVlTLkVzYykpIHtcbiAgICAgICAgdGhpcy5fY2xvc2VGbG93U3RlcEZvcm0oKTtcbiAgICAgICAgdGhpcy5fb25DbG9zZURvY3VtZW50YXRpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXQgdGFiSWQodGFiSWQpIHtcbiAgICBpZiAodGFiSWQgIT0gbnVsbCAmJiBbJ2Rlc2lnbicsICdzZXR0aW5ncycsICdwcm9wZXJ0aWVzJywgJ3Jlc291cmNlcycsICdkZWJ1ZyddLmluY2x1ZGVzKHRhYklkKSkge1xuICAgICAgdGhpcy5fdGFiSWQgPSB0YWJJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdGFiSWQgPSAnZGVzaWduJztcbiAgICB9XG4gIH1cblxuICBnZXQgdGFiSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYklkO1xuICB9XG5cbiAgc2V0IGRlZmluaXRpb24oZGVmaW5pdGlvbikge1xuICAgIGlmIChkZWZpbml0aW9uKSB7XG4gICAgICBjb25zdCBmbG93cyA9IHRoaXMuX2dlbmVyYXRlRmxvd3NJZChkZWZpbml0aW9uLmZsb3dzKTtcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMuX2dlbmVyYXRlSWQoJ3Jlc291cmNlLScsIGRlZmluaXRpb24ucmVzb3VyY2VzKTtcbiAgICAgIGNvbnN0IHBsYW5zID1cbiAgICAgICAgZGVmaW5pdGlvbi5wbGFucyA9PSBudWxsXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogZGVmaW5pdGlvbi5wbGFucy5tYXAoKHBsYW4pID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4ucGxhbiwgZmxvd3M6IHRoaXMuX2dlbmVyYXRlUGxhbkZsb3dzSWQocGxhbikgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgdGhpcy5faW5pdGlhbERlZmluaXRpb24gPSB7IC4uLmRlZmluaXRpb24sIGZsb3dzLCByZXNvdXJjZXMsIHBsYW5zIH07XG4gICAgICB0aGlzLl9kZWZpbml0aW9uID0gZGVlcENsb25lKHRoaXMuX2luaXRpYWxEZWZpbml0aW9uKTtcbiAgICAgIHRoaXMuaXNEaXJ0eSA9IGZhbHNlO1xuICAgICAgdGhpcy5fc2VsZWN0Rmlyc3RGbG93KCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGRlZmluaXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmluaXRpb247XG4gIH1cblxuICBzZXQgc2VsZWN0ZWRGbG93c0lkKHNlbGVjdGVkRmxvd3NJZCkge1xuICAgIGlmIChzZWxlY3RlZEZsb3dzSWQgIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHNlbGVjdGVkRmxvd3NJZCkpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkRmxvd3NJZCA9IHNlbGVjdGVkRmxvd3NJZC5maWx0ZXIoKGlkKSA9PiB0aGlzLl9maW5kRmxvd0J5SWQoaWQpICE9IG51bGwpO1xuICAgICAgaWYgKHNlbGVjdGVkRmxvd3NJZC5sZW5ndGggIT09IHRoaXMuX3NlbGVjdGVkRmxvd3NJZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0Rmlyc3RGbG93KHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBzZWxlY3RlZEZsb3dzSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRmxvd3NJZC5maWx0ZXIoKGlkKSA9PiB0aGlzLl9maW5kRmxvd0J5SWQoaWQpICE9IG51bGwpO1xuICB9XG5cbiAgX3VwZGF0ZVNlbGVjdGVkRmxvd3Moc2VsZWN0ZWRGbG93c0lkKSB7XG4gICAgdGhpcy5zZWxlY3RlZEZsb3dzSWQgPSBzZWxlY3RlZEZsb3dzSWQ7XG4gICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnc2VsZWN0LWZsb3dzJywgeyBmbG93czogdGhpcy5zZWxlY3RlZEZsb3dzSWQgfSk7XG4gIH1cblxuICBfc2VsZWN0Rmlyc3RGbG93KGRpc3BhdGNoID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZsb3dzSWQubGVuZ3RoID09PSAwKSB7XG4gICAgICBsZXQgY2FuZGlkYXRlID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLmRlZmluZWRGbG93cy5sZW5ndGggPiAwICYmIHRoaXMuZGVmaW5lZEZsb3dzWzBdLl9pZCAhPSBudWxsKSB7XG4gICAgICAgIGNhbmRpZGF0ZSA9IHRoaXMuZGVmaW5lZEZsb3dzWzBdO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmRlZmluZWRQbGFucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHBsYW4gPSB0aGlzLmRlZmluZWRQbGFucy5maW5kKChwbGFuKSA9PiBwbGFuLmZsb3dzICE9IG51bGwgJiYgcGxhbi5mbG93cy5sZW5ndGggPiAwICYmIHBsYW4uZmxvd3NbMF0uX2lkICE9IG51bGwpO1xuICAgICAgICBpZiAocGxhbikge1xuICAgICAgICAgIGNhbmRpZGF0ZSA9IHBsYW4uZmxvd3NbMF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjYW5kaWRhdGUgIT0gbnVsbCkge1xuICAgICAgICBpZiAoZGlzcGF0Y2gpIHtcbiAgICAgICAgICB0aGlzLl91cGRhdGVTZWxlY3RlZEZsb3dzKFtjYW5kaWRhdGUuX2lkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZsb3dzSWQgPSBbY2FuZGlkYXRlLl9pZF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfZ2V0Rmxvd0VsZW1lbnQoZmxvd0lkKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGBbaWQ9XCIke2Zsb3dJZH1cIl1gKTtcbiAgfVxuXG4gIF9vbkRyYWdFbmRQb2xpY3koKSB7XG4gICAgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2d2LWZsb3cnKS5mb3JFYWNoKChlKSA9PiBlLm9uRHJhZ0VuZCgpKTtcbiAgfVxuXG4gIGFzeW5jIF9vbkRyb3BQb2xpY3koeyBkZXRhaWwgfSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9hc2tUb1ZhbGlkYXRlRm9ybXMoKTtcblxuICAgICAgY29uc3QgcG9saWN5ID0gZGV0YWlsLnBvbGljeTtcbiAgICAgIGNvbnN0IHRhcmdldEZsb3cgPSB0aGlzLl9maW5kRmxvd0J5SWQoZGV0YWlsLmZsb3dJZCk7XG5cbiAgICAgIGxldCBuYW1lID0gcG9saWN5Lm5hbWU7XG4gICAgICBsZXQgZGVzY3JpcHRpb24gPSAnJztcbiAgICAgIGxldCBjb25maWd1cmF0aW9uID0ge307XG4gICAgICBsZXQgX2lkO1xuICAgICAgbGV0IF9uZXcgPSBmYWxzZTtcbiAgICAgIGlmIChkZXRhaWwuZmxvd1N0ZXApIHtcbiAgICAgICAgX2lkID0gZGV0YWlsLmZsb3dTdGVwLl9pZDtcbiAgICAgICAgbmFtZSA9IGRldGFpbC5mbG93U3RlcC5uYW1lO1xuICAgICAgICBkZXNjcmlwdGlvbiA9IGRldGFpbC5mbG93U3RlcC5kZXNjcmlwdGlvbiB8fCAnJztcbiAgICAgICAgY29uZmlndXJhdGlvbiA9IGRldGFpbC5mbG93U3RlcC5jb25maWd1cmF0aW9uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2lkID0gdGhpcy5fZ2VuZXJhdGVGbG93U3RlcElkKHRhcmdldEZsb3cuX2lkLCBkZXRhaWwuZmxvd0tleSwgZGV0YWlsLnBvc2l0aW9uKTtcbiAgICAgICAgX25ldyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZsb3dTdGVwID0geyBfaWQsIF9uZXcsIG5hbWUsIHBvbGljeTogcG9saWN5LmlkLCBkZXNjcmlwdGlvbiwgZW5hYmxlZDogdHJ1ZSwgY29uZmlndXJhdGlvbiB9O1xuICAgICAgY29uc3Qgc291cmNlRmxvdyA9IGRldGFpbC5zb3VyY2VGbG93SWQgIT0gbnVsbCA/IHRoaXMuX2ZpbmRGbG93QnlJZChkZXRhaWwuc291cmNlRmxvd0lkKSA6IHRhcmdldEZsb3c7XG5cbiAgICAgIGlmIChkZXRhaWwuc291cmNlUG9zaXRpb24gIT0gbnVsbCkge1xuICAgICAgICBpZiAoZGV0YWlsLnNvdXJjZUZsb3dLZXkgJiYgZGV0YWlsLnNvdXJjZUZsb3dLZXkgIT09IGRldGFpbC5mbG93S2V5KSB7XG4gICAgICAgICAgc291cmNlRmxvd1tkZXRhaWwuc291cmNlRmxvd0tleV0uc3BsaWNlKGRldGFpbC5zb3VyY2VQb3NpdGlvbiwgMSk7XG4gICAgICAgICAgdGFyZ2V0Rmxvd1tkZXRhaWwuZmxvd0tleV0uc3BsaWNlKGRldGFpbC5wb3NpdGlvbiwgMCwgZmxvd1N0ZXApO1xuICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50Rmxvd1N0ZXAgIT0gbnVsbCAmJiB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuc3RlcC5faWQgPT09IF9pZCkge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudEZsb3dTdGVwLmdyb3VwID0gZGV0YWlsLmZsb3dLZXk7XG4gICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHVwZGF0ZSBzY2hlbWEgYWZ0ZXIgY2hhbmdlIHJlcXVlc3QgdG8gcmVzcG9uc2Ugb3IgaW52ZXJzZVxuICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5idWlsZFNjaGVtYSh0aGlzLl9jdXJyZW50Rmxvd1N0ZXAucG9saWN5KTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NldEN1cnJlbnRGbG93U3RlcCh0aGlzLl9jdXJyZW50Rmxvd1N0ZXAsIHNjaGVtYSwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLl9nZXRGbG93RWxlbWVudCh0YXJnZXRGbG93Ll9pZCkucmVxdWVzdFVwZGF0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZGV0YWlsLnBvc2l0aW9uID4gZGV0YWlsLnNvdXJjZVBvc2l0aW9uKSB7XG4gICAgICAgICAgICB0YXJnZXRGbG93W2RldGFpbC5mbG93S2V5XS5zcGxpY2UoZGV0YWlsLnBvc2l0aW9uLCAwLCBmbG93U3RlcCk7XG4gICAgICAgICAgICBzb3VyY2VGbG93W2RldGFpbC5mbG93S2V5XS5zcGxpY2UoZGV0YWlsLnNvdXJjZVBvc2l0aW9uLCAxKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc291cmNlRmxvd1tkZXRhaWwuZmxvd0tleV0uc3BsaWNlKGRldGFpbC5zb3VyY2VQb3NpdGlvbiwgMSk7XG4gICAgICAgICAgICB0YXJnZXRGbG93W2RldGFpbC5mbG93S2V5XS5zcGxpY2UoZGV0YWlsLnBvc2l0aW9uLCAwLCBmbG93U3RlcCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEZvcmNlIFJlZnJlc2ggc291cmNlIGZsb3cgZWxlbWVudCB3aGVuIG1vdmUgdG8gb3RoZXIgZmxvd1xuICAgICAgICBpZiAodGFyZ2V0Rmxvdy5faWQgIT09IHNvdXJjZUZsb3cuX2lkKSB7XG4gICAgICAgICAgdGhpcy5fZ2V0Rmxvd0VsZW1lbnQodGFyZ2V0Rmxvdy5faWQpLnJlcXVlc3RVcGRhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0Rmxvd1tkZXRhaWwuZmxvd0tleV0uc3BsaWNlKGRldGFpbC5wb3NpdGlvbiwgMCwgZmxvd1N0ZXApO1xuICAgICAgICBjb25zdCBjdXJyZW50Rmxvd0Zvcm0gPSB0aGlzLl9nZXRGbG93U3RlcEZvcm0oKTtcbiAgICAgICAgaWYgKGN1cnJlbnRGbG93Rm9ybSA9PSBudWxsIHx8IGN1cnJlbnRGbG93Rm9ybS5kaXJ0eSAhPT0gdHJ1ZSkge1xuICAgICAgICAgIGxldCBzdGVwID0gdGFyZ2V0Rmxvd1tkZXRhaWwuZmxvd0tleV1bZGV0YWlsLnBvc2l0aW9uXTtcbiAgICAgICAgICBpZiAoc3RlcCA9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBXaGVuIGNvbmZpcm0gbG9zZSBjaGFuZ2UgYWZ0ZXIgZHJvcCBwb2xpY3lcbiAgICAgICAgICAgIHN0ZXAgPSB0YXJnZXRGbG93W2RldGFpbC5mbG93S2V5XVtkZXRhaWwucG9zaXRpb24gLSAxXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGV0YWlsLmNhbmNlbEVkaXQgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9lZGl0Rmxvd1N0ZXAoeyBzdGVwLCBwb2xpY3ksIGZsb3c6IHRhcmdldEZsb3csIGdyb3VwOiBkZXRhaWwuZmxvd0tleSB9KTtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVDb21wbGV0ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmbG93RWxlbWVudCA9IHRoaXMuX2dldEZsb3dFbGVtZW50KHRhcmdldEZsb3cuX2lkKTtcbiAgICAgICAgICAgICAgICBmbG93RWxlbWVudC5zZWxlY3RlZFN0ZXBJZCA9IHN0ZXAuX2lkO1xuICAgICAgICAgICAgICAgIGZsb3dFbGVtZW50LnJlcXVlc3RVcGRhdGUoKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRhcmdldEZsb3cuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgIHNvdXJjZUZsb3cuX2RpcnR5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNEaXJ0eSA9IHRydWU7XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnZ3YtZmxvdycpLmZvckVhY2goKGd2RmxvdykgPT4gZ3ZGbG93LnJlbW92ZUNhbmRpZGF0ZSgpKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl9kcmFnUG9saWN5ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fZHJvcFBvbGljeSA9IG51bGw7XG4gICAgICB9LCAwKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9uID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBfb25EZWxldGVQb2xpY3koeyBkZXRhaWwgfSkge1xuICAgIGNvbnN0IHRhcmdldEZsb3cgPSB0aGlzLl9maW5kRmxvd0J5SWQoZGV0YWlsLmZsb3dJZCk7XG4gICAgdGFyZ2V0Rmxvd1tkZXRhaWwuZmxvd0tleV0uc3BsaWNlKGRldGFpbC5wb3NpdGlvbiwgMSk7XG4gICAgdGFyZ2V0Rmxvdy5fZGlydHkgPSB0cnVlO1xuICAgIHRoaXMuaXNEaXJ0eSA9IHRydWU7XG4gICAgaWYgKGRldGFpbC50YXJnZXQuZWRpdGluZykge1xuICAgICAgdGhpcy5fY2xvc2VGbG93U3RlcEZvcm0odHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMuX2dldEZsb3dFbGVtZW50KGRldGFpbC5mbG93SWQpLnJlcXVlc3RVcGRhdGUoKTtcbiAgfVxuXG4gIF9vbkRlc2lnbigpIHtcbiAgICB0aGlzLl9jaGFuZ2VUYWIoJ2Rlc2lnbicpO1xuICAgIHRoaXMuX3NwbGl0TWFpblZpZXdzKCk7XG4gIH1cblxuICBidWlsZFNjaGVtYSh7IHNjaGVtYSB9KSB7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSB7XG4gICAgICB0aXRsZTogJ0Rlc2NyaXB0aW9uJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGVzY3JpcHRpb24gb2YgZmxvdyBzdGVwJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIH07XG4gICAgaWYgKHNjaGVtYSkge1xuICAgICAgY29uc3QganNvblNjaGVtYSA9IHR5cGVvZiBzY2hlbWEgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShzY2hlbWEpIDogc2NoZW1hO1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHsgZGVzY3JpcHRpb24sIC4uLmpzb25TY2hlbWEucHJvcGVydGllcyB9O1xuICAgICAgcmV0dXJuIHsgLi4uanNvblNjaGVtYSwgcHJvcGVydGllcyB9O1xuICAgIH1cbiAgICByZXR1cm4geyBwcm9wZXJ0aWVzOiB7IGRlc2NyaXB0aW9uIH0gfTtcbiAgfVxuXG4gIGFzeW5jIF9lZGl0Rmxvd1N0ZXAoeyBzdGVwLCBmbG93LCBwb2xpY3ksIGdyb3VwIH0pIHtcbiAgICBpZiAoc3RlcCkge1xuICAgICAgdGhpcy5fY3VycmVudFBvbGljeUlkID0gcG9saWN5LmlkO1xuICAgICAgY29uc3QgY3VycmVudEZsb3dTdGVwID0geyBmbG93LCBzdGVwLCBwb2xpY3ksIGdyb3VwIH07XG4gICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmJ1aWxkU2NoZW1hKHBvbGljeSk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLl9zZXRDdXJyZW50Rmxvd1N0ZXAoY3VycmVudEZsb3dTdGVwLCBzY2hlbWEpO1xuICAgICAgICB0aGlzLl91cGRhdGVTZWxlY3RlZEZsb3dzKFtmbG93Ll9pZF0pO1xuICAgICAgICB0aGlzLl9zcGxpdE1haW5WaWV3cygpO1xuICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2d2LXBvbGljeS1zdHVkaW86a2VlcC1kb2N1bWVudGF0aW9uLWNsb3NlJykgPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX29uT3BlbkRvY3VtZW50YXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9uID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5fY2xvc2VGbG93U3RlcEZvcm0oKTtcbiAgICAgIHRoaXMuX21heGltaXplVG9wVmlldygpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9vbkVkaXRGbG93U3RlcCh7IGRldGFpbDogeyBzdGVwLCBmbG93LCBwb2xpY3ksIGdyb3VwIH0gfSkge1xuICAgIHJldHVybiB0aGlzLl9lZGl0Rmxvd1N0ZXAoeyBzdGVwLCBmbG93LCBwb2xpY3ksIGdyb3VwIH0pO1xuICB9XG5cbiAgX2dldFJlc2l6YWJsZVZpZXdzKCkge1xuICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignZ3YtcmVzaXphYmxlLXZpZXdzJyk7XG4gIH1cblxuICBfbWF4aW1pemVUb3BWaWV3KCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRmxvd3NJZC5sZW5ndGggPD0gMSkge1xuICAgICAgdGhpcy5fZ2V0UmVzaXphYmxlVmlld3MoKS5tYXhpbWl6ZVRvcCgpO1xuICAgIH1cbiAgfVxuXG4gIF9tYXhpbWl6ZUJvdHRvbVZpZXcoKSB7XG4gICAgdGhpcy5fZ2V0UmVzaXphYmxlVmlld3MoKS5tYXhpbWl6ZUJvdHRvbSgpO1xuICB9XG5cbiAgX3NwbGl0TWFpblZpZXdzKCkge1xuICAgIHRoaXMuX2dldFJlc2l6YWJsZVZpZXdzKCkuc3BsaXQoKTtcbiAgfVxuXG4gIF9vbkNoYW5nZUZsb3dTdGVwU3RhdGUoeyBkZXRhaWwgfSkge1xuICAgIGNvbnN0IHRhcmdldEZsb3cgPSB0aGlzLl9maW5kRmxvd0J5SWQoZGV0YWlsLmZsb3dJZCk7XG4gICAgY29uc3Qgc3RlcCA9IHRhcmdldEZsb3dbZGV0YWlsLmZsb3dLZXldW2RldGFpbC5wb3NpdGlvbl07XG4gICAgc3RlcC5lbmFibGVkID0gZGV0YWlsLmVuYWJsZWQ7XG4gICAgdGFyZ2V0Rmxvdy5fZGlydHkgPSB0cnVlO1xuICAgIHRoaXMuaXNEaXJ0eSA9IHRydWU7XG4gIH1cblxuICBhc3luYyBfb25DbG9zZUZsb3dTdGVwRm9ybSgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fY2xvc2VGbG93U3RlcEZvcm0oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb24gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9jbG9zZUZsb3dTdGVwRm9ybShmb3JjZSA9IGZhbHNlKSB7XG4gICAgYXdhaXQgdGhpcy5fc2V0Q3VycmVudEZsb3dTdGVwKG51bGwsIG51bGwsIGZvcmNlKTtcbiAgfVxuXG4gIGFzeW5jIF9hc2tUb1ZhbGlkYXRlRm9ybXMoKSB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb24gPT0gbnVsbCkge1xuICAgICAgdGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbiA9IHRydWU7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5fc3VibWl0T3JDb25maXJtRm9ybXMoKSkudGhlbigoZm9ybXMpID0+IHtcbiAgICAgICAgaWYgKGZvcm1zLmZpbHRlcigocikgPT4gciAhPSBudWxsKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5fZGVmaW5pdGlvbiA9IHRoaXMuX2J1aWxkRGVmaW5pdGlvblRvU2F2ZSgpO1xuICAgICAgICAgIHRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKChlKSA9PiBlLnJlcXVlc3RVcGRhdGUoKSk7XG4gICAgICAgICAgLy8gUmVmcmVzaCBpZiBsb3NlIGNoYW5nZXMgbG9zdCBjdXJyZW50IHN0ZXAgc2VsZWN0aW9uXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrQ3VycmVudEZsb3dTdGVwKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaCgoZSkgPT4gZS5yZXF1ZXN0VXBkYXRlKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ29tcGxldGUudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICByZXR1cm4gZm9ybXM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9uID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gZm9ybXM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2FzayBhbHJlYWR5IHdhaXRpbmcnKTtcbiAgfVxuXG4gIGFzeW5jIF9zZXRDdXJyZW50Rmxvd1N0ZXAoY3VycmVudEZsb3dTdGVwLCBmbG93U3RlcFNjaGVtYSwgZm9yY2UgPSBmYWxzZSkge1xuICAgIGlmICghZm9yY2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2Fza1RvVmFsaWRhdGVGb3JtcygpO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYSA9IGRlZXBDbG9uZShmbG93U3RlcFNjaGVtYSk7XG4gICAgaWYgKGN1cnJlbnRGbG93U3RlcCAhPSBudWxsKSB7XG4gICAgICBjb25zdCBjb25maWd1cmF0aW9uID1cbiAgICAgICAgdHlwZW9mIGN1cnJlbnRGbG93U3RlcC5zdGVwLmNvbmZpZ3VyYXRpb24gPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyBKU09OLnBhcnNlKGN1cnJlbnRGbG93U3RlcC5zdGVwLmNvbmZpZ3VyYXRpb24pXG4gICAgICAgICAgOiBjdXJyZW50Rmxvd1N0ZXAuc3RlcC5jb25maWd1cmF0aW9uO1xuICAgICAgY29uc3Qgc3RlcCA9IHsgLi4uY3VycmVudEZsb3dTdGVwLnN0ZXAsIGNvbmZpZ3VyYXRpb24gfTtcblxuICAgICAgY29uc3QgX2luaXRpYWxWYWx1ZXMgPSB7IC4uLnN0ZXAuY29uZmlndXJhdGlvbiwgZGVzY3JpcHRpb246IHN0ZXAuZGVzY3JpcHRpb24gfTtcbiAgICAgIHRoaXMuX2N1cnJlbnRGbG93U3RlcCA9IHsgLi4uY3VycmVudEZsb3dTdGVwLCBzdGVwLCBfaW5pdGlhbFZhbHVlcyB9O1xuXG4gICAgICBpZiAoZmxvd1N0ZXBTY2hlbWEgJiYgZmxvd1N0ZXBTY2hlbWEucHJvcGVydGllcy5zY29wZSkge1xuICAgICAgICBjb25zdCBfZW51bSA9IHNjaGVtYS5wcm9wZXJ0aWVzLnNjb3BlLmVudW07XG4gICAgICAgIGlmIChfZW51bS5maW5kKChzY29wZSkgPT4gWydSRVFVRVNUJywgJ1JFUVVFU1RfQ09OVEVOVCcsICdSRVNQT05TRScsICdSRVNQT05TRV9DT05URU5UJ10uaW5jbHVkZXMoc2NvcGUpKSAhPSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuZ3JvdXAgPT09ICdwcmUnID8gWydSRVFVRVNUJywgJ1JFUVVFU1RfQ09OVEVOVCddIDogWydSRVNQT05TRScsICdSRVNQT05TRV9DT05URU5UJ107XG4gICAgICAgICAgc2NoZW1hLnByb3BlcnRpZXMuc2NvcGUuZW51bSA9IF9lbnVtLmZpbHRlcigoc2NvcGUpID0+IGZpbHRlcmVkLmluY2x1ZGVzKHNjb3BlKSk7XG4gICAgICAgICAgY29uc3Qgc2NvcGUgPSB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuc3RlcC5jb25maWd1cmF0aW9uLnNjb3BlO1xuICAgICAgICAgIGlmIChzY29wZSA9PSBudWxsIHx8ICFzY2hlbWEucHJvcGVydGllcy5zY29wZS5lbnVtLmluY2x1ZGVzKHNjb3BlKSkge1xuICAgICAgICAgICAgc2NoZW1hLnByb3BlcnRpZXMuc2NvcGUuZGVmYXVsdCA9IHNjaGVtYS5wcm9wZXJ0aWVzLnNjb3BlLmVudW1bMF07XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuc3RlcC5jb25maWd1cmF0aW9uLnNjb3BlID0gc2NoZW1hLnByb3BlcnRpZXMuc2NvcGUuZW51bVswXTtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRGbG93U3RlcC5faW5pdGlhbFZhbHVlcy5zY29wZSA9IHNjaGVtYS5wcm9wZXJ0aWVzLnNjb3BlLmVudW1bMF07XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudEZsb3dTdGVwLl92YWx1ZXMpIHtcbiAgICAgICAgICAgICAgdGhpcy5fY3VycmVudEZsb3dTdGVwLl92YWx1ZXMuc2NvcGUgPSBzY2hlbWEucHJvcGVydGllcy5zY29wZS5lbnVtWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuX2Zsb3dTdGVwU2NoZW1hID0gc2NoZW1hO1xuICB9XG5cbiAgX3JlZnJlc2goY2xvc2VTdGVwRm9ybSA9IHRydWUpIHtcbiAgICBpZiAoY2xvc2VTdGVwRm9ybSkge1xuICAgICAgdGhpcy5fY2xvc2VGbG93U3RlcEZvcm0odHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMuX2RlZmluaXRpb24gPSBkZWVwQ2xvbmUodGhpcy5fZGVmaW5pdGlvbik7XG4gIH1cblxuICBhc3luYyBfb25TZWxlY3RGbG93cyh7IGRldGFpbCB9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2Nsb3NlRmxvd1N0ZXBGb3JtKCk7XG4gICAgICB0aGlzLl9vbkNsb3NlRG9jdW1lbnRhdGlvbigpO1xuICAgICAgdGhpcy5fdXBkYXRlU2VsZWN0ZWRGbG93cyhkZXRhaWwuZmxvd3MpO1xuICAgICAgdGhpcy5fb25EZXNpZ24oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9uID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBfb25PcGVuRG9jdW1lbnRhdGlvbkZyb21NZW51KHsgZGV0YWlsOiB7IHBvbGljeSB9IH0pIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuZG9jdW1lbnRhdGlvbiA9PSBudWxsIHx8IHRoaXMuZG9jdW1lbnRhdGlvbi5pZCAhPT0gcG9saWN5LmlkKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2Nsb3NlRmxvd1N0ZXBGb3JtKCk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRQb2xpY3lJZCA9IHBvbGljeS5pZDtcbiAgICAgICAgaWYgKHRoaXMuZ2V0U2VsZWN0ZWRGbG93KCkpIHtcbiAgICAgICAgICB0aGlzLl9zcGxpdE1haW5WaWV3cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX21heGltaXplQm90dG9tVmlldygpO1xuICAgICAgICB9XG4gICAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ2ZldGNoLWRvY3VtZW50YXRpb24nLCB7IHBvbGljeSB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG5cbiAgX2ZldGNoRG9jdW1lbnRhdGlvbihwb2xpY3kpIHtcbiAgICBpZiAodGhpcy5kb2N1bWVudGF0aW9uID09IG51bGwgfHwgdGhpcy5kb2N1bWVudGF0aW9uLmlkICE9PSBwb2xpY3kuaWQpIHtcbiAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ2ZldGNoLWRvY3VtZW50YXRpb24nLCB7IHBvbGljeSB9KTtcbiAgICB9XG4gIH1cblxuICBfb25PcGVuRG9jdW1lbnRhdGlvbigpIHtcbiAgICBpZiAodGhpcy5fY3VycmVudEZsb3dTdGVwICYmIHRoaXMuX2N1cnJlbnRGbG93U3RlcC5wb2xpY3kpIHtcbiAgICAgIHRoaXMuX2ZldGNoRG9jdW1lbnRhdGlvbih0aGlzLl9jdXJyZW50Rmxvd1N0ZXAucG9saWN5KTtcbiAgICB9XG4gIH1cblxuICBfb25PcGVuRG9jdW1lbnRhdGlvbkZyb21Gb3JtKCkge1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdndi1wb2xpY3ktc3R1ZGlvOmtlZXAtZG9jdW1lbnRhdGlvbi1jbG9zZScpO1xuICAgIHRoaXMuX29uT3BlbkRvY3VtZW50YXRpb24oKTtcbiAgfVxuXG4gIF9maW5kRmxvd0NvbGxlY3Rpb24oZmxvd0lkKSB7XG4gICAgY29uc3QgcGxhbiA9IHRoaXMuZGVmaW5lZFBsYW5zLmZpbmQoKHBsYW4pID0+IHBsYW4uZmxvd3MuZmluZCgoZmxvdykgPT4gZmxvdy5faWQgPT09IGZsb3dJZCkgIT0gbnVsbCk7XG4gICAgcmV0dXJuIHsgcGxhbiwgZmxvd3M6IHBsYW4gIT0gbnVsbCA/IHBsYW4uZmxvd3MgOiB0aGlzLmRlZmluZWRGbG93cyB9O1xuICB9XG5cbiAgX2ZpbmRGbG93QnlJZChmbG93SWQpIHtcbiAgICBsZXQgZmxvdyA9IHRoaXMuZGVmaW5lZEZsb3dzLmZpbmQoKGZsb3cpID0+IGZsb3cuX2lkID09PSBmbG93SWQpO1xuICAgIGlmIChmbG93ID09IG51bGwpIHtcbiAgICAgIGNvbnN0IHBsYW5zRmxvd3MgPSB0aGlzLmRlZmluZWRQbGFucy5tYXAoKHBsYW4pID0+IHBsYW4uZmxvd3MpLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYy5jb25jYXQodmFsKSwgW10pO1xuICAgICAgZmxvdyA9IHBsYW5zRmxvd3MuZmluZCgoZmxvdykgPT4gZmxvdy5faWQgPT09IGZsb3dJZCk7XG4gICAgfVxuICAgIHJldHVybiBmbG93O1xuICB9XG5cbiAgZ2V0U2VsZWN0ZWRGbG93KGluZGV4ID0gMCkge1xuICAgIGNvbnN0IHNlbGVjdGVkRmxvd0lkID0gdGhpcy5zZWxlY3RlZEZsb3dzSWRbaW5kZXhdO1xuICAgIHJldHVybiB0aGlzLl9maW5kRmxvd0J5SWQoc2VsZWN0ZWRGbG93SWQpO1xuICB9XG5cbiAgX29uVGFyZ2V0UG9saWN5KHsgZGV0YWlsIH0pIHtcbiAgICBpZiAodGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbiA9PSBudWxsKSB7XG4gICAgICB0aGlzLl9kcmFnUG9saWN5ID0gZGV0YWlsO1xuICAgIH1cbiAgfVxuXG4gIF9vbkNoYW5nZUZsb3dTdGVwKHsgZGV0YWlsIH0pIHtcbiAgICB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuX3ZhbHVlcyA9IGRldGFpbC52YWx1ZXM7XG4gIH1cblxuICBfd3JpdGVGbG93U3RlcCh2YWx1ZXMpIHtcbiAgICBjb25zdCB7IGRlc2NyaXB0aW9uLCAuLi5jb25maWd1cmF0aW9uIH0gPSB2YWx1ZXM7XG4gICAgaWYgKFxuICAgICAgdGhpcy5fY3VycmVudEZsb3dTdGVwLnN0ZXAuX25ldyB8fFxuICAgICAgdGhpcy5fY3VycmVudEZsb3dTdGVwLnN0ZXAuZGVzY3JpcHRpb24gIT09IGRlc2NyaXB0aW9uIHx8XG4gICAgICAhZGVlcEVxdWFsKHRoaXMuX2N1cnJlbnRGbG93U3RlcC5zdGVwLmNvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb24pXG4gICAgKSB7XG4gICAgICBjb25zdCBmbG93ID0gdGhpcy5fZmluZEZsb3dCeUlkKHRoaXMuX2N1cnJlbnRGbG93U3RlcC5mbG93Ll9pZCk7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IGZsb3dbdGhpcy5fY3VycmVudEZsb3dTdGVwLmdyb3VwXS5maW5kSW5kZXgoKHN0ZXApID0+IHN0ZXAuX2lkID09PSB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuc3RlcC5faWQpO1xuXG4gICAgICBmbG93W3RoaXMuX2N1cnJlbnRGbG93U3RlcC5ncm91cF1bcG9zaXRpb25dLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgICBmbG93W3RoaXMuX2N1cnJlbnRGbG93U3RlcC5ncm91cF1bcG9zaXRpb25dLmNvbmZpZ3VyYXRpb24gPSBkZWVwQ2xvbmUoY29uZmlndXJhdGlvbik7XG4gICAgICBkZWxldGUgZmxvd1t0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuZ3JvdXBdW3Bvc2l0aW9uXS5fbmV3O1xuICAgICAgZmxvd1t0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuZ3JvdXBdW3Bvc2l0aW9uXS5fZGlydHkgPSB0cnVlO1xuICAgICAgZmxvdy5fZGlydHkgPSB0cnVlO1xuICAgICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2N1cnJlbnRGbG93U3RlcC5mbG93ID0gZmxvdztcbiAgICAgIHRoaXMuX2N1cnJlbnRGbG93U3RlcC5zdGVwID0gZmxvd1t0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuZ3JvdXBdW3Bvc2l0aW9uXTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBfb25TdWJtaXRGbG93U3RlcCh7IGRldGFpbCB9KSB7XG4gICAgdGhpcy5fd3JpdGVGbG93U3RlcChkZXRhaWwudmFsdWVzKTtcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3RVcGRhdGUoJ19kZWZpbml0aW9uJyk7XG4gICAgdGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2goKGMpID0+IGMucmVxdWVzdFVwZGF0ZSgpKTtcbiAgfVxuXG4gIF9vbkNhbmNlbEZsb3coKSB7XG4gICAgdGhpcy5fb25EZXNpZ24oKTtcbiAgfVxuXG4gIF9vblN1Ym1pdEZsb3coeyBkZXRhaWw6IHsgdmFsdWVzIH0gfSkge1xuICAgIGNvbnN0IHNlbGVjdGVkRmxvdyA9IHRoaXMuZ2V0U2VsZWN0ZWRGbG93KCk7XG4gICAgY29uc3QgX3ZhbHVlcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2NyZWF0ZUZsb3dGcm9tU2NoZW1hKCksIHZhbHVlcyk7XG4gICAgY29uc3Qgc2VsZWN0ZWRGbG93VXBkYXRlZCA9IE9iamVjdC5hc3NpZ24oe30sIHNlbGVjdGVkRmxvdywgX3ZhbHVlcyk7XG4gICAgaWYgKCFkZWVwRXF1YWwoc2VsZWN0ZWRGbG93LCBzZWxlY3RlZEZsb3dVcGRhdGVkKSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihzZWxlY3RlZEZsb3csIHNlbGVjdGVkRmxvd1VwZGF0ZWQsIHsgX2RpcnR5OiB0cnVlIH0pO1xuICAgICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3JlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICBfb25DYW5jZWxGbG93TW9kZSgpIHtcbiAgICB0aGlzLl9vbkRlc2lnbigpO1xuICB9XG5cbiAgX29uU3VibWl0Rmxvd01vZGUoeyBkZXRhaWw6IHsgdmFsdWVzIH0gfSkge1xuICAgIHRoaXMuX2RlZmluaXRpb25bJ2Zsb3ctbW9kZSddID0gdmFsdWVzWydmbG93LW1vZGUnXSB8fCAnREVGQVVMVCc7XG4gICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLl9yZWZyZXNoKCk7XG4gIH1cblxuICBfb25DaGFuZ2VUYWIoeyBkZXRhaWwgfSkge1xuICAgIHRoaXMuX2NoYW5nZVRhYihkZXRhaWwudmFsdWUpO1xuICB9XG5cbiAgYXN5bmMgX2NoYW5nZVRhYlZhbGlkYXRvcih7IGZyb20sIHRvIH0pIHtcbiAgICBpZiAoZnJvbSA9PT0gJ3Byb3BlcnRpZXMnKSB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignZ3YtcHJvcGVydGllcycpO1xuICAgICAgaWYgKGNvbXBvbmVudC5kaXJ0eSkge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmNvbmZpcm0oKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZyb20gPT09ICdyZXNvdXJjZXMnKSB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignZ3YtcmVzb3VyY2VzJyk7XG4gICAgICBpZiAoY29tcG9uZW50LmRpcnR5KSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuY29uZmlybSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fYXNrVG9WYWxpZGF0ZUZvcm1zKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb24gPSBudWxsO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBfY2hhbmdlVGFiKHRhYklkKSB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb24gPT0gbnVsbCkge1xuICAgICAgdGhpcy50YWJJZCA9IHRhYklkO1xuICAgICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnY2hhbmdlLXRhYicsIHRoaXMudGFiSWQpO1xuICAgIH1cbiAgfVxuXG4gIF9vbkRyYWdTdGFydEZsb3dTdGVwKGZsb3csIHsgZGV0YWlsIH0pIHtcbiAgICBpZiAodGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbiA9PSBudWxsKSB7XG4gICAgICB0aGlzLl9kcm9wUG9saWN5ID0gZGV0YWlsO1xuICAgICAgdGhpcy5fZHJhZ1BvbGljeSA9IGRldGFpbDtcbiAgICB9XG4gIH1cblxuICBfcmVuZGVyRmxvd0VtcHR5U3RhdGUocmVhZG9ubHlNb2RlKSB7XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBzbG90PVwiY29udGVudFwiIGNsYXNzPVwiZW1wdHlcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIFNlbGVjdCBhIGZsb3dcbiAgICAgICAgJHtyZWFkb25seU1vZGUgIT09IHRydWVcbiAgICAgICAgICA/IGh0bWxgb3IgPGd2LWJ1dHRvbiBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vbkFkZEZsb3d9XCIgb3V0bGluZWQgaWNvbj1cImNvZGU6cGx1c1wiIGxhcmdlPmRlc2lnbiBuZXcgb25lPC9ndi1idXR0b24+YFxuICAgICAgICAgIDogJyd9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgX3JlbmRlckZsb3coaW5kZXggPSAwLCBoYXNFbXB0eVN0YXRlID0gdHJ1ZSwgcmVhZG9ubHlNb2RlKSB7XG4gICAgY29uc3QgZmxvdyA9IHRoaXMuZ2V0U2VsZWN0ZWRGbG93KGluZGV4KTtcbiAgICBpZiAoZmxvdykge1xuICAgICAgY29uc3QgeyBwbGFuIH0gPSB0aGlzLl9maW5kRmxvd0NvbGxlY3Rpb24oZmxvdy5faWQpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRTdGVwSWQgPSB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAgPyB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuc3RlcC5faWQgOiBudWxsO1xuICAgICAgcmV0dXJuIGh0bWxgIDxndi1mbG93XG4gICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAxMDAlXCJcbiAgICAgICAgLmlkPVwiJHtmbG93Ll9pZH1cIlxuICAgICAgICAuZmxvdz1cIiR7Zmxvd31cIlxuICAgICAgICAucGxhbj1cIiR7cGxhbn1cIlxuICAgICAgICAucG9saWNpZXM9XCIke3RoaXMucG9saWNpZXN9XCJcbiAgICAgICAgc2xvdD1cImNvbnRlbnRcIlxuICAgICAgICA/ZGlzYWJsZWQ9XCIke3RoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb259XCJcbiAgICAgICAgLmRyYWdQb2xpY3k9XCIke3RoaXMuX2RyYWdQb2xpY3l9XCJcbiAgICAgICAgLmRyb3BQb2xpY3k9XCIke3RoaXMuX2Ryb3BQb2xpY3l9XCJcbiAgICAgICAgLnNlbGVjdGVkU3RlcElkPVwiJHtzZWxlY3RlZFN0ZXBJZH1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3JlYWRvbmx5TW9kZX1cIlxuICAgICAgICA/aGFzLXBvbGljeS1maWx0ZXI9XCIke3RoaXMuX3BvbGljeUZpbHRlck9wdGlvbnMgIT0gbnVsbH1cIlxuICAgICAgICBmbG93cy10aXRsZT1cIiR7dGhpcy5mbG93c1RpdGxlfVwiXG4gICAgICAgIEBndi1mbG93OmRyYWctc3RhcnQ9XCIke3RoaXMuX29uRHJhZ1N0YXJ0Rmxvd1N0ZXAuYmluZCh0aGlzLCBmbG93KX1cIlxuICAgICAgICBAZ3YtZmxvdzplZGl0PVwiJHt0aGlzLl9vbkVkaXRGbG93U3RlcH1cIlxuICAgICAgICBAZ3YtZmxvdzpjaGFuZ2Utc3RhdGU9XCIke3RoaXMuX29uQ2hhbmdlRmxvd1N0ZXBTdGF0ZX1cIlxuICAgICAgICBAZ3YtZmxvdzpkcm9wPVwiJHt0aGlzLl9vbkRyb3BQb2xpY3l9XCJcbiAgICAgICAgQGd2LWZsb3c6ZGVsZXRlPVwiJHt0aGlzLl9vbkRlbGV0ZVBvbGljeX1cIlxuICAgICAgPjwvZ3YtZmxvdz5gO1xuICAgIH0gZWxzZSBpZiAoaGFzRW1wdHlTdGF0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlckZsb3dFbXB0eVN0YXRlKHJlYWRvbmx5TW9kZSk7XG4gICAgfVxuICAgIHJldHVybiBodG1sYGA7XG4gIH1cblxuICBfb25GZXRjaFJlc291cmNlcyhldmVudCkge1xuICAgIGNvbnN0IHsgY3VycmVudFRhcmdldCwgcmVnZXhUeXBlcyB9ID0gZXZlbnQuZGV0YWlsO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmRlZmluZWRSZXNvdXJjZXNcbiAgICAgIC5maWx0ZXIoKHJlc291cmNlKSA9PiByZWdleFR5cGVzID09IG51bGwgfHwgbmV3IFJlZ0V4cChyZWdleFR5cGVzKS50ZXN0KHJlc291cmNlLnR5cGUpKVxuICAgICAgLm1hcCgocmVzb3VyY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IHRoaXMucmVzb3VyY2VUeXBlcy5maW5kKCh0eXBlKSA9PiB0eXBlLmlkID09PSByZXNvdXJjZS50eXBlKTtcbiAgICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZ3Ytcm93Jyk7XG4gICAgICAgIGNvbnN0IHBpY3R1cmUgPSByZXNvdXJjZVR5cGUuaWNvbiA/IHJlc291cmNlVHlwZS5pY29uIDogbnVsbDtcbiAgICAgICAgcm93Lml0ZW0gPSB7IHBpY3R1cmUsIG5hbWU6IHJlc291cmNlLm5hbWUgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlbGVtZW50OiByb3csXG4gICAgICAgICAgdmFsdWU6IHJlc291cmNlLm5hbWUsXG4gICAgICAgICAgaWQ6IHJlc291cmNlLnR5cGUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICBjdXJyZW50VGFyZ2V0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgX3JlbmRlclBvbGljeShyZWFkb25seU1vZGUpIHtcbiAgICBpZiAodGhpcy5fZmxvd1N0ZXBTY2hlbWEgJiYgdGhpcy5kb2N1bWVudGF0aW9uKSB7XG4gICAgICByZXR1cm4gaHRtbGA8Z3YtcmVzaXphYmxlLXZpZXdzIGRpcmVjdGlvbj1cImhvcml6b250YWxcIiBuby1vdmVyZmxvdz5cbiAgICAgICAgPGRpdiBzbG90PVwidG9wXCI+JHt0aGlzLl9yZW5kZXJGbG93U3RlcEZvcm0ocmVhZG9ubHlNb2RlKX08L2Rpdj5cbiAgICAgICAgPGRpdiBzbG90PVwiYm90dG9tXCI+XG4gICAgICAgICAgPGd2LWRvY3VtZW50YXRpb25cbiAgICAgICAgICAgIC50ZXh0PVwiJHt0aGlzLmRvY3VtZW50YXRpb24uY29udGVudH1cIlxuICAgICAgICAgICAgLmltYWdlPVwiJHt0aGlzLmRvY3VtZW50YXRpb24uaW1hZ2V9XCJcbiAgICAgICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbn1cIlxuICAgICAgICAgICAgQGd2LWRvY3VtZW50YXRpb246Y2xvc2U9XCIke3RoaXMuX29uQ2xvc2VEb2N1bWVudGF0aW9ufVwiXG4gICAgICAgICAgPjwvZ3YtZG9jdW1lbnRhdGlvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2d2LXJlc2l6YWJsZS12aWV3cz5gO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kb2N1bWVudGF0aW9uKSB7XG4gICAgICByZXR1cm4gaHRtbGA8Z3YtZG9jdW1lbnRhdGlvblxuICAgICAgICAudGV4dD1cIiR7dGhpcy5kb2N1bWVudGF0aW9uLmNvbnRlbnR9XCJcbiAgICAgICAgLmltYWdlPVwiJHt0aGlzLmRvY3VtZW50YXRpb24uaW1hZ2V9XCJcbiAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9ufVwiXG4gICAgICAgIEBndi1kb2N1bWVudGF0aW9uOmNsb3NlPVwiJHt0aGlzLl9vbkNsb3NlRG9jdW1lbnRhdGlvbn1cIlxuICAgICAgPjwvZ3YtZG9jdW1lbnRhdGlvbj5gO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fZmxvd1N0ZXBTY2hlbWEpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJGbG93U3RlcEZvcm0ocmVhZG9ubHlNb2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgYDtcbiAgfVxuXG4gIF9nZXRGbG93U3RlcEZvcm0oKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGAjJHtGTE9XX1NURVBfRk9STV9JRH1gKTtcbiAgfVxuXG4gIF9vblJlc2V0Rmxvd1N0ZXAoKSB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRGbG93U3RlcCkge1xuICAgICAgZGVsZXRlIHRoaXMuX2N1cnJlbnRGbG93U3RlcC5fdmFsdWVzO1xuICAgICAgdGhpcy5fZ2V0Rmxvd1N0ZXBGb3JtKCkucmVzZXQoKTtcbiAgICB9XG4gIH1cblxuICBfZ2VuZXJhdGVGbG93c0lkKGxpc3QsIGZvcmNlID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2VuZXJhdGVJZCgnZicsIGxpc3QsIGZvcmNlLCB0cnVlKTtcbiAgfVxuXG4gIF9nZW5lcmF0ZVBsYW5GbG93c0lkKHBsYW4sIGZvcmNlID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2VuZXJhdGVJZChwbGFuLmlkLCBwbGFuLmZsb3dzLCBmb3JjZSwgdHJ1ZSk7XG4gIH1cblxuICBfZ2VuZXJhdGVGbG93U3RlcElkKGZsb3dJZCwgZmxvd0tleSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gYCR7Zmxvd0lkfV8ke2Zsb3dLZXl9XyR7cG9zaXRpb259YDtcbiAgfVxuXG4gIF9nZW5lcmF0ZUlkKHByZWZpeCwgbGlzdCwgZm9yY2UgPSBmYWxzZSwgaXNGbG93ID0gZmFsc2UpIHtcbiAgICBpZiAobGlzdCkge1xuICAgICAgcmV0dXJuIGxpc3QubWFwKChlLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBfaWQgPSBgJHtwcmVmaXh9XyR7aW5kZXh9YDtcbiAgICAgICAgaWYgKGlzRmxvdykge1xuICAgICAgICAgIGlmIChlLnByZSkge1xuICAgICAgICAgICAgZS5wcmUuZm9yRWFjaCgoc3RlcCwgc3RlcEluZGV4KSA9PiAoc3RlcC5faWQgPSB0aGlzLl9nZW5lcmF0ZUZsb3dTdGVwSWQoX2lkLCAncHJlJywgc3RlcEluZGV4KSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZS5wb3N0KSB7XG4gICAgICAgICAgICBlLnBvc3QuZm9yRWFjaCgoc3RlcCwgc3RlcEluZGV4KSA9PiAoc3RlcC5faWQgPSB0aGlzLl9nZW5lcmF0ZUZsb3dTdGVwSWQoX2lkLCAncG9zdCcsIHN0ZXBJbmRleCkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcmNlIHx8IGUuX2lkID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5lLCBfaWQgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIGdldENoaWxkcmVuKCkge1xuICAgIHJldHVybiBbXG4gICAgICAuLi5BcnJheS5mcm9tKHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdndi1mbG93JykpLFxuICAgICAgLi4uQXJyYXkuZnJvbSh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnZ3YtcmVzaXphYmxlLXZpZXdzJykpLFxuICAgIF07XG4gIH1cblxuICBhc3luYyBnZXRVcGRhdGVDb21wbGV0ZSgpIHtcbiAgICBhd2FpdCBzdXBlci5nZXRVcGRhdGVDb21wbGV0ZSgpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuZ2V0Q2hpbGRyZW4oKS5tYXAoKGUpID0+IGUudXBkYXRlQ29tcGxldGUpKTtcbiAgfVxuXG4gIHNob3VsZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcykge1xuICAgIC8vIEp1c3QgcmVmcmVzaCBndi1mbG93IGNvbXBvbmVudHNcbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdfZHJhZ1BvbGljeScpKSB7XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnZ3YtZmxvdycpLmZvckVhY2goKGZsb3cpID0+IChmbG93LmRyYWdQb2xpY3kgPSB0aGlzLl9kcmFnUG9saWN5KSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ19kcm9wUG9saWN5JykpIHtcbiAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdndi1mbG93JykuZm9yRWFjaCgoZmxvdykgPT4gKGZsb3cuZHJvcFBvbGljeSA9IHRoaXMuX2Ryb3BQb2xpY3kpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnNob3VsZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gIH1cblxuICB1cGRhdGVkKHByb3BzKSB7XG4gICAgaWYgKHByb3BzLmhhcygnZG9jdW1lbnRhdGlvbicpICYmIHRoaXMuZG9jdW1lbnRhdGlvbiAhPSBudWxsICYmIHRoaXMuc2VsZWN0ZWRGbG93c0lkLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkRmxvd3MoW3RoaXMuc2VsZWN0ZWRGbG93c0lkWzBdXSk7XG4gICAgfVxuICB9XG5cbiAgX3JlbmRlckZsb3dTdGVwRm9ybShyZWFkb25seU1vZGUpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuX3ZhbHVlcyB8fCB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuX2luaXRpYWxWYWx1ZXM7XG4gICAgcmV0dXJuIGh0bWxgJHtjYWNoZShcbiAgICAgIHRoaXMuX2Zsb3dTdGVwU2NoZW1hICYmIHRoaXMuX2N1cnJlbnRGbG93U3RlcFxuICAgICAgICA/IGh0bWxgPGRpdiBjbGFzcz1cImZsb3ctc3RlcF9fY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxvdy1zdGVwX19mb3JtXCI+XG4gICAgICAgICAgICAgIDxndi1zY2hlbWEtZm9ybVxuICAgICAgICAgICAgICAgIC5pZD1cIiR7RkxPV19TVEVQX0ZPUk1fSUR9XCJcbiAgICAgICAgICAgICAgICAuc2NoZW1hPVwiJHt0aGlzLl9mbG93U3RlcFNjaGVtYX1cIlxuICAgICAgICAgICAgICAgIC5pY29uPVwiZGVzaWduOmVkaXRcIlxuICAgICAgICAgICAgICAgIGhhcy1oZWFkZXJcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZS1vbi1yZW5kZXJcbiAgICAgICAgICAgICAgICAudmFsdWVzPVwiJHt2YWx1ZXN9XCJcbiAgICAgICAgICAgICAgICAuZGlydHk9XCIke3RoaXMuX2N1cnJlbnRGbG93U3RlcC5fdmFsdWVzICE9IG51bGx9XCJcbiAgICAgICAgICAgICAgICA/cmVhZG9ubHk9XCIke3JlYWRvbmx5TW9kZX1cIlxuICAgICAgICAgICAgICAgIHNjcm9sbGFibGVcbiAgICAgICAgICAgICAgICBAZ3Ytc2NoZW1hLWZvcm06Y2hhbmdlPVwiJHt0aGlzLl9vbkNoYW5nZUZsb3dTdGVwfVwiXG4gICAgICAgICAgICAgICAgQGd2LXNjaGVtYS1mb3JtOnJlc2V0PVwiJHt0aGlzLl9vblJlc2V0Rmxvd1N0ZXB9XCJcbiAgICAgICAgICAgICAgICBAZ3Ytc2NoZW1hLWZvcm06ZmV0Y2gtcmVzb3VyY2VzPVwiJHt0aGlzLl9vbkZldGNoUmVzb3VyY2VzfVwiXG4gICAgICAgICAgICAgICAgQGd2LXNjaGVtYS1mb3JtOnN1Ym1pdD1cIiR7dGhpcy5fb25TdWJtaXRGbG93U3RlcH1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBzbG90PVwidGl0bGVcIiBjbGFzcz1cImZsb3ctc3RlcF9fZm9ybS10aXRsZVwiPiR7dGhpcy5fY3VycmVudEZsb3dTdGVwLnN0ZXAubmFtZX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8Z3YtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBzbG90PVwiaGVhZGVyLWxlZnRcIlxuICAgICAgICAgICAgICAgICAgaWNvbj1cImdlbmVyYWw6Y2xvc2VcIlxuICAgICAgICAgICAgICAgICAgb3V0bGluZWRcbiAgICAgICAgICAgICAgICAgIHNtYWxsXG4gICAgICAgICAgICAgICAgICBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vbkNsb3NlRmxvd1N0ZXBGb3JtfVwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIkNsb3NlIChlc2MpXCJcbiAgICAgICAgICAgICAgICA+PC9ndi1idXR0b24+XG4gICAgICAgICAgICAgICAgPGd2LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgc2xvdD1cImhlYWRlci1sZWZ0XCJcbiAgICAgICAgICAgICAgICAgIGljb249XCJob21lOmJvb2tcIlxuICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLmRvY3VtZW50YXRpb24gIT0gbnVsbH1cIlxuICAgICAgICAgICAgICAgICAgb3V0bGluZWRcbiAgICAgICAgICAgICAgICAgIHNtYWxsXG4gICAgICAgICAgICAgICAgICBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vbk9wZW5Eb2N1bWVudGF0aW9uRnJvbUZvcm19XCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiT3BlbiBkb2N1bWVudGF0aW9uXCJcbiAgICAgICAgICAgICAgICA+PC9ndi1idXR0b24+XG4gICAgICAgICAgICAgIDwvZ3Ytc2NoZW1hLWZvcm0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5gXG4gICAgICAgIDogJycsXG4gICAgKX1gO1xuICB9XG5cbiAgX29uQ2xvc2VEb2N1bWVudGF0aW9uKCkge1xuICAgIHRoaXMuZG9jdW1lbnRhdGlvbiA9IG51bGw7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRGbG93U3RlcCA9PSBudWxsKSB7XG4gICAgICB0aGlzLl9tYXhpbWl6ZVRvcFZpZXcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2d2LXBvbGljeS1zdHVkaW86a2VlcC1kb2N1bWVudGF0aW9uLWNsb3NlJywgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgX29uRGVsZXRlRmxvdyh7IGRldGFpbCB9KSB7XG4gICAgY29uc3QgZmxvd0lkID0gZGV0YWlsLmNvbnRlbnQuX2lkO1xuICAgIGNvbnN0IHsgZmxvd3MgfSA9IHRoaXMuX2ZpbmRGbG93Q29sbGVjdGlvbihmbG93SWQpO1xuICAgIGNvbnN0IGZsb3cgPSBmbG93cy5maW5kKChmbG93KSA9PiBmbG93Ll9pZCA9PT0gZmxvd0lkKTtcbiAgICB0aGlzLl9kZWxldGVGbG93KGZsb3dzLCBmbG93KTtcbiAgfVxuXG4gIGdldCBkZWZpbmVkRmxvd3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmluaXRpb24gJiYgdGhpcy5fZGVmaW5pdGlvbi5mbG93cyA/IHRoaXMuX2RlZmluaXRpb24uZmxvd3MgOiBbXTtcbiAgfVxuXG4gIGdldCBkZWZpbmVkUGxhbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmluaXRpb24gJiYgdGhpcy5fZGVmaW5pdGlvbi5wbGFucyA/IHRoaXMuX2RlZmluaXRpb24ucGxhbnMgOiBbXTtcbiAgfVxuXG4gIGdldCBkZWZpbmVkUmVzb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWZpbml0aW9uICYmIHRoaXMuX2RlZmluaXRpb24ucmVzb3VyY2VzID8gdGhpcy5fZGVmaW5pdGlvbi5yZXNvdXJjZXMgOiBbXTtcbiAgfVxuXG4gIGdldCBkZWZpbmVkUHJvcGVydGllcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmaW5pdGlvbiAmJiB0aGlzLl9kZWZpbml0aW9uLnByb3BlcnRpZXMgPyB0aGlzLl9kZWZpbml0aW9uLnByb3BlcnRpZXMgOiBbXTtcbiAgfVxuXG4gIGFzeW5jIF9vbkR1cGxpY2F0ZUZsb3coeyBkZXRhaWwgfSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9hc2tUb1ZhbGlkYXRlRm9ybXMoKTtcblxuICAgICAgY29uc3QgZmxvd0lkID0gZGV0YWlsLmNvbnRlbnQuX2lkO1xuICAgICAgY29uc3QgeyBwbGFuLCBmbG93cyB9ID0gdGhpcy5fZmluZEZsb3dDb2xsZWN0aW9uKGZsb3dJZCk7XG4gICAgICB0aGlzLl9hZGRGbG93KGZsb3dzLCB0aGlzLl9maW5kRmxvd0J5SWQoZmxvd0lkKSk7XG4gICAgICBpZiAocGxhbiAhPSBudWxsKSB7XG4gICAgICAgIGxldCBwbGFuSW5kZXggPSBudWxsO1xuICAgICAgICB0aGlzLmRlZmluZWRQbGFucy5maW5kKChwLCBpKSA9PiB7XG4gICAgICAgICAgaWYgKHAuaWQgPT09IHBsYW4uaWQpIHtcbiAgICAgICAgICAgIHBsYW5JbmRleCA9IGk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgICAgcGxhbi5mbG93cyA9IGZsb3dzO1xuICAgICAgICB0aGlzLmRlZmluZWRQbGFuc1twbGFuSW5kZXhdLmZsb3dzID0gdGhpcy5fZ2VuZXJhdGVQbGFuRmxvd3NJZChwbGFuLCB0cnVlKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlU2VsZWN0ZWRGbG93cyhbdGhpcy5kZWZpbmVkUGxhbnNbcGxhbkluZGV4XS5mbG93c1tmbG93cy5sZW5ndGggLSAxXS5faWRdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2RlZmluaXRpb24uZmxvd3MgPSB0aGlzLl9nZW5lcmF0ZUZsb3dzSWQodGhpcy5fZGVmaW5pdGlvbi5mbG93cyk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkRmxvd3MoW3RoaXMuX2RlZmluaXRpb24uZmxvd3NbdGhpcy5fZGVmaW5pdGlvbi5mbG93cy5sZW5ndGggLSAxXS5faWRdKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb24gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIF9vbkNoYW5nZUZsb3dTdGF0ZSh7IGRldGFpbCB9KSB7XG4gICAgY29uc3QgZmxvdyA9IHRoaXMuX2ZpbmRGbG93QnlJZChkZXRhaWwuY29udGVudC5faWQpO1xuICAgIGZsb3cuZW5hYmxlZCA9IGRldGFpbC5lbmFibGVkO1xuICAgIGZsb3cuX2RpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLmlzRGlydHkgPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgX29uQWRkRmxvd1BsYW4oeyBkZXRhaWwgfSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9hc2tUb1ZhbGlkYXRlRm9ybXMoKTtcbiAgICAgIHRoaXMuX2FkZEZsb3codGhpcy5kZWZpbmVkUGxhbnNbZGV0YWlsLnBsYW5JbmRleF0uZmxvd3MpO1xuICAgICAgdGhpcy5kZWZpbmVkUGxhbnNbZGV0YWlsLnBsYW5JbmRleF0uZmxvd3MgPSB0aGlzLl9nZW5lcmF0ZVBsYW5GbG93c0lkKHRoaXMuZGVmaW5lZFBsYW5zW2RldGFpbC5wbGFuSW5kZXhdKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkRmxvd3MoW3RoaXMuZGVmaW5lZFBsYW5zW2RldGFpbC5wbGFuSW5kZXhdLmZsb3dzW3RoaXMuZGVmaW5lZFBsYW5zW2RldGFpbC5wbGFuSW5kZXhdLmZsb3dzLmxlbmd0aCAtIDFdLl9pZF0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX29uQWRkRmxvdygpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fYXNrVG9WYWxpZGF0ZUZvcm1zKCk7XG5cbiAgICAgIHRoaXMuX2FkZEZsb3codGhpcy5fZGVmaW5pdGlvbi5mbG93cyk7XG4gICAgICB0aGlzLl9kZWZpbml0aW9uLmZsb3dzID0gdGhpcy5fZ2VuZXJhdGVGbG93c0lkKHRoaXMuX2RlZmluaXRpb24uZmxvd3MpO1xuICAgICAgdGhpcy5fdXBkYXRlU2VsZWN0ZWRGbG93cyhbdGhpcy5fZGVmaW5pdGlvbi5mbG93c1t0aGlzLl9kZWZpbml0aW9uLmZsb3dzLmxlbmd0aCAtIDFdLl9pZF0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgX2FkZEZsb3coY29sbGVjdGlvbiwgZHVwbGljYXRlID0gbnVsbCkge1xuICAgIGNvbnN0IGZsb3cgPVxuICAgICAgZHVwbGljYXRlID09IG51bGxcbiAgICAgICAgPyB0aGlzLl9jcmVhdGVGbG93RnJvbVNjaGVtYSgpXG4gICAgICAgIDoge1xuICAgICAgICAgICAgLi4uZHVwbGljYXRlLFxuICAgICAgICAgICAgX2lkOiBudWxsLFxuICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGlkIHRvIGF2b2lkIGlzc3VlIHdpdGggQU0gdGhhdCBwZXJzaXN0cyB0aGUgSURcbiAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgX2RpcnR5OiB0cnVlLFxuICAgICAgICAgIH07XG5cbiAgICBjb2xsZWN0aW9uLnB1c2goZmxvdyk7XG4gICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgfVxuXG4gIF9jcmVhdGVGbG93RnJvbVNjaGVtYSgpIHtcbiAgICBjb25zdCBuZXdGbG93ID0ge1xuICAgICAgbmFtZTogJycsXG4gICAgICBwcmU6IFtdLFxuICAgICAgcG9zdDogW10sXG4gICAgICBfZGlydHk6IHRydWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLl9pbnN0YW50aWF0ZSh0aGlzLmZsb3dTY2hlbWEucHJvcGVydGllcywgbmV3Rmxvdyk7XG4gIH1cblxuICBfaW5zdGFudGlhdGUocHJvcGVydGllc0RlZmluaXRpb24sIGluaXRpYXRvciA9IHt9KSB7XG4gICAgY29uc3QgcHJvcGVydHkgPSB7IC4uLmluaXRpYXRvciB9O1xuXG4gICAgaWYgKHByb3BlcnRpZXNEZWZpbml0aW9uKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzRGVmaW5pdGlvbikpIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBwcm9wZXJ0aWVzRGVmaW5pdGlvbltrZXldO1xuXG4gICAgICAgIGlmIChlbnRyeS50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHByb3BlcnR5W2tleV0gPSB0aGlzLl9pbnN0YW50aWF0ZShlbnRyeS5wcm9wZXJ0aWVzLCAoaW5pdGlhdG9yID0ge30pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcHJvcGVydHlba2V5XSA9IGVudHJ5LmRlZmF1bHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoZW50cnkudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBwcm9wZXJ0eVtrZXldID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcGVydHk7XG4gIH1cblxuICBfZGVsZXRlRmxvdyhjb2xsZWN0aW9uLCBmbG93KSB7XG4gICAgY29uc3QgaW5kZXggPSBjb2xsZWN0aW9uLmluZGV4T2YoZmxvdyk7XG4gICAgY29sbGVjdGlvbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGNvbnN0IHNlbGVjdGVkRmxvd3MgPSB0aGlzLnNlbGVjdGVkRmxvd3NJZC5maWx0ZXIoKGZsb3dJZCkgPT4gZmxvd0lkICE9PSBmbG93Ll9pZCk7XG4gICAgaWYgKHNlbGVjdGVkRmxvd3MubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLl91cGRhdGVTZWxlY3RlZEZsb3dzKHNlbGVjdGVkRmxvd3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3RGaXJzdEZsb3codHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMuX2NoYW5nZVRhYignZGVzaWduJyk7XG4gICAgdGhpcy5fcmVmcmVzaCgpO1xuICAgIHRoaXMuaXNEaXJ0eSA9IHRydWU7XG4gIH1cblxuICBfZmluZEZsb3dJbmRleChsaXN0LCBpZCkge1xuICAgIGxldCBpbmRleCA9IG51bGw7XG4gICAgbGlzdC5maW5kKChmLCBpKSA9PiB7XG4gICAgICBpZiAoZi5faWQgPT09IGlkKSB7XG4gICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgYXN5bmMgX29uUmVvcmRlckZsb3dzKHsgZGV0YWlsOiB7IHBsYW4gfSB9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2Fza1RvVmFsaWRhdGVGb3JtcygpO1xuICAgICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgICAgIGlmIChwbGFuICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgbmV3T3JkZXIgPSB0aGlzLl9nZW5lcmF0ZVBsYW5GbG93c0lkKHBsYW4sIHRydWUpO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZsb3dzSWQpIHtcbiAgICAgICAgICB0aGlzLl91cGRhdGVTZWxlY3RlZEZsb3dzKFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZsb3dzSWQubWFwKChmbG93SWQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9maW5kRmxvd0luZGV4KHBsYW4uZmxvd3MsIGZsb3dJZCk7XG4gICAgICAgICAgICAgIHJldHVybiBpbmRleCAhPSBudWxsID8gbmV3T3JkZXJbaW5kZXhdLl9pZCA6IGZsb3dJZDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcGxhbi5mbG93cyA9IG5ld09yZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3T3JkZXIgPSB0aGlzLl9nZW5lcmF0ZUZsb3dzSWQodGhpcy5fZGVmaW5pdGlvbi5mbG93cywgdHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRmxvd3NJZCkge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkRmxvd3MoXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmxvd3NJZC5tYXAoKGZsb3dJZCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2ZpbmRGbG93SW5kZXgodGhpcy5fZGVmaW5pdGlvbi5mbG93cywgZmxvd0lkKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ICE9IG51bGwgPyBuZXdPcmRlcltpbmRleF0uX2lkIDogZmxvd0lkO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kZWZpbml0aW9uLmZsb3dzID0gbmV3T3JkZXI7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9uID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgX29uU2VhcmNoUG9saWN5KHsgZGV0YWlsIH0pIHtcbiAgICB0aGlzLl9zZWFyY2hQb2xpY3lRdWVyeSA9IGRldGFpbDtcbiAgfVxuXG4gIF9vbkNsZWFyUG9saWN5KCkge1xuICAgIHRoaXMuX3NlYXJjaFBvbGljeVF1ZXJ5ID0gbnVsbDtcbiAgfVxuXG4gIF9vblNlYXJjaEZsb3dzKHsgZGV0YWlsIH0pIHtcbiAgICB0aGlzLl9zZWFyY2hGbG93UXVlcnkgPSBkZXRhaWw7XG4gIH1cblxuICBfb25DbGVhckZsb3dzKCkge1xuICAgIHRoaXMuX3NlYXJjaEZsb3dRdWVyeSA9IG51bGw7XG4gIH1cblxuICBhc3luYyBfb25SZXNldEFsbCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fY2xvc2VGbG93U3RlcEZvcm0oKTtcbiAgICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZXBDbG9uZSh0aGlzLl9pbml0aWFsRGVmaW5pdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgX2ZpbHRlck5vdFZhbGlkU3RlcChzdGVwKSB7XG4gICAgcmV0dXJuIHN0ZXAuX25ldyAhPT0gdHJ1ZTtcbiAgfVxuXG4gIF9yZW1vdmVQcml2YXRlUHJvcGVydGllcyhvKSB7XG4gICAgY29uc3QgY29weSA9IHsgLi4ubyB9O1xuICAgIE9iamVjdC5rZXlzKG8pXG4gICAgICAuZmlsdGVyKChrZXkpID0+IGtleS5zdGFydHNXaXRoKCdfJykpXG4gICAgICAuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGRlbGV0ZSBjb3B5W2tleV07XG4gICAgICB9KTtcbiAgICByZXR1cm4gY29weTtcbiAgfVxuXG4gIF9zdWJtaXRPckNvbmZpcm1Gb3JtcygpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdndi1zY2hlbWEtZm9ybScpXVxuICAgICAgLmZpbHRlcigoZm9ybSkgPT4ge1xuICAgICAgICBjb25zdCBpc1ZhbGlkID0gZm9ybS5pc1ZhbGlkKCk7XG4gICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgZm9ybS5zdWJtaXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWlzVmFsaWQ7XG4gICAgICB9KVxuICAgICAgLm1hcCgoZm9ybSkgPT4gZm9ybS5jb25maXJtKCkpO1xuICB9XG5cbiAgZ2V0UHJvcGVydGllc0VsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdndi1wcm9wZXJ0aWVzJyk7XG4gIH1cblxuICBhc3luYyBfY2hlY2tDdXJyZW50Rmxvd1N0ZXAoKSB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRGbG93U3RlcCAmJiB0aGlzLnNlbGVjdGVkRmxvd3NJZCkge1xuICAgICAgY29uc3QgY2xvc2VQcm9taXNlcyA9IHRoaXMuc2VsZWN0ZWRGbG93c0lkXG4gICAgICAgIC5tYXAoKGZsb3dJZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZsb3cgPSB0aGlzLl9maW5kRmxvd0J5SWQoZmxvd0lkKTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50U3RlcCA9IFsuLi5mbG93LnByZSwgLi4uZmxvdy5wb3N0XS5maW5kKChzdGVwKSA9PiBzdGVwLl9pZCA9PT0gdGhpcy5fY3VycmVudEZsb3dTdGVwLnN0ZXAuX2lkKTtcbiAgICAgICAgICBpZiAoY3VycmVudFN0ZXAgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb3NlRmxvd1N0ZXBGb3JtKHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gbnVsbCk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoY2xvc2VQcm9taXNlcyk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIHNhdmVkKCkge1xuICAgIGlmICh0aGlzLmlzRGlydHkpIHtcbiAgICAgIHRoaXMuX2luaXRpYWxEZWZpbml0aW9uID0gZGVlcENsb25lKHRoaXMuX2RlZmluaXRpb25TYXZlZCk7XG4gICAgICB0aGlzLl9kZWZpbml0aW9uID0gZGVlcENsb25lKHRoaXMuX2RlZmluaXRpb25TYXZlZCk7XG4gICAgICB0aGlzLl9kZWZpbml0aW9uU2F2ZWQgPSBudWxsO1xuICAgICAgdGhpcy5pc0RpcnR5ID0gZmFsc2U7XG4gICAgICB0aGlzLl9jaGVja0N1cnJlbnRGbG93U3RlcCgpO1xuICAgICAgdGhpcy5kZWZpbmVkUGxhbnMuZm9yRWFjaCgocGxhbikgPT4ge1xuICAgICAgICBwbGFuLmZsb3dzLmZvckVhY2goKGZsb3cpID0+IChmbG93Ll9kaXJ0eSA9IGZhbHNlKSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGVmaW5lZEZsb3dzLmZvckVhY2goKGZsb3cpID0+IChmbG93Ll9kaXJ0eSA9IGZhbHNlKSk7XG4gICAgICB0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaCgoZSkgPT4gZS5yZXF1ZXN0VXBkYXRlKCkpO1xuICAgIH1cbiAgfVxuXG4gIF9idWlsZERlZmluaXRpb25Ub1NhdmUoKSB7XG4gICAgLy8gQ29weSBkZWZpbml0aW9uIGFuZCByZW1vdmUgaW52YWxpZCBzdGVwXG4gICAgLy8gS2VlcCBwcml2YXRlIHByb3BlcnRpZXMgbGlrZSBfaWQgYW5kIG90aGVycyBzdHVmZiB1c2VmdWwgZm9yIHJlbmRlclxuICAgIGNvbnN0IGZsb3dzID0gdGhpcy5fZGVmaW5pdGlvbi5mbG93cy5tYXAoKGZsb3cpID0+IHtcbiAgICAgIGZsb3cucHJlID0gZmxvdy5wcmUuZmlsdGVyKHRoaXMuX2ZpbHRlck5vdFZhbGlkU3RlcCk7XG4gICAgICBmbG93LnBvc3QgPSBmbG93LnBvc3QuZmlsdGVyKHRoaXMuX2ZpbHRlck5vdFZhbGlkU3RlcCk7XG4gICAgICByZXR1cm4gZmxvdztcbiAgICB9KTtcblxuICAgIGxldCBkZWZpbml0aW9uID0geyAuLi50aGlzLl9kZWZpbml0aW9uLCBmbG93cyB9O1xuXG4gICAgaWYgKHRoaXMuX2RlZmluaXRpb24ucGxhbnMgIT0gbnVsbCkge1xuICAgICAgY29uc3QgcGxhbnMgPSB0aGlzLl9kZWZpbml0aW9uLnBsYW5zLm1hcCgocGxhbikgPT4ge1xuICAgICAgICBjb25zdCBmbG93cyA9IHBsYW4uZmxvd3MubWFwKChmbG93KSA9PiB7XG4gICAgICAgICAgZmxvdy5wcmUgPSBmbG93LnByZS5maWx0ZXIodGhpcy5fZmlsdGVyTm90VmFsaWRTdGVwKTtcbiAgICAgICAgICBmbG93LnBvc3QgPSBmbG93LnBvc3QuZmlsdGVyKHRoaXMuX2ZpbHRlck5vdFZhbGlkU3RlcCk7XG4gICAgICAgICAgcmV0dXJuIGZsb3c7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyAuLi5wbGFuLCBmbG93cyB9O1xuICAgICAgfSk7XG4gICAgICBkZWZpbml0aW9uID0geyAuLi5kZWZpbml0aW9uLCBwbGFucyB9O1xuICAgIH1cbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgfVxuXG4gIF9idWlsZERlZmluaXRpb25Ub1NlbmQoZGVmaW5pdGlvblRvU2F2ZSkge1xuICAgIC8vIENvcHkgZGVmaW5pdGlvbiBhbmQgcmVtb3ZlIGFsbCBwcml2YXRlIHByb3BlcnRpZXNcbiAgICBjb25zdCBmbG93cyA9IGRlZmluaXRpb25Ub1NhdmUuZmxvd3MubWFwKChmKSA9PiB7XG4gICAgICBjb25zdCBmbG93ID0gdGhpcy5fcmVtb3ZlUHJpdmF0ZVByb3BlcnRpZXMoZik7XG4gICAgICBmbG93LnByZSA9IGZsb3cucHJlLm1hcCh0aGlzLl9yZW1vdmVQcml2YXRlUHJvcGVydGllcyk7XG4gICAgICBmbG93LnBvc3QgPSBmbG93LnBvc3QubWFwKHRoaXMuX3JlbW92ZVByaXZhdGVQcm9wZXJ0aWVzKTtcbiAgICAgIHJldHVybiBmbG93O1xuICAgIH0pO1xuXG4gICAgbGV0IGRlZmluaXRpb24gPSB7IC4uLnRoaXMuX2RlZmluaXRpb24sIGZsb3dzIH07XG4gICAgaWYgKHRoaXMuX2RlZmluaXRpb24ucGxhbnMgIT0gbnVsbCkge1xuICAgICAgY29uc3QgcGxhbnMgPSBkZWZpbml0aW9uVG9TYXZlLnBsYW5zLm1hcCgocGxhbikgPT4ge1xuICAgICAgICBjb25zdCBmbG93cyA9IHBsYW4uZmxvd3MubWFwKChmKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmxvdyA9IHRoaXMuX3JlbW92ZVByaXZhdGVQcm9wZXJ0aWVzKGYpO1xuICAgICAgICAgIGZsb3cucHJlID0gZmxvdy5wcmUubWFwKHRoaXMuX3JlbW92ZVByaXZhdGVQcm9wZXJ0aWVzKTtcbiAgICAgICAgICBmbG93LnBvc3QgPSBmbG93LnBvc3QubWFwKHRoaXMuX3JlbW92ZVByaXZhdGVQcm9wZXJ0aWVzKTtcbiAgICAgICAgICByZXR1cm4gZmxvdztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IC4uLnBsYW4sIGZsb3dzIH07XG4gICAgICB9KTtcbiAgICAgIGRlZmluaXRpb24gPSB7IC4uLmRlZmluaXRpb24sIHBsYW5zIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RlZmluaXRpb24ucHJvcGVydGllcyAhPSBudWxsKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5fZGVmaW5pdGlvbi5wcm9wZXJ0aWVzLm1hcCh0aGlzLl9yZW1vdmVQcml2YXRlUHJvcGVydGllcyk7XG4gICAgICBkZWZpbml0aW9uID0geyAuLi5kZWZpbml0aW9uLCBwcm9wZXJ0aWVzIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RlZmluaXRpb24ucmVzb3VyY2VzICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMuX2RlZmluaXRpb24ucmVzb3VyY2VzLm1hcCh0aGlzLl9yZW1vdmVQcml2YXRlUHJvcGVydGllcyk7XG4gICAgICBkZWZpbml0aW9uID0geyAuLi5kZWZpbml0aW9uLCByZXNvdXJjZXMgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgfVxuXG4gIF9vblNhdmVBbGwoKSB7XG4gICAgaWYgKHRoaXMuaGFzUHJvcGVydGllcykge1xuICAgICAgdGhpcy5nZXRQcm9wZXJ0aWVzRWxlbWVudCgpLnN1Ym1pdCgpO1xuICAgIH1cblxuICAgIFByb21pc2UuYWxsKHRoaXMuX3N1Ym1pdE9yQ29uZmlybUZvcm1zKCkpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX2RlZmluaXRpb25TYXZlZCA9IHRoaXMuX2J1aWxkRGVmaW5pdGlvblRvU2F2ZSgpO1xuICAgICAgICBjb25zdCBkZWZpbml0aW9uID0gdGhpcy5fYnVpbGREZWZpbml0aW9uVG9TZW5kKHRoaXMuX2RlZmluaXRpb25TYXZlZCk7XG4gICAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ3NhdmUnLCB7IGRlZmluaXRpb24sIHNlcnZpY2VzOiB0aGlzLnNlcnZpY2VzIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtwb2xpY3ktc3R1ZGlvXSBFcnJvciBvbiBzYXZlYCwgZXJyKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgX29uRGVidWcocmVxdWVzdEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaGFzUHJvcGVydGllcykge1xuICAgICAgdGhpcy5nZXRQcm9wZXJ0aWVzRWxlbWVudCgpLnN1Ym1pdCgpO1xuICAgIH1cblxuICAgIFByb21pc2UuYWxsKHRoaXMuX3N1Ym1pdE9yQ29uZmlybUZvcm1zKCkpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlZmluaXRpb24gPSB0aGlzLl9idWlsZERlZmluaXRpb25Ub1NlbmQodGhpcy5fYnVpbGREZWZpbml0aW9uVG9TYXZlKCkpO1xuICAgICAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdkZWJ1ZycsIHsgZGVmaW5pdGlvbiwgc2VydmljZXM6IHRoaXMuc2VydmljZXMsIHJlcXVlc3Q6IHJlcXVlc3RFdmVudC5kZXRhaWwucmVxdWVzdCB9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbcG9saWN5LXN0dWRpb10gRXJyb3Igb24gZGVidWdgLCBlcnIpO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXQgZmlsdGVyZWRGbG93cygpIHtcbiAgICBpZiAodGhpcy5fZmxvd0ZpbHRlci5sZW5ndGggPT09IDAgfHwgdGhpcy5fZmxvd0ZpbHRlci5pbmNsdWRlcygnYXBpJykpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlZmluZWRGbG93cztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgZmlsdGVyZWRQbGFucygpIHtcbiAgICBpZiAodGhpcy5fZmxvd0ZpbHRlci5sZW5ndGggPT09IDAgfHwgdGhpcy5fZmxvd0ZpbHRlci5pbmNsdWRlcygncGxhbicpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWZpbmVkUGxhbnM7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgX29uRmlsdGVyRmxvd3MoeyBkZXRhaWwgfSkge1xuICAgIGlmICh0aGlzLl9mbG93RmlsdGVyLmluY2x1ZGVzKGRldGFpbC5pZCkpIHtcbiAgICAgIHRoaXMuX2Zsb3dGaWx0ZXIgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZmxvd0ZpbHRlciA9IFtkZXRhaWwuaWRdO1xuICAgIH1cbiAgfVxuXG4gIF9nZXRGaWx0ZXJlZFBvbGljaWVzKCkge1xuICAgIGlmICh0aGlzLl9wb2xpY3lGaWx0ZXIubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9saWNpZXMuZmlsdGVyKChwb2xpY3kpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAocG9saWN5Lm9uUmVxdWVzdCAmJiB0aGlzLl9wb2xpY3lGaWx0ZXIuaW5jbHVkZXMoJ29uUmVxdWVzdCcpKSB8fCAocG9saWN5Lm9uUmVzcG9uc2UgJiYgdGhpcy5fcG9saWN5RmlsdGVyLmluY2x1ZGVzKCdvblJlc3BvbnNlJykpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucG9saWNpZXM7XG4gIH1cblxuICBfb25GaWx0ZXJQb2xpY2llcyh7IGRldGFpbCB9KSB7XG4gICAgaWYgKHRoaXMuX3BvbGljeUZpbHRlci5pbmNsdWRlcyhkZXRhaWwuaWQpKSB7XG4gICAgICB0aGlzLl9wb2xpY3lGaWx0ZXIgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcG9saWN5RmlsdGVyID0gW2RldGFpbC5pZF07XG4gICAgfVxuICB9XG5cbiAgX3JlbmRlckRlc2lnbihyZWFkb25seU1vZGUpIHtcbiAgICByZXR1cm4gaHRtbGAgPGRpdiBpZD1cImRlc2lnblwiIHNsb3Q9XCJjb250ZW50XCIgY2xhc3M9XCJkZXNpZ25cIj5cbiAgICAgIDxndi1yZXNpemFibGUtdmlld3Mgbm8tb3ZlcmZsb3c+XG4gICAgICAgIDxkaXYgc2xvdD1cInRvcFwiPiR7dGhpcy5fcmVuZGVyRmxvdygwLCB0cnVlLCByZWFkb25seU1vZGUpfTwvZGl2PlxuXG4gICAgICAgIDxkaXYgc2xvdD1cImJvdHRvbVwiPlxuICAgICAgICAgICR7dGhpcy5fcmVuZGVyRmxvdygxLCBmYWxzZSwgcmVhZG9ubHlNb2RlKX0gJHt0aGlzLl9yZW5kZXJQb2xpY3kocmVhZG9ubHlNb2RlKX0gJHt0aGlzLl9yZW5kZXJGbG93Rm9ybShyZWFkb25seU1vZGUpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZ3YtcmVzaXphYmxlLXZpZXdzPlxuICAgICAgJHtyZWFkb25seU1vZGUgIT09IHRydWVcbiAgICAgICAgPyBodG1sYDxndi1wb2xpY3ktc3R1ZGlvLW1lbnVcbiAgICAgICAgICAgIGNsYXNzPVwicmlnaHQtbWVudVwiXG4gICAgICAgICAgICA/ZGlzYWJsZWQ9XCIke3RoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb259XCJcbiAgICAgICAgICAgIC5wb2xpY2llcz1cIiR7dGhpcy5fZ2V0RmlsdGVyZWRQb2xpY2llcygpfVwiXG4gICAgICAgICAgICAuc2VsZWN0ZWRJZHM9XCIke1t0aGlzLl9jdXJyZW50UG9saWN5SWRdfVwiXG4gICAgICAgICAgICAucXVlcnk9XCIke3RoaXMuX3NlYXJjaFBvbGljeVF1ZXJ5fVwiXG4gICAgICAgICAgICA/aGFzLXBvbGljeS1maWx0ZXI9XCIke3RoaXMuX3BvbGljeUZpbHRlck9wdGlvbnMgIT0gbnVsbH1cIlxuICAgICAgICAgICAgP3JlYWRvbmx5PVwiJHtyZWFkb25seU1vZGV9XCJcbiAgICAgICAgICAgIEBndi1wb2xpY3ktc3R1ZGlvLW1lbnU6dGFyZ2V0LXBvbGljeT1cIiR7dGhpcy5fb25UYXJnZXRQb2xpY3l9XCJcbiAgICAgICAgICAgIEBndi1wb2xpY3ktc3R1ZGlvLW1lbnU6ZmV0Y2gtZG9jdW1lbnRhdGlvbj1cIiR7dGhpcy5fb25PcGVuRG9jdW1lbnRhdGlvbkZyb21NZW51fVwiXG4gICAgICAgICAgICBAZ3YtcG9saWN5LXN0dWRpby1tZW51OmRyYWdlbmQtcG9saWN5PVwiJHt0aGlzLl9vbkRyYWdFbmRQb2xpY3l9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IHNsb3Q9XCJoZWFkZXJcIiBjbGFzcz1cInNlYXJjaC1wb2xpY2llc1wiPlxuICAgICAgICAgICAgICAke3RoaXMuX3BvbGljeUZpbHRlck9wdGlvbnMgIT0gbnVsbFxuICAgICAgICAgICAgICAgID8gaHRtbGA8Z3Ytb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbn1cIlxuICAgICAgICAgICAgICAgICAgICAub3B0aW9ucz1cIiR7dGhpcy5fcG9saWN5RmlsdGVyT3B0aW9uc31cIlxuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICBvdXRsaW5lZFxuICAgICAgICAgICAgICAgICAgICAudmFsdWU9XCIke3RoaXMuX3BvbGljeUZpbHRlcn1cIlxuICAgICAgICAgICAgICAgICAgICBzbWFsbFxuICAgICAgICAgICAgICAgICAgICBAZ3Ytb3B0aW9uOnNlbGVjdD1cIiR7dGhpcy5fb25GaWx0ZXJQb2xpY2llc31cIlxuICAgICAgICAgICAgICAgICAgPjwvZ3Ytb3B0aW9uPmBcbiAgICAgICAgICAgICAgICA6ICcnfVxuICAgICAgICAgICAgICA8Z3YtaW5wdXRcbiAgICAgICAgICAgICAgICBpZD1cInNlYXJjaC1wb2xpY3lcIlxuICAgICAgICAgICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbn1cIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyIHBvbGljaWVzIChTaGlmdCArIEN0cmwgKyBTcGFjZSlcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJzZWFyY2hcIlxuICAgICAgICAgICAgICAgIHNtYWxsXG4gICAgICAgICAgICAgICAgQGd2LWlucHV0OmlucHV0PVwiJHt0aGlzLl9vblNlYXJjaFBvbGljeX1cIlxuICAgICAgICAgICAgICAgIEBndi1pbnB1dDpjbGVhcj1cIiR7dGhpcy5fb25DbGVhclBvbGljeX1cIlxuICAgICAgICAgICAgICA+PC9ndi1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZ3YtcG9saWN5LXN0dWRpby1tZW51PmBcbiAgICAgICAgOiAnJ31cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgX3JlbmRlckRlYnVnKCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5kZWJ1Z1Jlc3BvbnNlID8gdGhpcy5kZWJ1Z1Jlc3BvbnNlLnJlc3BvbnNlIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlzTG9hZGluZyA9IHRoaXMuZGVidWdSZXNwb25zZSA/IHRoaXMuZGVidWdSZXNwb25zZS5pc0xvYWRpbmcgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuZGVidWdSZXNwb25zZSAmJiB0aGlzLmRlYnVnUmVzcG9uc2UucmVxdWVzdCA/IHRoaXMuZGVidWdSZXNwb25zZS5yZXF1ZXN0LnBhdGggOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5kZWJ1Z1Jlc3BvbnNlICYmIHRoaXMuZGVidWdSZXNwb25zZS5yZXF1ZXN0ID8gdGhpcy5kZWJ1Z1Jlc3BvbnNlLnJlcXVlc3QubWV0aG9kIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBodG1sYDxndi1odHRwLWNsaWVudFxuICAgICAgaWQ9XCJkZWJ1Z1wiXG4gICAgICBzbG90PVwiY29udGVudFwiXG4gICAgICBjbGFzcz1cImRlYnVnXCJcbiAgICAgIEBndi1odHRwLWNsaWVudDpzZW5kPVwiJHt0aGlzLl9vbkRlYnVnfVwiXG4gICAgICAucmVzcG9uc2U9XCIke3Jlc3BvbnNlfVwiXG4gICAgICAucGF0aD1cIiR7cGF0aH1cIlxuICAgICAgLm1ldGhvZD1cIiR7bWV0aG9kfVwiXG4gICAgICA/bG9hZGluZz1cIiR7aXNMb2FkaW5nfVwiXG4gICAgPlxuICAgIDwvZ3YtaHR0cC1jbGllbnQ+YDtcbiAgfVxuXG4gIF9yZW5kZXJDb25maWd1cmF0aW9uRm9ybShyZWFkb25seU1vZGUpIHtcbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uU2NoZW1hKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBkZWVwQ2xvbmUodGhpcy5fZGVmaW5pdGlvbik7XG4gICAgICByZXR1cm4gaHRtbGAgPGRpdiBpZD1cInNldHRpbmdzXCIgc2xvdD1cImNvbnRlbnRcIiBjbGFzcz1cImFwaS1zZXR0aW5nc1wiIEBkcmFnb3Zlcj1cIiR7dGhpcy5fb25EZXNpZ259XCI+XG4gICAgICAgIDxndi1zY2hlbWEtZm9ybVxuICAgICAgICAgIC5zY2hlbWE9XCIke3RoaXMuY29uZmlndXJhdGlvblNjaGVtYX1cIlxuICAgICAgICAgIGlkPVwiYXBpLXNldHRpbmdzLWZvcm1cIlxuICAgICAgICAgIC52YWx1ZXM9XCIke3ZhbHVlc31cIlxuICAgICAgICAgIGhhcy1oZWFkZXJcbiAgICAgICAgICBoYXMtZm9vdGVyXG4gICAgICAgICAgc2Nyb2xsYWJsZVxuICAgICAgICAgID9yZWFkb25seT1cIiR7cmVhZG9ubHlNb2RlfVwiXG4gICAgICAgICAgQGd2LXNjaGVtYS1mb3JtOmNhbmNlbD1cIiR7dGhpcy5fb25DYW5jZWxGbG93TW9kZX1cIlxuICAgICAgICAgIEBndi1zY2hlbWEtZm9ybTpzdWJtaXQ9XCIke3RoaXMuX29uU3VibWl0Rmxvd01vZGV9XCJcbiAgICAgICAgPlxuICAgICAgICAgICR7IXRoaXMuY29uZmlndXJhdGlvbkluZm9ybWF0aW9uXG4gICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICA6IGh0bWxgXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwaS1zZXR0aW5ncy1pbmZvcm1hdGlvblwiIHNsb3Q9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgPGd2LWljb24gY2xhc3M9XCJhcGktc2V0dGluZ3MtaW5mb3JtYXRpb25fX2ljb25cIiB0aXRsZT1cIkluZm9cIiBzaGFwZT1cImNvZGU6aW5mb1wiPjwvZ3YtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxibG9ja3F1b3RlIGNsYXNzPVwiYXBpLXNldHRpbmdzLWluZm9ybWF0aW9uX19ibG9ja3F1b3RlXCI+JHt0aGlzLmNvbmZpZ3VyYXRpb25JbmZvcm1hdGlvbn08L2Jsb2NrcXVvdGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIGB9XG4gICAgICAgIDwvZ3Ytc2NoZW1hLWZvcm0+XG4gICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbGBgO1xuICB9XG5cbiAgX3JlbmRlckZsb3dGb3JtKHJlYWRvbmx5TW9kZSkge1xuICAgIGlmICh0aGlzLmZsb3dTY2hlbWEgJiYgdGhpcy5fZmxvd1N0ZXBTY2hlbWEgPT0gbnVsbCAmJiB0aGlzLmRvY3VtZW50YXRpb24gPT0gbnVsbCAmJiB0aGlzLnNlbGVjdGVkRmxvd3NJZC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGZsb3cgPSB0aGlzLmdldFNlbGVjdGVkRmxvdygpO1xuICAgICAgaWYgKGZsb3cpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gZGVlcENsb25lKGZsb3cpO1xuICAgICAgICByZXR1cm4gaHRtbGA8ZGl2IHNsb3Q9XCJjb250ZW50XCIgY2xhc3M9XCJmbG93LXNldHRpbmdzXCI+XG4gICAgICAgICAgPGd2LXNjaGVtYS1mb3JtXG4gICAgICAgICAgICAuc2NoZW1hPVwiJHt0aGlzLmZsb3dTY2hlbWF9XCJcbiAgICAgICAgICAgIGlkPVwic2V0dGluZ3MtZm9ybVwiXG4gICAgICAgICAgICAudmFsdWVzPVwiJHt2YWx1ZXN9XCJcbiAgICAgICAgICAgIGhhcy1oZWFkZXJcbiAgICAgICAgICAgIHNjcm9sbGFibGVcbiAgICAgICAgICAgID9yZWFkb25seT1cIiR7cmVhZG9ubHlNb2RlfVwiXG4gICAgICAgICAgICBAZ3Ytc2NoZW1hLWZvcm06Y2FuY2VsPVwiJHt0aGlzLl9vbkNhbmNlbEZsb3d9XCJcbiAgICAgICAgICAgIEBndi1zY2hlbWEtZm9ybTpzdWJtaXQ9XCIke3RoaXMuX29uU3VibWl0Rmxvd31cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgc2xvdD1cInRpdGxlXCIgY2xhc3M9XCJmbG93LXN0ZXBfX2Zvcm0tdGl0bGVcIj5GbG93IGNvbmZpZ3VyYXRpb248L2Rpdj5cbiAgICAgICAgICA8L2d2LXNjaGVtYS1mb3JtPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9vblJlc291cmNlc0NoYW5nZSh7IGRldGFpbCB9KSB7XG4gICAgdGhpcy5kZWZpbml0aW9uLnJlc291cmNlcyA9IGRldGFpbC5yZXNvdXJjZXM7XG4gICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgfVxuXG4gIF9vblByb3BlcnRpZXNDaGFuZ2UoeyBkZXRhaWwgfSkge1xuICAgIHRoaXMuZGVmaW5pdGlvbi5wcm9wZXJ0aWVzID0gZGV0YWlsLnByb3BlcnRpZXM7XG4gICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgfVxuXG4gIF9vblNhdmVQcm92aWRlcih7IGRldGFpbCB9KSB7XG4gICAgdGhpcy5zZXJ2aWNlc1snZHluYW1pYy1wcm9wZXJ0eSddID0gZGV0YWlsLnByb3ZpZGVyO1xuICAgIHRoaXMuaXNEaXJ0eSA9IHRydWU7XG4gIH1cblxuICBfb25Td2l0Y2hFbmNyeXB0ZWRQcm9wZXJ0eSh7IGRldGFpbCB9KSB7XG4gICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCByZWFkb25seU1vZGUgPSB0aGlzLl9nZXRSZWFkb25seU1vZGVGb3JEZXNpZ24oKTtcblxuICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgIDxndi1wb2xpY3ktc3R1ZGlvLW1lbnVcbiAgICAgICAgY2xhc3M9XCJsZWZ0LW1lbnVcIlxuICAgICAgICAuYXBpLW5hbWU9XCIke3RoaXMuX2RlZmluaXRpb24ubmFtZX1cIlxuICAgICAgICAuZmxvd3M9XCIke3RoaXMuZmlsdGVyZWRGbG93c31cIlxuICAgICAgICAucGxhbnM9XCIke3RoaXMuZmlsdGVyZWRQbGFuc31cIlxuICAgICAgICAuc2VsZWN0ZWRJZHM9XCIke3RoaXMuc2VsZWN0ZWRGbG93c0lkfVwiXG4gICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbn1cIlxuICAgICAgICA/c29ydGFibGU9XCIke3RoaXMuc29ydGFibGUgJiYgdGhpcy5yZWFkb25seSAhPT0gdHJ1ZX1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgICAgP3JlYWRvbmx5UGxhbnM9XCIke3RoaXMucmVhZG9ubHlQbGFuc31cIlxuICAgICAgICBmbG93cy10aXRsZT1cIiR7dGhpcy5mbG93c1RpdGxlfVwiXG4gICAgICAgIC5xdWVyeT1cIiR7dGhpcy5fc2VhcmNoRmxvd1F1ZXJ5fVwiXG4gICAgICAgID9jYW4tYWRkPVwiJHt0aGlzLmNhbkFkZCAmJiAhdGhpcy5yZWFkb25seX1cIlxuICAgICAgICBAZ3YtcG9saWN5LXN0dWRpby1tZW51OnJlb3JkZXItZmxvd3M9XCIke3RoaXMuX29uUmVvcmRlckZsb3dzfVwiXG4gICAgICAgIEBndi1wb2xpY3ktc3R1ZGlvLW1lbnU6Y2hhbmdlLWZsb3ctc3RhdGU9XCIke3RoaXMuX29uQ2hhbmdlRmxvd1N0YXRlfVwiXG4gICAgICAgIEBndi1wb2xpY3ktc3R1ZGlvLW1lbnU6YWRkLWZsb3c9XCIke3RoaXMuX29uQWRkRmxvd31cIlxuICAgICAgICBAZ3YtcG9saWN5LXN0dWRpby1tZW51OmFkZC1mbG93LXBsYW49XCIke3RoaXMuX29uQWRkRmxvd1BsYW59XCJcbiAgICAgICAgQGd2LXBvbGljeS1zdHVkaW8tbWVudTpkZWxldGUtZmxvdz1cIiR7dGhpcy5fb25EZWxldGVGbG93fVwiXG4gICAgICAgIEBndi1wb2xpY3ktc3R1ZGlvLW1lbnU6ZHVwbGljYXRlLWZsb3c9XCIke3RoaXMuX29uRHVwbGljYXRlRmxvd31cIlxuICAgICAgICBAZ3YtcG9saWN5LXN0dWRpby1tZW51OnNlbGVjdC1mbG93cz1cIiR7dGhpcy5fb25TZWxlY3RGbG93c31cIlxuICAgICAgPlxuICAgICAgICA8ZGl2IHNsb3Q9XCJoZWFkZXJcIiBjbGFzcz1cImhlYWRlci1hY3Rpb25zXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+JHt0aGlzLl9kZWZpbml0aW9uLm5hbWV9PC9kaXY+XG4gICAgICAgICAgJHt0aGlzLl9mbG93RmlsdGVyT3B0aW9ucyAhPSBudWxsXG4gICAgICAgICAgICA/IGh0bWxgPGd2LW9wdGlvblxuICAgICAgICAgICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbn1cIlxuICAgICAgICAgICAgICAgIC5vcHRpb25zPVwiJHt0aGlzLl9mbG93RmlsdGVyT3B0aW9uc31cIlxuICAgICAgICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgICAgICAgb3V0bGluZWRcbiAgICAgICAgICAgICAgICAudmFsdWU9XCIke3RoaXMuX2Zsb3dGaWx0ZXJ9XCJcbiAgICAgICAgICAgICAgICBzbWFsbFxuICAgICAgICAgICAgICAgIEBndi1vcHRpb246c2VsZWN0PVwiJHt0aGlzLl9vbkZpbHRlckZsb3dzfVwiXG4gICAgICAgICAgICAgID48L2d2LW9wdGlvbj5gXG4gICAgICAgICAgICA6ICcnfVxuICAgICAgICAgIDxndi1pbnB1dFxuICAgICAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9ufVwiXG4gICAgICAgICAgICBpZD1cInNlYXJjaC1mbG93XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyIGZsb3dzIChDdHJsICsgU3BhY2UpXCJcbiAgICAgICAgICAgIHR5cGU9XCJzZWFyY2hcIlxuICAgICAgICAgICAgc21hbGxcbiAgICAgICAgICAgIEBndi1pbnB1dDppbnB1dD1cIiR7dGhpcy5fb25TZWFyY2hGbG93c31cIlxuICAgICAgICAgICAgQGd2LWlucHV0OmNsZWFyPVwiJHt0aGlzLl9vbkNsZWFyRmxvd3N9XCJcbiAgICAgICAgICA+PC9ndi1pbnB1dD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgJHt0aGlzLnJlYWRvbmx5ICE9PSB0cnVlXG4gICAgICAgICAgPyBodG1sYCA8ZGl2IHNsb3Q9XCJmb290ZXJcIiBjbGFzcz1cImZvb3Rlci1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgIDxndi1idXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1sYXJnZVwiXG4gICAgICAgICAgICAgICAgLmRpc2FibGVkPVwiJHshdGhpcy5pc0RpcnR5IHx8IHRoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb259XCJcbiAgICAgICAgICAgICAgICBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vblNhdmVBbGx9XCJcbiAgICAgICAgICAgICAgICA+U2F2ZTwvZ3YtYnV0dG9uXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGd2LWJ1dHRvbiBsaW5rIC5kaXNhYmxlZD1cIiR7IXRoaXMuaXNEaXJ0eSB8fCB0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9ufVwiIEBndi1idXR0b246Y2xpY2s9XCIke3RoaXMuX29uUmVzZXRBbGx9XCJcbiAgICAgICAgICAgICAgICA+UmVzZXQ8L2d2LWJ1dHRvblxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2Rpdj5gXG4gICAgICAgICAgOiAnJ31cbiAgICAgIDwvZ3YtcG9saWN5LXN0dWRpby1tZW51PlxuXG4gICAgICA8Z3YtdGFic1xuICAgICAgICAudmFsdWU9XCIke3RoaXMudGFiSWR9XCJcbiAgICAgICAgLm9wdGlvbnM9XCIke3RoaXMuX3RhYnN9XCJcbiAgICAgICAgLmRpc2FibGVkPVwiJHt0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9ufVwiXG4gICAgICAgIEBndi10YWJzOmNoYW5nZT1cIiR7dGhpcy5fb25DaGFuZ2VUYWJ9XCJcbiAgICAgICAgLnZhbGlkYXRvcj1cIiR7dGhpcy5fY2hhbmdlVGFiVmFsaWRhdG9yLmJpbmQodGhpcyl9XCJcbiAgICAgID5cbiAgICAgICAgJHt0aGlzLl9yZW5kZXJEZXNpZ24ocmVhZG9ubHlNb2RlKX0gJHt0aGlzLl9yZW5kZXJDb25maWd1cmF0aW9uRm9ybShyZWFkb25seU1vZGUpfSAke3RoaXMuX3JlbmRlckRlYnVnKCl9XG4gICAgICAgIDxndi1wcm9wZXJ0aWVzXG4gICAgICAgICAgaWQ9XCJwcm9wZXJ0aWVzXCJcbiAgICAgICAgICBzbG90PVwiY29udGVudFwiXG4gICAgICAgICAgY2xhc3M9XCJwcm9wZXJ0aWVzXCJcbiAgICAgICAgICAucHJvdmlkZXI9XCIke3RoaXMuc2VydmljZXNbJ2R5bmFtaWMtcHJvcGVydHknXX1cIlxuICAgICAgICAgIEBndi1wcm9wZXJ0aWVzOmNoYW5nZT1cIiR7dGhpcy5fb25Qcm9wZXJ0aWVzQ2hhbmdlfVwiXG4gICAgICAgICAgQGd2LXByb3BlcnRpZXM6c2F2ZS1wcm92aWRlcj1cIiR7dGhpcy5fb25TYXZlUHJvdmlkZXJ9XCJcbiAgICAgICAgICBAZ3YtcHJvcGVydGllczpzd2l0Y2gtZW5jcnlwdGVkPVwiJHt0aGlzLl9vblN3aXRjaEVuY3J5cHRlZFByb3BlcnR5fVwiXG4gICAgICAgICAgP3JlYWRvbmx5PVwiJHtyZWFkb25seU1vZGV9XCJcbiAgICAgICAgICBlbmNyeXB0YWJsZT1cInRydWVcIlxuICAgICAgICAgIC5wcm9wZXJ0aWVzPVwiJHt0aGlzLmRlZmluZWRQcm9wZXJ0aWVzfVwiXG4gICAgICAgICAgLnByb3ZpZGVycz1cIiR7dGhpcy5wcm9wZXJ0eVByb3ZpZGVyc31cIlxuICAgICAgICAgIC5keW5hbWljUHJvcGVydHlTY2hlbWE9XCIke3RoaXMuZHluYW1pY1Byb3BlcnR5U2NoZW1hfVwiXG4gICAgICAgID48L2d2LXByb3BlcnRpZXM+XG4gICAgICAgIDxndi1yZXNvdXJjZXNcbiAgICAgICAgICBpZD1cInJlc291cmNlc1wiXG4gICAgICAgICAgc2xvdD1cImNvbnRlbnRcIlxuICAgICAgICAgIGNsYXNzPVwicmVzb3VyY2VzXCJcbiAgICAgICAgICBAZ3YtcmVzb3VyY2VzOmNoYW5nZT1cIiR7dGhpcy5fb25SZXNvdXJjZXNDaGFuZ2V9XCJcbiAgICAgICAgICA/cmVhZG9ubHk9XCIke3JlYWRvbmx5TW9kZX1cIlxuICAgICAgICAgIC5yZXNvdXJjZXM9XCIke3RoaXMuZGVmaW5lZFJlc291cmNlc31cIlxuICAgICAgICAgIC50eXBlcz1cIiR7dGhpcy5yZXNvdXJjZVR5cGVzfVwiXG4gICAgICAgID48L2d2LXJlc291cmNlcz5cbiAgICAgIDwvZ3YtdGFicz5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBpZiB0aGUgZGVzaWduIHZpZXcgc2hvdWxkIGJlIGluIHJlYWRvbmx5IG1vZGUgb3Igbm90XG4gICAqIEl0IGlzIGluIHJlYWRvbmx5IG1vZGUgaWY6XG4gICAqICB0aGUgcmVhZG9ubHkgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlXG4gICAqICBPUlxuICAgKiAgdGhlIG1haW4gc2VsZWN0ZWQgZmxvdyBiZWxvbmdzIHRvIGEgcGxhbiBhbmQgdGhlIHJlYWRvbmx5LXBsYW5zIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZVxuICAgKiAgT1JcbiAgICogIHRoZSBzZWNvbmQgZmxvdyBmb3IgY29tcGFyaXNvbiBiZWxvbmdzIHRvIGEgcGxhbiBhbmQgdGhlIHJlYWRvbmx5LXBsYW5zIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbnwqfHt0eXBlOiBCb29sZWFuQ29uc3RydWN0b3J9fHthdHRyaWJ1dGU6IHN0cmluZywgdHlwZTogQm9vbGVhbkNvbnN0cnVjdG9yfXx7dHlwZTogKn18e2F0dHJpYnV0ZTogc3RyaW5nLCB0eXBlOiAqfX1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9nZXRSZWFkb25seU1vZGVGb3JEZXNpZ24oKSB7XG4gICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZsb3cgPSB0aGlzLmdldFNlbGVjdGVkRmxvdygwKTtcbiAgICBpZiAoIWZsb3cpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHBsYW46IGZsb3dQbGFuIH0gPSB0aGlzLl9maW5kRmxvd0NvbGxlY3Rpb24oZmxvdy5faWQpO1xuICAgIGNvbnN0IHJlYWRvbmx5TW9kZSA9IGZsb3dQbGFuICYmIHRoaXMucmVhZG9ubHlQbGFucztcbiAgICBpZiAocmVhZG9ubHlNb2RlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYXJlZEZsb3cgPSB0aGlzLmdldFNlbGVjdGVkRmxvdygxKTtcbiAgICBpZiAoIWNvbXBhcmVkRmxvdykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcGxhbjogY29tcGFyZWRGbG93UGxhbiB9ID0gdGhpcy5fZmluZEZsb3dDb2xsZWN0aW9uKGNvbXBhcmVkRmxvdy5faWQpO1xuICAgIHJldHVybiBjb21wYXJlZEZsb3dQbGFuICYmIHRoaXMucmVhZG9ubHlQbGFucztcbiAgfVxufVxuXG53aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdndi1wb2xpY3ktc3R1ZGlvJywgR3ZQb2xpY3lTdHVkaW8pO1xuIl19