ravcredit-lib 0.0.3 → 0.0.5

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 (49) hide show
  1. package/fesm2022/ravcredit-lib.mjs +551 -24
  2. package/fesm2022/ravcredit-lib.mjs.map +1 -1
  3. package/index.d.ts +1516 -4
  4. package/package.json +3 -4
  5. package/esm2022/lib/ravcredit-lib.component.mjs +0 -19
  6. package/esm2022/lib/ravcredit-lib.service.mjs +0 -14
  7. package/esm2022/lib/v1/objects/oAddress.mjs +0 -2
  8. package/esm2022/lib/v1/objects/oBusiness.mjs +0 -2
  9. package/esm2022/lib/v1/objects/oClient.mjs +0 -2
  10. package/esm2022/lib/v1/objects/oConekta.mjs +0 -85
  11. package/esm2022/lib/v1/objects/oContract.mjs +0 -2
  12. package/esm2022/lib/v1/objects/oContractAll.mjs +0 -2
  13. package/esm2022/lib/v1/objects/oCustomer.mjs +0 -18
  14. package/esm2022/lib/v1/objects/oDevice.mjs +0 -2
  15. package/esm2022/lib/v1/objects/oFinancial.mjs +0 -2
  16. package/esm2022/lib/v1/objects/oGlobal.mjs +0 -86
  17. package/esm2022/lib/v1/objects/oLogIn.mjs +0 -17
  18. package/esm2022/lib/v1/objects/oNewPayment.mjs +0 -2
  19. package/esm2022/lib/v1/objects/oNotification.mjs +0 -17
  20. package/esm2022/lib/v1/objects/oPassport.mjs +0 -7
  21. package/esm2022/lib/v1/objects/oUser.mjs +0 -2
  22. package/esm2022/lib/v1/util/UtilBusiness.mjs +0 -181
  23. package/esm2022/lib/v1/util/UtilClient.mjs +0 -221
  24. package/esm2022/lib/v1/util/UtilContract.mjs +0 -339
  25. package/esm2022/lib/v1/util/UtilDynamiCore.mjs +0 -292
  26. package/esm2022/public-api.mjs +0 -21
  27. package/esm2022/ravcredit-lib.mjs +0 -5
  28. package/lib/ravcredit-lib.component.d.ts +0 -5
  29. package/lib/ravcredit-lib.service.d.ts +0 -6
  30. package/lib/v1/objects/oAddress.d.ts +0 -9
  31. package/lib/v1/objects/oBusiness.d.ts +0 -101
  32. package/lib/v1/objects/oClient.d.ts +0 -43
  33. package/lib/v1/objects/oConekta.d.ts +0 -305
  34. package/lib/v1/objects/oContract.d.ts +0 -23
  35. package/lib/v1/objects/oContractAll.d.ts +0 -21
  36. package/lib/v1/objects/oCustomer.d.ts +0 -17
  37. package/lib/v1/objects/oDevice.d.ts +0 -5
  38. package/lib/v1/objects/oFinancial.d.ts +0 -30
  39. package/lib/v1/objects/oGlobal.d.ts +0 -149
  40. package/lib/v1/objects/oLogIn.d.ts +0 -30
  41. package/lib/v1/objects/oNewPayment.d.ts +0 -11
  42. package/lib/v1/objects/oNotification.d.ts +0 -25
  43. package/lib/v1/objects/oPassport.d.ts +0 -55
  44. package/lib/v1/objects/oUser.d.ts +0 -25
  45. package/lib/v1/util/UtilBusiness.d.ts +0 -54
  46. package/lib/v1/util/UtilClient.d.ts +0 -34
  47. package/lib/v1/util/UtilContract.d.ts +0 -71
  48. package/lib/v1/util/UtilDynamiCore.d.ts +0 -453
  49. package/public-api.d.ts +0 -17
@@ -1,339 +0,0 @@
1
- import { UntypedFormArray, UntypedFormControl, Validators } from "@angular/forms";
2
- import { cClient, cUserReference } from "./UtilClient";
3
- // import {TaskState} from "firebase/storage";
4
- import { cBusinessDeadlines } from "./UtilBusiness";
5
- export var eProvider;
6
- (function (eProvider) {
7
- eProvider["none"] = "";
8
- eProvider["Conekta"] = "Conekta";
9
- eProvider["Passport"] = "Passport";
10
- eProvider["DynamiCore"] = "DynamiCore";
11
- })(eProvider || (eProvider = {}));
12
- // export type ProgressTaskStatus = TaskState | "uploading" | "idle" | "generating" | "unauthorized"
13
- export const cDevice = {
14
- device: "",
15
- IMEI: ""
16
- };
17
- export const cFinancial = {
18
- total: 0,
19
- initial: 0,
20
- deadlines: cBusinessDeadlines,
21
- initDate: 0,
22
- weeklyPayment: 0,
23
- pendingOf: [],
24
- progress: [],
25
- interest: 0,
26
- provider: eProvider.DynamiCore,
27
- financed: 0,
28
- nextPayment: 0,
29
- amount_commission_opening: 0,
30
- principal_disbursed: 0,
31
- expected_disbursed: 0, // ---------
32
- credit_type: 'Arrendamiento',
33
- interest_rate: 0,
34
- commission_opening: 0,
35
- interest_arrears: 0,
36
- };
37
- export const cAddress = {
38
- street: "",
39
- city: "",
40
- neighbor: "",
41
- zip: "",
42
- ext: "",
43
- int: "",
44
- state: ""
45
- };
46
- export const cContract = {
47
- id: "",
48
- client: "",
49
- address: cAddress,
50
- device: cDevice,
51
- financial: cFinancial,
52
- by: "",
53
- active: true
54
- };
55
- export class FactoryContract {
56
- static FormClient(client) {
57
- let data = cClient;
58
- if (client)
59
- data = client;
60
- return {
61
- name: new UntypedFormControl(data.name, [Validators.required, Validators.minLength(10)]),
62
- email: new UntypedFormControl(data.username, [Validators.required, Validators.email]),
63
- phone: new UntypedFormControl(data.phone, [Validators.required, Validators.min(10)]),
64
- curp: new UntypedFormControl(data.curp, [Validators.required, Validators.minLength(16)]),
65
- userReferences: new UntypedFormArray([])
66
- };
67
- }
68
- static CreateUserReferenceFormObj(user) {
69
- let data = cUserReference;
70
- if (user.name != "")
71
- data = user;
72
- return {
73
- name: new UntypedFormControl(data.name, [Validators.required, Validators.minLength(10)]),
74
- phone: new UntypedFormControl(data.phone, [Validators.required]),
75
- relationship: new UntypedFormControl(data.relationship, [Validators.required]),
76
- };
77
- }
78
- static FormAddress(address) {
79
- let data = cAddress;
80
- if (address)
81
- data = address;
82
- return {
83
- street: new UntypedFormControl(data.street, Validators.required),
84
- neighbor: new UntypedFormControl(data.neighbor, Validators.required),
85
- cp: new UntypedFormControl(data.zip, Validators.required),
86
- ext: new UntypedFormControl(data.ext, Validators.required),
87
- int: new UntypedFormControl(data.int),
88
- city: new UntypedFormControl(data.city, Validators.required),
89
- state: new UntypedFormControl(data.state, Validators.required),
90
- };
91
- }
92
- static FormDevice(device) {
93
- let data = cDevice;
94
- if (device)
95
- data = device;
96
- return {
97
- model: new UntypedFormControl(data.device, Validators.required),
98
- IMEI: new UntypedFormControl(data.IMEI, Validators.required),
99
- ID: new UntypedFormControl(data.id),
100
- };
101
- }
102
- static FormFinancial(financial) {
103
- let data = cFinancial;
104
- if (financial)
105
- data = financial;
106
- data.credit_type = "Arrendamiento";
107
- // data.deadlines.weeks = cBusinessDeadlines
108
- return {
109
- total: new UntypedFormControl(data.total, [Validators.required, Validators.min(1)]),
110
- initial: new UntypedFormControl(data.initial, [Validators.required]),
111
- financed: new UntypedFormControl(data.financed, Validators.min(1)),
112
- weeklyPayment: new UntypedFormControl(data.weeklyPayment, [Validators.required, Validators.min(1)]),
113
- deadlines: new UntypedFormControl(data.deadlines, [Validators.required]),
114
- initDate: new UntypedFormControl(data.initDate),
115
- provider: new UntypedFormControl(data.provider),
116
- credit_type: new UntypedFormControl(data.credit_type ? data.credit_type : 0),
117
- interest_rate: new UntypedFormControl(data.interest_rate ? data.interest_rate : 0), // interes credit dynamic
118
- commission_opening: new UntypedFormControl(data.commission_opening ? data.commission_opening : 0),
119
- interest_arrears: new UntypedFormControl(data.interest_arrears ? data.interest_arrears : 0), // intereses moratorios dynamic
120
- amount_commission_opening: new UntypedFormControl(data.amount_commission_opening), // comision por apertura dynamic
121
- principal_disbursed: new UntypedFormControl(data.principal_disbursed),
122
- expected_disbursed: new UntypedFormControl(data.expected_disbursed)
123
- };
124
- }
125
- static CreateContractFromFormObj(data, finalPay) {
126
- const date = new Date();
127
- const device = {
128
- device: data["device"][0].model,
129
- id: data["device"][0].ID,
130
- IMEI: data["device"][0].IMEI
131
- };
132
- const address = {
133
- street: data["address"][0].street,
134
- city: data["address"][0].city,
135
- neighbor: data["address"][0].neighbor,
136
- zip: data["address"][0].cp,
137
- ext: data["address"][0].ext,
138
- int: data["address"][0].int,
139
- state: data["address"][0].state
140
- };
141
- const financial = {
142
- total: Number(data["financial"][0].total),
143
- initial: data["financial"][0].initial,
144
- deadlines: data["financial"][0].deadlines,
145
- progress: [],
146
- pendingOf: [],
147
- weeklyPayment: data["financial"][0].weeklyPayment,
148
- interest: data["financial"][0].interest_rate,
149
- finalDate: date.getTime() + (data["financial"][0].deadlines.weeks * (604800 * 1000)),
150
- initDate: date.getDate(),
151
- dayCut: date.getDate(),
152
- provider: data["financial"][0].provider,
153
- finalPayment: finalPay,
154
- financed: data["financial"][0].financed,
155
- nextPayment: data["financial"][0].nextPayment
156
- };
157
- if (data["financial"][0].provider == eProvider.DynamiCore) {
158
- financial.initial = data["financial"][0].amount_commission_opening ? Number(data["financial"][0].amount_commission_opening) : 0;
159
- financial.expected_disbursed = data["financial"][0].expected_disbursed ? Number(data["financial"][0].expected_disbursed) : 0;
160
- financial.principal_disbursed = data["financial"][0].principal_disbursed ? Number(data["financial"][0].principal_disbursed) : 0;
161
- financial.interest_arrears = data["financial"][0].interest_rate ? Number(data["financial"][0].interest_rate) : 0;
162
- financial.commission_opening = data["financial"][0].commission_opening ? Number(data["financial"][0].commission_opening) : 0;
163
- financial.credit_type = data["financial"][0].credit_type ? data["financial"][0].credit_type : "";
164
- financial.clabe = data["financial"][0].clabe ? data["financial"][0].clabe : "";
165
- }
166
- if (data["financial"][0].amount_commission_opening != undefined) {
167
- if (Number(data["financial"][0].amount_commission_opening) > 0)
168
- financial.initial = Number(data["financial"][0].amount_commission_opening);
169
- else
170
- financial.initial = Number(data["financial"][0].initial);
171
- }
172
- if (Number(data["financial"][0].amount_commission_opening) > 0)
173
- financial.amount_commission_opening = Number(data["financial"][0].amount_commission_opening);
174
- else
175
- financial.amount_commission_opening = financial.initial;
176
- if (financial.nextPayment == undefined)
177
- financial.nextPayment = 0;
178
- const contract = {
179
- id: "",
180
- client: "",
181
- address: address,
182
- device: device,
183
- financial: financial,
184
- by: "",
185
- active: true,
186
- lastPayment: date.getTime(),
187
- createdAt: date.getTime()
188
- };
189
- return contract;
190
- }
191
- static CreateContractToConektaObj(data, monthlyPay, finalPay) {
192
- const o = {};
193
- const device = {
194
- device: data.device.device,
195
- id: data.device.id,
196
- IMEI: data.device.IMEI
197
- };
198
- const address = {
199
- street: data.address.street,
200
- city: data.address.city,
201
- neighbor: data.address.neighbor,
202
- zip: data.address.zip,
203
- ext: data.address.ext,
204
- int: data.address.int,
205
- state: data.address.state
206
- };
207
- const financial = {
208
- total: data.financial.total,
209
- initial: data.financial.initial,
210
- deadlines: data.financial.deadlines,
211
- progress: data.financial.progress,
212
- pendingOf: data.financial.pendingOf,
213
- weeklyPayment: data.financial.weeklyPayment,
214
- interest: data.financial.interest,
215
- finalDate: data.financial.finalDate,
216
- initDate: data.financial.initDate,
217
- dayCut: data.financial.dayCut,
218
- provider: data.financial.provider,
219
- finalPayment: data.financial.finalPayment,
220
- financed: data.financial.financed,
221
- nextPayment: data.financial.nextPayment
222
- };
223
- const contract = {
224
- id: "",
225
- client: "",
226
- address: address,
227
- device: device,
228
- financial: financial,
229
- by: "",
230
- active: true
231
- };
232
- return contract;
233
- }
234
- static CreateAuthForm(username, curp) {
235
- const password = this.createPassword(curp);
236
- return {
237
- username: new UntypedFormControl(username, Validators.required),
238
- password: new UntypedFormControl(password, Validators.required),
239
- };
240
- }
241
- static createPassword(curp) {
242
- const _curp = curp.split("");
243
- let password = "";
244
- const limit = 7;
245
- if (_curp.length < 16)
246
- return "";
247
- password += _curp[0].toLowerCase();
248
- for (let i = 1; i <= limit; i++)
249
- password += _curp[i].toUpperCase();
250
- password += `*`;
251
- return password;
252
- }
253
- static MapperTypeContCli_Contract(_contract) {
254
- const contract = {
255
- id: _contract.contract,
256
- client: _contract.client,
257
- address: _contract.address,
258
- device: _contract.device,
259
- financial: _contract.financial,
260
- by: _contract.by,
261
- active: _contract.active,
262
- lastPayment: _contract.lastPayment,
263
- createdAt: _contract.createdAt,
264
- dynamicAccount: _contract.dynamicAccount,
265
- };
266
- return contract;
267
- }
268
- static MapperSyncContractDynamic(base, account) {
269
- let nContract = base;
270
- let _financial = base.financial;
271
- let _device = base.device;
272
- const financial = {
273
- total: _financial.total,
274
- initial: account.properties.amount_commission_opening ? account.properties.amount_commission_opening : _financial.initial,
275
- deadlines: _financial.deadlines,
276
- progress: _financial.progress ? _financial.progress : [],
277
- pendingOf: _financial.pendingOf ? _financial.pendingOf : [],
278
- weeklyPayment: _financial.weeklyPayment,
279
- interest: _financial.interest,
280
- finalDate: _financial.finalDate,
281
- initDate: _financial.initDate,
282
- dayCut: _financial.dayCut,
283
- provider: _financial.provider,
284
- finalPayment: _financial.finalPayment,
285
- financed: _financial.financed,
286
- nextPayment: _financial.nextPayment ? _financial.nextPayment : 0,
287
- amount_commission_opening: account.properties.amount_commission_opening,
288
- expected_disbursed: account.properties.expected_disbursed ?
289
- Number(account.properties.expected_disbursed) :
290
- Number(_financial.expected_disbursed),
291
- principal_disbursed: account.properties.principal_disbursed ?
292
- account.properties.principal_disbursed :
293
- _financial.principal_disbursed,
294
- commission_opening: account.config.commission_opening ?
295
- Number(account.config.commission_opening) :
296
- Number(_financial.commission_opening),
297
- credit_type: account.config.credit_type ? account.config.credit_type : _financial.credit_type,
298
- clabe: String(account.properties.clabe ? account.properties.clabe : _financial.clabe)
299
- };
300
- const interestArrears = account.config.interest_arrears;
301
- const prevInterestArrears = _financial.interest_arrears;
302
- if (interestArrears != undefined) {
303
- financial.interest_arrears = interestArrears;
304
- }
305
- else if (prevInterestArrears != undefined) {
306
- financial.interest_arrears = prevInterestArrears;
307
- }
308
- else {
309
- financial.interest_arrears = 0;
310
- }
311
- const interest = account.config.interest_rate;
312
- const prevInterest = _financial.interest;
313
- if (interest != undefined) {
314
- financial.interest = interest;
315
- }
316
- else if (prevInterest != undefined) {
317
- financial.interest = prevInterest;
318
- }
319
- else {
320
- financial.interest = 0;
321
- }
322
- if (account.properties.amount_commission_opening != undefined) {
323
- if (Number(account.properties.amount_commission_opening) > 0) {
324
- financial.initial = Number(account.properties.amount_commission_opening);
325
- financial.amount_commission_opening = Number(account.properties.amount_commission_opening);
326
- }
327
- else {
328
- financial.initial = Number(_financial.initial);
329
- financial.amount_commission_opening = financial.initial;
330
- }
331
- }
332
- const seller = account.properties.seller_name;
333
- nContract.by = seller != null ? seller : "";
334
- nContract.device.id = _device.id ? _device.id : "";
335
- nContract.financial = financial;
336
- return nContract;
337
- }
338
- }
339
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbENvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmF2Y3JlZGl0LWxpYi9zcmMvbGliL3YxL3V0aWwvVXRpbENvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBQUMsT0FBTyxFQUFFLGNBQWMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNyRCw4Q0FBOEM7QUFDOUMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFTbEQsTUFBTSxDQUFOLElBQVksU0FLWDtBQUxELFdBQVksU0FBUztJQUNuQixzQkFBUyxDQUFBO0lBQ1QsZ0NBQW1CLENBQUE7SUFDbkIsa0NBQXFCLENBQUE7SUFDckIsc0NBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQUxXLFNBQVMsS0FBVCxTQUFTLFFBS3BCO0FBRUQsb0dBQW9HO0FBRXBHLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBWTtJQUM5QixNQUFNLEVBQUUsRUFBRTtJQUNWLElBQUksRUFBRSxFQUFFO0NBQ1QsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBZTtJQUNwQyxLQUFLLEVBQUUsQ0FBQztJQUNSLE9BQU8sRUFBRSxDQUFDO0lBQ1YsU0FBUyxFQUFFLGtCQUFrQjtJQUM3QixRQUFRLEVBQUUsQ0FBQztJQUNYLGFBQWEsRUFBRSxDQUFDO0lBQ2hCLFNBQVMsRUFBRSxFQUFFO0lBQ2IsUUFBUSxFQUFFLEVBQUU7SUFDWixRQUFRLEVBQUUsQ0FBQztJQUNYLFFBQVEsRUFBRSxTQUFTLENBQUMsVUFBVTtJQUM5QixRQUFRLEVBQUUsQ0FBQztJQUNYLFdBQVcsRUFBRSxDQUFDO0lBQ2QseUJBQXlCLEVBQUUsQ0FBQztJQUM1QixtQkFBbUIsRUFBRSxDQUFDO0lBQ3RCLGtC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Q0FBQyxDQUFBO2dCQUN4RSxTQUFTLENBQUMseUJBQXlCLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsQ0FBQTtZQUM1RixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sU0FBUyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUM5QyxTQUFTLENBQUMseUJBQXlCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQTtZQUN6RCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUF1QixPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQTtRQUNqRSxTQUFTLENBQUMsRUFBRSxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBRTNDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUVsRCxTQUFTLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtRQUMvQixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1VudHlwZWRGb3JtQXJyYXksIFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9yc30gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge2NDbGllbnQsIGNVc2VyUmVmZXJlbmNlfSBmcm9tIFwiLi9VdGlsQ2xpZW50XCI7XG4vLyBpbXBvcnQge1Rhc2tTdGF0ZX0gZnJvbSBcImZpcmViYXNlL3N0b3JhZ2VcIjtcbmltcG9ydCB7Y0J1c2luZXNzRGVhZGxpbmVzfSBmcm9tIFwiLi9VdGlsQnVzaW5lc3NcIjtcbmltcG9ydCB7SURDQWNjb3VudH0gZnJvbSBcIi4vVXRpbER5bmFtaUNvcmVcIjtcbmltcG9ydCB7b0RldmljZX0gZnJvbSAnLi4vb2JqZWN0cy9vRGV2aWNlJztcbmltcG9ydCB7b0ZpbmFuY2lhbH0gZnJvbSAnLi4vb2JqZWN0cy9vRmluYW5jaWFsJztcbmltcG9ydCB7b0FkZHJlc3N9IGZyb20gJy4uL29iamVjdHMvb0FkZHJlc3MnO1xuaW1wb3J0IHtvQ29udHJhY3R9IGZyb20gJy4uL29iamVjdHMvb0NvbnRyYWN0JztcbmltcG9ydCB7b0NsaWVudCwgb1VzZXJSZWZlcmVuY2V9IGZyb20gJy4uL29iamVjdHMvb0NsaWVudCc7XG5pbXBvcnQge3R5Q2xpZW50Q29udHJhY3R9IGZyb20gJy4uL29iamVjdHMvb0dsb2JhbCc7XG5cbmV4cG9ydCBlbnVtIGVQcm92aWRlciB7XG4gIG5vbmUgPSBcIlwiLFxuICBDb25la3RhID0gXCJDb25la3RhXCIsXG4gIFBhc3Nwb3J0ID0gXCJQYXNzcG9ydFwiLFxuICBEeW5hbWlDb3JlID0gXCJEeW5hbWlDb3JlXCIsXG59XG5cbi8vIGV4cG9ydCB0eXBlIFByb2dyZXNzVGFza1N0YXR1cyA9IFRhc2tTdGF0ZSB8IFwidXBsb2FkaW5nXCIgfCBcImlkbGVcIiB8IFwiZ2VuZXJhdGluZ1wiIHwgXCJ1bmF1dGhvcml6ZWRcIlxuXG5leHBvcnQgY29uc3QgY0RldmljZTogb0RldmljZSA9IHtcbiAgZGV2aWNlOiBcIlwiLFxuICBJTUVJOiBcIlwiXG59XG5cbmV4cG9ydCBjb25zdCBjRmluYW5jaWFsOiBvRmluYW5jaWFsID0ge1xuICB0b3RhbDogMCxcbiAgaW5pdGlhbDogMCxcbiAgZGVhZGxpbmVzOiBjQnVzaW5lc3NEZWFkbGluZXMsXG4gIGluaXREYXRlOiAwLFxuICB3ZWVrbHlQYXltZW50OiAwLFxuICBwZW5kaW5nT2Y6IFtdLFxuICBwcm9ncmVzczogW10sXG4gIGludGVyZXN0OiAwLFxuICBwcm92aWRlcjogZVByb3ZpZGVyLkR5bmFtaUNvcmUsXG4gIGZpbmFuY2VkOiAwLFxuICBuZXh0UGF5bWVudDogMCxcbiAgYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZzogMCxcbiAgcHJpbmNpcGFsX2Rpc2J1cnNlZDogMCxcbiAgZXhwZWN0ZWRfZGlzYnVyc2VkOiAwLCAvLyAtLS0tLS0tLS1cbiAgY3JlZGl0X3R5cGU6ICdBcnJlbmRhbWllbnRvJyxcbiAgaW50ZXJlc3RfcmF0ZTogMCxcbiAgY29tbWlzc2lvbl9vcGVuaW5nOiAwLFxuICBpbnRlcmVzdF9hcnJlYXJzOiAwLFxufVxuXG5leHBvcnQgY29uc3QgY0FkZHJlc3M6IG9BZGRyZXNzID0ge1xuICBzdHJlZXQ6IFwiXCIsXG4gIGNpdHk6IFwiXCIsXG4gIG5laWdoYm9yOiBcIlwiLFxuICB6aXA6IFwiXCIsXG4gIGV4dDogXCJcIixcbiAgaW50OiBcIlwiLFxuICBzdGF0ZTogXCJcIlxufVxuXG5leHBvcnQgY29uc3QgY0NvbnRyYWN0OiBvQ29udHJhY3QgPSB7XG4gIGlkOiBcIlwiLFxuICBjbGllbnQ6IFwiXCIsXG4gIGFkZHJlc3M6IGNBZGRyZXNzLFxuICBkZXZpY2U6IGNEZXZpY2UsXG4gIGZpbmFuY2lhbDogY0ZpbmFuY2lhbCxcbiAgYnk6IFwiXCIsXG4gIGFjdGl2ZTogdHJ1ZVxufVxuXG5leHBvcnQgY2xhc3MgRmFjdG9yeUNvbnRyYWN0IHtcblxuICBwdWJsaWMgc3RhdGljIEZvcm1DbGllbnQoY2xpZW50Pzogb0NsaWVudCkge1xuICAgIGxldCBkYXRhID0gY0NsaWVudFxuXG4gICAgaWYgKGNsaWVudCkgZGF0YSA9IGNsaWVudFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5uYW1lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMTApXSksXG4gICAgICBlbWFpbDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnVzZXJuYW1lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5lbWFpbF0pLFxuICAgICAgcGhvbmU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5waG9uZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDEwKV0pLFxuICAgICAgY3VycDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmN1cnAsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCgxNildKSxcbiAgICAgIHVzZXJSZWZlcmVuY2VzOiBuZXcgVW50eXBlZEZvcm1BcnJheShbXSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIENyZWF0ZVVzZXJSZWZlcmVuY2VGb3JtT2JqKHVzZXI6IG9Vc2VyUmVmZXJlbmNlKSB7XG4gICAgbGV0IGRhdGEgPSBjVXNlclJlZmVyZW5jZVxuXG4gICAgaWYgKHVzZXIubmFtZSAhPSBcIlwiKSBkYXRhID0gdXNlclxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5uYW1lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMTApXSksXG4gICAgICBwaG9uZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnBob25lLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgcmVsYXRpb25zaGlwOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEucmVsYXRpb25zaGlwLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgRm9ybUFkZHJlc3MoYWRkcmVzcz86IG9BZGRyZXNzKSB7XG4gICAgbGV0IGRhdGEgPSBjQWRkcmVzc1xuXG4gICAgaWYgKGFkZHJlc3MpIGRhdGEgPSBhZGRyZXNzXG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RyZWV0OiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuc3RyZWV0LCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIG5laWdoYm9yOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEubmVpZ2hib3IsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgY3A6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS56aXAsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgZXh0OiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuZXh0LCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIGludDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmludCksXG4gICAgICBjaXR5OiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuY2l0eSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBzdGF0ZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnN0YXRlLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEZvcm1EZXZpY2UoZGV2aWNlPzogb0RldmljZSkge1xuICAgIGxldCBkYXRhID0gY0RldmljZVxuXG4gICAgaWYgKGRldmljZSkgZGF0YSA9IGRldmljZVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGVsOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuZGV2aWNlLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIElNRUk6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5JTUVJLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIElEOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuaWQpLFxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgRm9ybUZpbmFuY2lhbChmaW5hbmNpYWw/OiBvRmluYW5jaWFsKSB7XG4gICAgbGV0IGRhdGEgPSBjRmluYW5jaWFsXG5cbiAgICBpZiAoZmluYW5jaWFsKSBkYXRhID0gZmluYW5jaWFsXG5cbiAgICBkYXRhLmNyZWRpdF90eXBlID0gXCJBcnJlbmRhbWllbnRvXCJcbiAgICAvLyBkYXRhLmRlYWRsaW5lcy53ZWVrcyA9IGNCdXNpbmVzc0RlYWRsaW5lc1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEudG90YWwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxKV0pLFxuICAgICAgaW5pdGlhbDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmluaXRpYWwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgICBmaW5hbmNlZDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmZpbmFuY2VkLCBWYWxpZGF0b3JzLm1pbigxKSksXG4gICAgICB3ZWVrbHlQYXltZW50OiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEud2Vla2x5UGF5bWVudCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDEpXSksXG4gICAgICBkZWFkbGluZXM6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5kZWFkbGluZXMsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXSksXG4gICAgICBpbml0RGF0ZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmluaXREYXRlKSxcbiAgICAgIHByb3ZpZGVyOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEucHJvdmlkZXIpLFxuXG4gICAgICBjcmVkaXRfdHlwZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmNyZWRpdF90eXBlID8gZGF0YS5jcmVkaXRfdHlwZSA6IDApLFxuICAgICAgaW50ZXJlc3RfcmF0ZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmludGVyZXN0X3JhdGUgPyBkYXRhLmludGVyZXN0X3JhdGUgOiAwKSwgLy8gaW50ZXJlcyBjcmVkaXQgZHluYW1pY1xuICAgICAgY29tbWlzc2lvbl9vcGVuaW5nOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuY29tbWlzc2lvbl9vcGVuaW5nID8gZGF0YS5jb21taXNzaW9uX29wZW5pbmcgOiAwKSxcbiAgICAgIGludGVyZXN0X2FycmVhcnM6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5pbnRlcmVzdF9hcnJlYXJzID8gZGF0YS5pbnRlcmVzdF9hcnJlYXJzIDogMCksIC8vIGludGVyZXNlcyBtb3JhdG9yaW9zIGR5bmFtaWNcblxuICAgICAgYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZzogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcpLCAvLyBjb21pc2lvbiBwb3IgYXBlcnR1cmEgZHluYW1pY1xuICAgICAgcHJpbmNpcGFsX2Rpc2J1cnNlZDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnByaW5jaXBhbF9kaXNidXJzZWQpLFxuICAgICAgZXhwZWN0ZWRfZGlzYnVyc2VkOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuZXhwZWN0ZWRfZGlzYnVyc2VkKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgQ3JlYXRlQ29udHJhY3RGcm9tRm9ybU9iaihkYXRhOiBhbnksIGZpbmFsUGF5OiBudW1iZXIpIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKVxuXG4gICAgY29uc3QgZGV2aWNlOiBvRGV2aWNlID0ge1xuICAgICAgZGV2aWNlOiBkYXRhW1wiZGV2aWNlXCJdWzBdLm1vZGVsLFxuICAgICAgaWQ6IGRhdGFbXCJkZXZpY2VcIl1bMF0uSUQsXG4gICAgICBJTUVJOiBkYXRhW1wiZGV2aWNlXCJdWzBdLklNRUlcbiAgICB9XG4gICAgY29uc3QgYWRkcmVzczogb0FkZHJlc3MgPSB7XG4gICAgICBzdHJlZXQ6IGRhdGFbXCJhZGRyZXNzXCJdWzBdLnN0cmVldCxcbiAgICAgIGNpdHk6IGRhdGFbXCJhZGRyZXNzXCJdWzBdLmNpdHksXG4gICAgICBuZWlnaGJvcjogZGF0YVtcImFkZHJlc3NcIl1bMF0ubmVpZ2hib3IsXG4gICAgICB6aXA6IGRhdGFbXCJhZGRyZXNzXCJdWzBdLmNwLFxuICAgICAgZXh0OiBkYXRhW1wiYWRkcmVzc1wiXVswXS5leHQsXG4gICAgICBpbnQ6IGRhdGFbXCJhZGRyZXNzXCJdWzBdLmludCxcbiAgICAgIHN0YXRlOiBkYXRhW1wiYWRkcmVzc1wiXVswXS5zdGF0ZVxuICAgIH1cblxuICAgIGNvbnN0IGZpbmFuY2lhbDogb0ZpbmFuY2lhbCA9IHtcbiAgICAgIHRvdGFsOiBOdW1iZXIoZGF0YVtcImZpbmFuY2lhbFwiXVswXS50b3RhbCksXG4gICAgICBpbml0aWFsOiBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmluaXRpYWwsXG4gICAgICBkZWFkbGluZXM6IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uZGVhZGxpbmVzLFxuICAgICAgcHJvZ3Jlc3M6IFtdLFxuICAgICAgcGVuZGluZ09mOiBbXSxcbiAgICAgIHdlZWtseVBheW1lbnQ6IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0ud2Vla2x5UGF5bWVudCxcbiAgICAgIGludGVyZXN0OiBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmludGVyZXN0X3JhdGUsXG4gICAgICBmaW5hbERhdGU6IGRhdGUuZ2V0VGltZSgpICsgKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uZGVhZGxpbmVzLndlZWtzICogKDYwNDgwMCAqIDEwMDApKSxcbiAgICAgIGluaXREYXRlOiBkYXRlLmdldERhdGUoKSxcbiAgICAgIGRheUN1dDogZGF0ZS5nZXREYXRlKCksXG4gICAgICBwcm92aWRlcjogZGF0YVtcImZpbmFuY2lhbFwiXVswXS5wcm92aWRlcixcbiAgICAgIGZpbmFsUGF5bWVudDogZmluYWxQYXksXG4gICAgICBmaW5hbmNlZDogZGF0YVtcImZpbmFuY2lhbFwiXVswXS5maW5hbmNlZCxcbiAgICAgIG5leHRQYXltZW50OiBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLm5leHRQYXltZW50XG4gICAgfVxuICAgIGlmIChkYXRhW1wiZmluYW5jaWFsXCJdWzBdLnByb3ZpZGVyID09IGVQcm92aWRlci5EeW5hbWlDb3JlKSB7XG4gICAgICBmaW5hbmNpYWwuaW5pdGlhbCA9IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyA/IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcpIDogMFxuICAgICAgZmluYW5jaWFsLmV4cGVjdGVkX2Rpc2J1cnNlZCA9IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uZXhwZWN0ZWRfZGlzYnVyc2VkID8gTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uZXhwZWN0ZWRfZGlzYnVyc2VkKSA6IDBcbiAgICAgIGZpbmFuY2lhbC5wcmluY2lwYWxfZGlzYnVyc2VkID0gZGF0YVtcImZpbmFuY2lhbFwiXVswXS5wcmluY2lwYWxfZGlzYnVyc2VkID8gTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0ucHJpbmNpcGFsX2Rpc2J1cnNlZCkgOiAwXG4gICAgICBmaW5hbmNpYWwuaW50ZXJlc3RfYXJyZWFycyA9IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uaW50ZXJlc3RfcmF0ZSA/IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmludGVyZXN0X3JhdGUpIDogMFxuICAgICAgZmluYW5jaWFsLmNvbW1pc3Npb25fb3BlbmluZyA9IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uY29tbWlzc2lvbl9vcGVuaW5nID8gTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uY29tbWlzc2lvbl9vcGVuaW5nKSA6IDBcbiAgICAgIGZpbmFuY2lhbC5jcmVkaXRfdHlwZSA9IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uY3JlZGl0X3R5cGUgPyBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmNyZWRpdF90eXBlIDogXCJcIlxuICAgICAgZmluYW5jaWFsLmNsYWJlID0gZGF0YVtcImZpbmFuY2lhbFwiXVswXS5jbGFiZSA/IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uY2xhYmUgOiBcIlwiXG4gICAgfVxuXG4gICAgaWYgKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChOdW1iZXIoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKSA+IDApXG4gICAgICAgIGZpbmFuY2lhbC5pbml0aWFsID0gTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZylcbiAgICAgIGVsc2VcbiAgICAgICAgZmluYW5jaWFsLmluaXRpYWwgPSBOdW1iZXIoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5pbml0aWFsKVxuICAgIH1cblxuICAgIGlmIChOdW1iZXIoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKSA+IDApXG4gICAgICBmaW5hbmNpYWwuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyA9IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcpXG4gICAgZWxzZVxuICAgICAgZmluYW5jaWFsLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgPSBmaW5hbmNpYWwuaW5pdGlhbFxuXG4gICAgaWYgKGZpbmFuY2lhbC5uZXh0UGF5bWVudCA9PSB1bmRlZmluZWQpIGZpbmFuY2lhbC5uZXh0UGF5bWVudCA9IDBcblxuICAgIGNvbnN0IGNvbnRyYWN0OiBvQ29udHJhY3QgPSB7XG4gICAgICBpZDogXCJcIixcbiAgICAgIGNsaWVudDogXCJcIixcbiAgICAgIGFkZHJlc3M6IGFkZHJlc3MsXG4gICAgICBkZXZpY2U6IGRldmljZSxcbiAgICAgIGZpbmFuY2lhbDogZmluYW5jaWFsLFxuICAgICAgYnk6IFwiXCIsXG4gICAgICBhY3RpdmU6IHRydWUsXG4gICAgICBsYXN0UGF5bWVudDogZGF0ZS5nZXRUaW1lKCksXG4gICAgICBjcmVhdGVkQXQ6IGRhdGUuZ2V0VGltZSgpXG4gICAgfVxuICAgIHJldHVybiBjb250cmFjdFxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBDcmVhdGVDb250cmFjdFRvQ29uZWt0YU9iaihkYXRhOiBvQ29udHJhY3QsIG1vbnRobHlQYXk6IG51bWJlciwgZmluYWxQYXk6IG51bWJlcikge1xuICAgIGNvbnN0IG86IGFueSA9IHt9XG5cbiAgICBjb25zdCBkZXZpY2U6IG9EZXZpY2UgPSB7XG4gICAgICBkZXZpY2U6IGRhdGEuZGV2aWNlLmRldmljZSxcbiAgICAgIGlkOiBkYXRhLmRldmljZS5pZCxcbiAgICAgIElNRUk6IGRhdGEuZGV2aWNlLklNRUlcbiAgICB9XG4gICAgY29uc3QgYWRkcmVzczogb0FkZHJlc3MgPSB7XG4gICAgICBzdHJlZXQ6IGRhdGEuYWRkcmVzcy5zdHJlZXQsXG4gICAgICBjaXR5OiBkYXRhLmFkZHJlc3MuY2l0eSxcbiAgICAgIG5laWdoYm9yOiBkYXRhLmFkZHJlc3MubmVpZ2hib3IsXG4gICAgICB6aXA6IGRhdGEuYWRkcmVzcy56aXAsXG4gICAgICBleHQ6IGRhdGEuYWRkcmVzcy5leHQsXG4gICAgICBpbnQ6IGRhdGEuYWRkcmVzcy5pbnQsXG4gICAgICBzdGF0ZTogZGF0YS5hZGRyZXNzLnN0YXRlXG4gICAgfVxuICAgIGNvbnN0IGZpbmFuY2lhbDogb0ZpbmFuY2lhbCA9IHtcbiAgICAgIHRvdGFsOiBkYXRhLmZpbmFuY2lhbC50b3RhbCxcbiAgICAgIGluaXRpYWw6IGRhdGEuZmluYW5jaWFsLmluaXRpYWwsXG4gICAgICBkZWFkbGluZXM6IGRhdGEuZmluYW5jaWFsLmRlYWRsaW5lcyxcbiAgICAgIHByb2dyZXNzOiBkYXRhLmZpbmFuY2lhbC5wcm9ncmVzcyxcbiAgICAgIHBlbmRpbmdPZjogZGF0YS5maW5hbmNpYWwucGVuZGluZ09mLFxuICAgICAgd2Vla2x5UGF5bWVudDogZGF0YS5maW5hbmNpYWwud2Vla2x5UGF5bWVudCxcbiAgICAgIGludGVyZXN0OiBkYXRhLmZpbmFuY2lhbC5pbnRlcmVzdCxcbiAgICAgIGZpbmFsRGF0ZTogZGF0YS5maW5hbmNpYWwuZmluYWxEYXRlLFxuICAgICAgaW5pdERhdGU6IGRhdGEuZmluYW5jaWFsLmluaXREYXRlLFxuICAgICAgZGF5Q3V0OiBkYXRhLmZpbmFuY2lhbC5kYXlDdXQsXG4gICAgICBwcm92aWRlcjogZGF0YS5maW5hbmNpYWwucHJvdmlkZXIsXG4gICAgICBmaW5hbFBheW1lbnQ6IGRhdGEuZmluYW5jaWFsLmZpbmFsUGF5bWVudCxcbiAgICAgIGZpbmFuY2VkOiBkYXRhLmZpbmFuY2lhbC5maW5hbmNlZCxcbiAgICAgIG5leHRQYXltZW50OiBkYXRhLmZpbmFuY2lhbC5uZXh0UGF5bWVudFxuICAgIH1cbiAgICBjb25zdCBjb250cmFjdDogb0NvbnRyYWN0ID0ge1xuICAgICAgaWQ6IFwiXCIsXG4gICAgICBjbGllbnQ6IFwiXCIsXG4gICAgICBhZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgZGV2aWNlOiBkZXZpY2UsXG4gICAgICBmaW5hbmNpYWw6IGZpbmFuY2lhbCxcbiAgICAgIGJ5OiBcIlwiLFxuICAgICAgYWN0aXZlOiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBjb250cmFjdFxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBDcmVhdGVBdXRoRm9ybSh1c2VybmFtZTogc3RyaW5nLCBjdXJwOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXNzd29yZDogc3RyaW5nID0gdGhpcy5jcmVhdGVQYXNzd29yZChjdXJwKVxuICAgIHJldHVybiB7XG4gICAgICB1c2VybmFtZTogbmV3IFVudHlwZWRGb3JtQ29udHJvbCh1c2VybmFtZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBwYXNzd29yZDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChwYXNzd29yZCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVQYXNzd29yZChjdXJwOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IF9jdXJwID0gY3VycC5zcGxpdChcIlwiKVxuICAgIGxldCBwYXNzd29yZCA9IFwiXCJcbiAgICBjb25zdCBsaW1pdCA9IDdcblxuICAgIGlmIChfY3VycC5sZW5ndGggPCAxNikgcmV0dXJuIFwiXCJcblxuICAgIHBhc3N3b3JkICs9IF9jdXJwWzBdLnRvTG93ZXJDYXNlKClcblxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGxpbWl0OyBpKyspXG4gICAgICBwYXNzd29yZCArPSBfY3VycFtpXS50b1VwcGVyQ2FzZSgpXG5cbiAgICBwYXNzd29yZCArPSBgKmBcbiAgICByZXR1cm4gcGFzc3dvcmRcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgTWFwcGVyVHlwZUNvbnRDbGlfQ29udHJhY3QoX2NvbnRyYWN0OiB0eUNsaWVudENvbnRyYWN0KTogb0NvbnRyYWN0IHtcbiAgICBjb25zdCBjb250cmFjdDogb0NvbnRyYWN0ID0ge1xuICAgICAgaWQ6IF9jb250cmFjdC5jb250cmFjdCEsXG4gICAgICBjbGllbnQ6IF9jb250cmFjdC5jbGllbnQsXG4gICAgICBhZGRyZXNzOiBfY29udHJhY3QuYWRkcmVzcyxcbiAgICAgIGRldmljZTogX2NvbnRyYWN0LmRldmljZSxcbiAgICAgIGZpbmFuY2lhbDogX2NvbnRyYWN0LmZpbmFuY2lhbCxcbiAgICAgIGJ5OiBfY29udHJhY3QuYnksXG4gICAgICBhY3RpdmU6IF9jb250cmFjdC5hY3RpdmUsXG4gICAgICBsYXN0UGF5bWVudDogX2NvbnRyYWN0Lmxhc3RQYXltZW50LFxuICAgICAgY3JlYXRlZEF0OiBfY29udHJhY3QuY3JlYXRlZEF0LFxuICAgICAgZHluYW1pY0FjY291bnQ6IF9jb250cmFjdC5keW5hbWljQWNjb3VudCxcbiAgICB9XG5cbiAgICByZXR1cm4gY29udHJhY3RcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgTWFwcGVyU3luY0NvbnRyYWN0RHluYW1pYyhiYXNlOiBvQ29udHJhY3QsIGFjY291bnQ6IElEQ0FjY291bnQpOiBvQ29udHJhY3Qge1xuICAgIGxldCBuQ29udHJhY3QgPSBiYXNlXG4gICAgbGV0IF9maW5hbmNpYWwgPSBiYXNlLmZpbmFuY2lhbFxuICAgIGxldCBfZGV2aWNlID0gYmFzZS5kZXZpY2VcblxuXG4gICAgY29uc3QgZmluYW5jaWFsOiBvRmluYW5jaWFsID0ge1xuICAgICAgdG90YWw6IF9maW5hbmNpYWwudG90YWwsXG4gICAgICBpbml0aWFsOiBhY2NvdW50LnByb3BlcnRpZXMuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyA/IGFjY291bnQucHJvcGVydGllcy5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nIDogX2ZpbmFuY2lhbC5pbml0aWFsLFxuICAgICAgZGVhZGxpbmVzOiBfZmluYW5jaWFsLmRlYWRsaW5lcyxcbiAgICAgIHByb2dyZXNzOiBfZmluYW5jaWFsLnByb2dyZXNzID8gX2ZpbmFuY2lhbC5wcm9ncmVzcyA6IFtdLFxuICAgICAgcGVuZGluZ09mOiBfZmluYW5jaWFsLnBlbmRpbmdPZiA/IF9maW5hbmNpYWwucGVuZGluZ09mIDogW10sXG4gICAgICB3ZWVrbHlQYXltZW50OiBfZmluYW5jaWFsLndlZWtseVBheW1lbnQsXG4gICAgICBpbnRlcmVzdDogX2ZpbmFuY2lhbC5pbnRlcmVzdCxcbiAgICAgIGZpbmFsRGF0ZTogX2ZpbmFuY2lhbC5maW5hbERhdGUsXG4gICAgICBpbml0RGF0ZTogX2ZpbmFuY2lhbC5pbml0RGF0ZSxcbiAgICAgIGRheUN1dDogX2ZpbmFuY2lhbC5kYXlDdXQsXG4gICAgICBwcm92aWRlcjogX2ZpbmFuY2lhbC5wcm92aWRlcixcbiAgICAgIGZpbmFsUGF5bWVudDogX2ZpbmFuY2lhbC5maW5hbFBheW1lbnQsXG4gICAgICBmaW5hbmNlZDogX2ZpbmFuY2lhbC5maW5hbmNlZCxcbiAgICAgIG5leHRQYXltZW50OiBfZmluYW5jaWFsLm5leHRQYXltZW50ID8gX2ZpbmFuY2lhbC5uZXh0UGF5bWVudCA6IDAsXG5cbiAgICAgIGFtb3VudF9jb21taXNzaW9uX29wZW5pbmc6XG4gICAgICBhY2NvdW50LnByb3BlcnRpZXMuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyxcblxuICAgICAgZXhwZWN0ZWRfZGlzYnVyc2VkOlxuICAgICAgICBhY2NvdW50LnByb3BlcnRpZXMuZXhwZWN0ZWRfZGlzYnVyc2VkID9cbiAgICAgICAgICBOdW1iZXIoYWNjb3VudC5wcm9wZXJ0aWVzLmV4cGVjdGVkX2Rpc2J1cnNlZCkgOlxuICAgICAgICAgIE51bWJlcihfZmluYW5jaWFsLmV4cGVjdGVkX2Rpc2J1cnNlZCksXG5cbiAgICAgIHByaW5jaXBhbF9kaXNidXJzZWQ6XG4gICAgICAgIGFjY291bnQucHJvcGVydGllcy5wcmluY2lwYWxfZGlzYnVyc2VkID9cbiAgICAgICAgICBhY2NvdW50LnByb3BlcnRpZXMucHJpbmNpcGFsX2Rpc2J1cnNlZCA6XG4gICAgICAgICAgX2ZpbmFuY2lhbC5wcmluY2lwYWxfZGlzYnVyc2VkLFxuXG4gICAgICBjb21taXNzaW9uX29wZW5pbmc6XG4gICAgICAgIGFjY291bnQuY29uZmlnLmNvbW1pc3Npb25fb3BlbmluZyA/XG4gICAgICAgICAgTnVtYmVyKGFjY291bnQuY29uZmlnLmNvbW1pc3Npb25fb3BlbmluZykgOlxuICAgICAgICAgIE51bWJlcihfZmluYW5jaWFsLmNvbW1pc3Npb25fb3BlbmluZyksXG5cbiAgICAgIGNyZWRpdF90eXBlOlxuICAgICAgICBhY2NvdW50LmNvbmZpZy5jcmVkaXRfdHlwZSA/IGFjY291bnQuY29uZmlnLmNyZWRpdF90eXBlIDogX2ZpbmFuY2lhbC5jcmVkaXRfdHlwZSxcblxuICAgICAgY2xhYmU6XG4gICAgICAgIFN0cmluZyhhY2NvdW50LnByb3BlcnRpZXMuY2xhYmUgPyBhY2NvdW50LnByb3BlcnRpZXMuY2xhYmUgOiBfZmluYW5jaWFsLmNsYWJlKVxuICAgIH1cblxuICAgIGNvbnN0IGludGVyZXN0QXJyZWFycyA9IGFjY291bnQuY29uZmlnLmludGVyZXN0X2FycmVhcnNcbiAgICBjb25zdCBwcmV2SW50ZXJlc3RBcnJlYXJzID0gX2ZpbmFuY2lhbC5pbnRlcmVzdF9hcnJlYXJzXG4gICAgaWYgKGludGVyZXN0QXJyZWFycyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGZpbmFuY2lhbC5pbnRlcmVzdF9hcnJlYXJzID0gaW50ZXJlc3RBcnJlYXJzXG4gICAgfSBlbHNlIGlmIChwcmV2SW50ZXJlc3RBcnJlYXJzICE9IHVuZGVmaW5lZCkge1xuICAgICAgZmluYW5jaWFsLmludGVyZXN0X2FycmVhcnMgPSBwcmV2SW50ZXJlc3RBcnJlYXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbmFuY2lhbC5pbnRlcmVzdF9hcnJlYXJzID0gMFxuICAgIH1cblxuICAgIGNvbnN0IGludGVyZXN0ID0gYWNjb3VudC5jb25maWcuaW50ZXJlc3RfcmF0ZVxuICAgIGNvbnN0IHByZXZJbnRlcmVzdCA9IF9maW5hbmNpYWwuaW50ZXJlc3RcbiAgICBpZiAoaW50ZXJlc3QgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaW5hbmNpYWwuaW50ZXJlc3QgPSBpbnRlcmVzdFxuICAgIH0gZWxzZSBpZiAocHJldkludGVyZXN0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgZmluYW5jaWFsLmludGVyZXN0ID0gcHJldkludGVyZXN0XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbmFuY2lhbC5pbnRlcmVzdCA9IDBcbiAgICB9XG5cbiAgICBpZiAoYWNjb3VudC5wcm9wZXJ0aWVzLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoTnVtYmVyKGFjY291bnQucHJvcGVydGllcy5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKSA+IDApIHtcbiAgICAgICAgZmluYW5jaWFsLmluaXRpYWwgPSBOdW1iZXIoYWNjb3VudC5wcm9wZXJ0aWVzLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcpXG4gICAgICAgIGZpbmFuY2lhbC5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nID0gTnVtYmVyKGFjY291bnQucHJvcGVydGllcy5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmluYW5jaWFsLmluaXRpYWwgPSBOdW1iZXIoX2ZpbmFuY2lhbC5pbml0aWFsKVxuICAgICAgICBmaW5hbmNpYWwuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyA9IGZpbmFuY2lhbC5pbml0aWFsXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsbGVyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBhY2NvdW50LnByb3BlcnRpZXMuc2VsbGVyX25hbWVcbiAgICBuQ29udHJhY3QuYnkgPSBzZWxsZXIgIT0gbnVsbCA/IHNlbGxlciA6IFwiXCJcblxuICAgIG5Db250cmFjdC5kZXZpY2UuaWQgPSBfZGV2aWNlLmlkID8gX2RldmljZS5pZCA6IFwiXCJcblxuICAgIG5Db250cmFjdC5maW5hbmNpYWwgPSBmaW5hbmNpYWxcbiAgICByZXR1cm4gbkNvbnRyYWN0XG4gIH1cbn1cblxuIl19