@fin.cx/einvoice 5.0.2 → 5.1.2

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 (116) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/einvoice.d.ts +4 -8
  3. package/dist_ts/einvoice.js +46 -7
  4. package/dist_ts/formats/converters/xml-to-einvoice.converter.d.ts +21 -0
  5. package/dist_ts/formats/converters/xml-to-einvoice.converter.js +127 -0
  6. package/dist_ts/formats/semantic/bt-bg.model.d.ts +445 -0
  7. package/dist_ts/formats/semantic/bt-bg.model.js +12 -0
  8. package/dist_ts/formats/semantic/semantic.adapter.d.ts +87 -0
  9. package/dist_ts/formats/semantic/semantic.adapter.js +538 -0
  10. package/dist_ts/formats/semantic/semantic.validator.d.ts +48 -0
  11. package/dist_ts/formats/semantic/semantic.validator.js +596 -0
  12. package/dist_ts/formats/utils/currency.calculator.decimal.d.ts +98 -0
  13. package/dist_ts/formats/utils/currency.calculator.decimal.js +212 -0
  14. package/dist_ts/formats/utils/currency.utils.d.ts +99 -0
  15. package/dist_ts/formats/utils/currency.utils.js +250 -0
  16. package/dist_ts/formats/utils/decimal.d.ts +151 -0
  17. package/dist_ts/formats/utils/decimal.js +435 -0
  18. package/dist_ts/formats/validation/codelist.validator.d.ts +49 -0
  19. package/dist_ts/formats/validation/codelist.validator.js +188 -0
  20. package/dist_ts/formats/validation/conformance.harness.d.ts +99 -0
  21. package/dist_ts/formats/validation/conformance.harness.js +471 -0
  22. package/dist_ts/formats/validation/en16931.business-rules.validator.d.ts +58 -0
  23. package/dist_ts/formats/validation/en16931.business-rules.validator.js +459 -0
  24. package/dist_ts/formats/validation/facturx.validator.d.ts +75 -0
  25. package/dist_ts/formats/validation/facturx.validator.js +522 -0
  26. package/dist_ts/formats/validation/integrated.validator.d.ts +82 -0
  27. package/dist_ts/formats/validation/integrated.validator.js +311 -0
  28. package/dist_ts/formats/validation/peppol.validator.d.ts +77 -0
  29. package/dist_ts/formats/validation/peppol.validator.js +529 -0
  30. package/dist_ts/formats/validation/schematron.downloader.d.ts +71 -0
  31. package/dist_ts/formats/validation/schematron.downloader.js +254 -0
  32. package/dist_ts/formats/validation/schematron.integration.d.ts +60 -0
  33. package/dist_ts/formats/validation/schematron.integration.js +230 -0
  34. package/dist_ts/formats/validation/schematron.validator.d.ts +79 -0
  35. package/dist_ts/formats/validation/schematron.validator.js +288 -0
  36. package/dist_ts/formats/validation/schematron.worker.d.ts +50 -0
  37. package/dist_ts/formats/validation/schematron.worker.js +185 -0
  38. package/dist_ts/formats/validation/validation.types.d.ts +163 -0
  39. package/dist_ts/formats/validation/validation.types.js +181 -0
  40. package/dist_ts/formats/validation/vat-categories.validator.d.ts +87 -0
  41. package/dist_ts/formats/validation/vat-categories.validator.js +497 -0
  42. package/dist_ts/formats/validation/xrechnung.validator.d.ts +92 -0
  43. package/dist_ts/formats/validation/xrechnung.validator.js +417 -0
  44. package/dist_ts/interfaces/common.d.ts +1 -0
  45. package/dist_ts/interfaces/en16931-metadata.d.ts +83 -0
  46. package/dist_ts/interfaces/en16931-metadata.js +6 -0
  47. package/dist_ts/plugins.d.ts +3 -1
  48. package/dist_ts/plugins.js +7 -2
  49. package/dist_ts_install/download-schematron.d.ts +6 -0
  50. package/dist_ts_install/download-schematron.js +62 -0
  51. package/dist_ts_install/download-test-samples.d.ts +19 -0
  52. package/dist_ts_install/download-test-samples.js +169 -0
  53. package/dist_ts_install/download-xrechnung-rules.d.ts +7 -0
  54. package/dist_ts_install/download-xrechnung-rules.js +146 -0
  55. package/dist_ts_install/index.d.ts +8 -0
  56. package/dist_ts_install/index.js +246 -0
  57. package/package.json +13 -8
  58. package/readme.md +255 -810
  59. package/ts/00_commitinfo_data.ts +1 -1
  60. package/ts/einvoice.ts +63 -14
  61. package/ts/formats/converters/xml-to-einvoice.converter.ts +142 -0
  62. package/ts/formats/semantic/bt-bg.model.ts +524 -0
  63. package/ts/formats/semantic/semantic.adapter.ts +600 -0
  64. package/ts/formats/semantic/semantic.validator.ts +654 -0
  65. package/ts/formats/utils/currency.calculator.decimal.ts +323 -0
  66. package/ts/formats/utils/currency.utils.ts +299 -0
  67. package/ts/formats/utils/decimal.ts +509 -0
  68. package/ts/formats/validation/codelist.validator.ts +317 -0
  69. package/ts/formats/validation/conformance.harness.ts +591 -0
  70. package/ts/formats/validation/en16931.business-rules.validator.ts +694 -0
  71. package/ts/formats/validation/facturx.validator.ts +579 -0
  72. package/ts/formats/validation/integrated.validator.ts +405 -0
  73. package/ts/formats/validation/peppol.validator.ts +589 -0
  74. package/ts/formats/validation/schematron.downloader.ts +304 -0
  75. package/ts/formats/validation/schematron.integration.ts +285 -0
  76. package/ts/formats/validation/schematron.validator.ts +348 -0
  77. package/ts/formats/validation/schematron.worker.ts +221 -0
  78. package/ts/formats/validation/validation.types.ts +274 -0
  79. package/ts/formats/validation/vat-categories.validator.ts +845 -0
  80. package/ts/formats/validation/xrechnung.validator.ts +494 -0
  81. package/ts/interfaces/common.ts +1 -0
  82. package/ts/interfaces/en16931-metadata.ts +104 -0
  83. package/ts/plugins.ts +8 -0
  84. package/ts/tspublish.json +3 -0
  85. package/dist_ts/classes.decoder.d.ts +0 -40
  86. package/dist_ts/classes.decoder.js +0 -320
  87. package/dist_ts/classes.encoder.d.ts +0 -51
  88. package/dist_ts/classes.encoder.js +0 -293
  89. package/dist_ts/classes.xinvoice.d.ts +0 -136
  90. package/dist_ts/classes.xinvoice.js +0 -352
  91. package/dist_ts/formats/base.decoder.d.ts +0 -19
  92. package/dist_ts/formats/base.decoder.js +0 -130
  93. package/dist_ts/formats/base.validator.d.ts +0 -44
  94. package/dist_ts/formats/base.validator.js +0 -39
  95. package/dist_ts/formats/decoder.factory.d.ts +0 -15
  96. package/dist_ts/formats/decoder.factory.js +0 -46
  97. package/dist_ts/formats/factorx.decoder.d.ts +0 -18
  98. package/dist_ts/formats/factorx.decoder.js +0 -178
  99. package/dist_ts/formats/factorx.encoder.d.ts +0 -51
  100. package/dist_ts/formats/factorx.encoder.js +0 -293
  101. package/dist_ts/formats/facturx.decoder.d.ts +0 -18
  102. package/dist_ts/formats/facturx.decoder.js +0 -210
  103. package/dist_ts/formats/facturx.encoder.d.ts +0 -51
  104. package/dist_ts/formats/facturx.encoder.js +0 -293
  105. package/dist_ts/formats/facturx.validator.d.ts +0 -67
  106. package/dist_ts/formats/facturx.validator.js +0 -266
  107. package/dist_ts/formats/pdf/robust-pdf.extractor.d.ts +0 -40
  108. package/dist_ts/formats/pdf/robust-pdf.extractor.js +0 -324
  109. package/dist_ts/formats/ubl.validator.d.ts +0 -82
  110. package/dist_ts/formats/ubl.validator.js +0 -306
  111. package/dist_ts/formats/validator.factory.d.ts +0 -18
  112. package/dist_ts/formats/validator.factory.js +0 -78
  113. package/dist_ts/formats/xinvoice.decoder.d.ts +0 -28
  114. package/dist_ts/formats/xinvoice.decoder.js +0 -332
  115. package/dist_ts/formats/xinvoice.encoder.d.ts +0 -19
  116. package/dist_ts/formats/xinvoice.encoder.js +0 -282
@@ -1,282 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- /**
3
- * A class to convert a given ILetter with invoice data
4
- * into an XInvoice/XRechnung compliant XML (based on UBL).
5
- *
6
- * XRechnung is the German implementation of the European standard EN16931
7
- * for electronic invoices to the German public sector.
8
- */
9
- export class XInvoiceEncoder {
10
- constructor() { }
11
- /**
12
- * Creates an XInvoice compliant XML based on the provided letter data.
13
- */
14
- createXInvoiceXml(letterArg) {
15
- // Use SmartXml for XML creation
16
- const smartxmlInstance = new plugins.smartxml.SmartXml();
17
- if (!letterArg?.content?.invoiceData) {
18
- throw new Error('Letter does not contain invoice data.');
19
- }
20
- const invoice = letterArg.content.invoiceData;
21
- const billedBy = invoice.billedBy;
22
- const billedTo = invoice.billedTo;
23
- // Create the XML document
24
- const doc = smartxmlInstance
25
- .create({ version: '1.0', encoding: 'UTF-8' })
26
- .ele('Invoice', {
27
- 'xmlns': 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2',
28
- 'xmlns:cac': 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2',
29
- 'xmlns:cbc': 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2',
30
- 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance'
31
- });
32
- // UBL Version ID
33
- doc.ele('cbc:UBLVersionID').txt('2.1').up();
34
- // CustomizationID for XRechnung
35
- doc.ele('cbc:CustomizationID').txt('urn:cen.eu:en16931:2017#compliant#urn:xoev-de:kosit:standard:xrechnung_2.0').up();
36
- // ID - Invoice number
37
- doc.ele('cbc:ID').txt(invoice.id).up();
38
- // Issue date
39
- const issueDate = new Date(letterArg.date);
40
- const issueDateStr = `${issueDate.getFullYear()}-${String(issueDate.getMonth() + 1).padStart(2, '0')}-${String(issueDate.getDate()).padStart(2, '0')}`;
41
- doc.ele('cbc:IssueDate').txt(issueDateStr).up();
42
- // Due date
43
- const dueDate = new Date(letterArg.date);
44
- dueDate.setDate(dueDate.getDate() + invoice.dueInDays);
45
- const dueDateStr = `${dueDate.getFullYear()}-${String(dueDate.getMonth() + 1).padStart(2, '0')}-${String(dueDate.getDate()).padStart(2, '0')}`;
46
- doc.ele('cbc:DueDate').txt(dueDateStr).up();
47
- // Invoice type code
48
- const invoiceTypeCode = invoice.type === 'creditnote' ? '381' : '380';
49
- doc.ele('cbc:InvoiceTypeCode').txt(invoiceTypeCode).up();
50
- // Note - optional invoice note
51
- if (invoice.notes && invoice.notes.length > 0) {
52
- doc.ele('cbc:Note').txt(invoice.notes[0]).up();
53
- }
54
- // Document currency code
55
- doc.ele('cbc:DocumentCurrencyCode').txt(invoice.currency).up();
56
- // Tax currency code - same as document currency in this case
57
- doc.ele('cbc:TaxCurrencyCode').txt(invoice.currency).up();
58
- // Accounting supplier party (seller)
59
- const supplierParty = doc.ele('cac:AccountingSupplierParty');
60
- const supplierPartyDetails = supplierParty.ele('cac:Party');
61
- // Seller VAT ID
62
- if (billedBy.type === 'company' && billedBy.registrationDetails?.vatId) {
63
- const partyTaxScheme = supplierPartyDetails.ele('cac:PartyTaxScheme');
64
- partyTaxScheme.ele('cbc:CompanyID').txt(billedBy.registrationDetails.vatId).up();
65
- partyTaxScheme.ele('cac:TaxScheme')
66
- .ele('cbc:ID').txt('VAT').up()
67
- .up();
68
- }
69
- // Seller name
70
- supplierPartyDetails.ele('cac:PartyName')
71
- .ele('cbc:Name').txt(billedBy.name).up()
72
- .up();
73
- // Seller postal address
74
- const supplierAddress = supplierPartyDetails.ele('cac:PostalAddress');
75
- supplierAddress.ele('cbc:StreetName').txt(billedBy.address.streetName).up();
76
- if (billedBy.address.houseNumber) {
77
- supplierAddress.ele('cbc:BuildingNumber').txt(billedBy.address.houseNumber).up();
78
- }
79
- supplierAddress.ele('cbc:CityName').txt(billedBy.address.city).up();
80
- supplierAddress.ele('cbc:PostalZone').txt(billedBy.address.postalCode).up();
81
- supplierAddress.ele('cac:Country')
82
- .ele('cbc:IdentificationCode').txt(billedBy.address.country || 'DE').up()
83
- .up();
84
- // Seller contact
85
- const supplierContact = supplierPartyDetails.ele('cac:Contact');
86
- if (billedBy.email) {
87
- supplierContact.ele('cbc:ElectronicMail').txt(billedBy.email).up();
88
- }
89
- if (billedBy.phone) {
90
- supplierContact.ele('cbc:Telephone').txt(billedBy.phone).up();
91
- }
92
- supplierParty.up(); // Close AccountingSupplierParty
93
- // Accounting customer party (buyer)
94
- const customerParty = doc.ele('cac:AccountingCustomerParty');
95
- const customerPartyDetails = customerParty.ele('cac:Party');
96
- // Buyer VAT ID
97
- if (billedTo.type === 'company' && billedTo.registrationDetails?.vatId) {
98
- const partyTaxScheme = customerPartyDetails.ele('cac:PartyTaxScheme');
99
- partyTaxScheme.ele('cbc:CompanyID').txt(billedTo.registrationDetails.vatId).up();
100
- partyTaxScheme.ele('cac:TaxScheme')
101
- .ele('cbc:ID').txt('VAT').up()
102
- .up();
103
- }
104
- // Buyer name
105
- customerPartyDetails.ele('cac:PartyName')
106
- .ele('cbc:Name').txt(billedTo.name).up()
107
- .up();
108
- // Buyer postal address
109
- const customerAddress = customerPartyDetails.ele('cac:PostalAddress');
110
- customerAddress.ele('cbc:StreetName').txt(billedTo.address.streetName).up();
111
- if (billedTo.address.houseNumber) {
112
- customerAddress.ele('cbc:BuildingNumber').txt(billedTo.address.houseNumber).up();
113
- }
114
- customerAddress.ele('cbc:CityName').txt(billedTo.address.city).up();
115
- customerAddress.ele('cbc:PostalZone').txt(billedTo.address.postalCode).up();
116
- customerAddress.ele('cac:Country')
117
- .ele('cbc:IdentificationCode').txt(billedTo.address.country || 'DE').up()
118
- .up();
119
- // Buyer contact
120
- if (billedTo.email || billedTo.phone) {
121
- const customerContact = customerPartyDetails.ele('cac:Contact');
122
- if (billedTo.email) {
123
- customerContact.ele('cbc:ElectronicMail').txt(billedTo.email).up();
124
- }
125
- if (billedTo.phone) {
126
- customerContact.ele('cbc:Telephone').txt(billedTo.phone).up();
127
- }
128
- }
129
- customerParty.up(); // Close AccountingCustomerParty
130
- // Payment means
131
- if (billedBy.sepaConnection) {
132
- const paymentMeans = doc.ele('cac:PaymentMeans');
133
- paymentMeans.ele('cbc:PaymentMeansCode').txt('58').up(); // 58 = SEPA credit transfer
134
- paymentMeans.ele('cbc:PaymentID').txt(invoice.id).up();
135
- // IBAN
136
- if (billedBy.sepaConnection.iban) {
137
- const payeeAccount = paymentMeans.ele('cac:PayeeFinancialAccount');
138
- payeeAccount.ele('cbc:ID').txt(billedBy.sepaConnection.iban).up();
139
- // BIC
140
- if (billedBy.sepaConnection.bic) {
141
- payeeAccount.ele('cac:FinancialInstitutionBranch')
142
- .ele('cbc:ID').txt(billedBy.sepaConnection.bic).up()
143
- .up();
144
- }
145
- }
146
- }
147
- // Payment terms
148
- const paymentTerms = doc.ele('cac:PaymentTerms');
149
- paymentTerms.ele('cbc:Note').txt(`Payment due in ${invoice.dueInDays} days`).up();
150
- // Tax summary
151
- // Group items by VAT rate
152
- const vatRates = {};
153
- // Collect items by VAT rate
154
- invoice.items.forEach(item => {
155
- if (!vatRates[item.vatPercentage]) {
156
- vatRates[item.vatPercentage] = [];
157
- }
158
- vatRates[item.vatPercentage].push(item);
159
- });
160
- // Calculate tax subtotals for each rate
161
- Object.entries(vatRates).forEach(([rate, items]) => {
162
- const taxRate = parseFloat(rate);
163
- // Calculate base amount for this rate
164
- let taxableAmount = 0;
165
- items.forEach(item => {
166
- taxableAmount += item.unitNetPrice * item.unitQuantity;
167
- });
168
- // Calculate tax amount
169
- const taxAmount = taxableAmount * (taxRate / 100);
170
- // Create tax subtotal
171
- const taxSubtotal = doc.ele('cac:TaxTotal')
172
- .ele('cbc:TaxAmount').txt(taxAmount.toFixed(2))
173
- .att('currencyID', invoice.currency)
174
- .up();
175
- taxSubtotal.ele('cac:TaxSubtotal')
176
- .ele('cbc:TaxableAmount')
177
- .txt(taxableAmount.toFixed(2))
178
- .att('currencyID', invoice.currency)
179
- .up()
180
- .ele('cbc:TaxAmount')
181
- .txt(taxAmount.toFixed(2))
182
- .att('currencyID', invoice.currency)
183
- .up()
184
- .ele('cac:TaxCategory')
185
- .ele('cbc:ID').txt('S').up() // Standard rate
186
- .ele('cbc:Percent').txt(taxRate.toFixed(2)).up()
187
- .ele('cac:TaxScheme')
188
- .ele('cbc:ID').txt('VAT').up()
189
- .up()
190
- .up()
191
- .up();
192
- });
193
- // Calculate invoice totals
194
- let lineExtensionAmount = 0;
195
- let taxExclusiveAmount = 0;
196
- let taxInclusiveAmount = 0;
197
- let totalVat = 0;
198
- // Sum all items
199
- invoice.items.forEach(item => {
200
- const net = item.unitNetPrice * item.unitQuantity;
201
- const vat = net * (item.vatPercentage / 100);
202
- lineExtensionAmount += net;
203
- taxExclusiveAmount += net;
204
- totalVat += vat;
205
- });
206
- taxInclusiveAmount = taxExclusiveAmount + totalVat;
207
- // Legal monetary total
208
- const legalMonetaryTotal = doc.ele('cac:LegalMonetaryTotal');
209
- legalMonetaryTotal.ele('cbc:LineExtensionAmount')
210
- .txt(lineExtensionAmount.toFixed(2))
211
- .att('currencyID', invoice.currency)
212
- .up();
213
- legalMonetaryTotal.ele('cbc:TaxExclusiveAmount')
214
- .txt(taxExclusiveAmount.toFixed(2))
215
- .att('currencyID', invoice.currency)
216
- .up();
217
- legalMonetaryTotal.ele('cbc:TaxInclusiveAmount')
218
- .txt(taxInclusiveAmount.toFixed(2))
219
- .att('currencyID', invoice.currency)
220
- .up();
221
- legalMonetaryTotal.ele('cbc:PayableAmount')
222
- .txt(taxInclusiveAmount.toFixed(2))
223
- .att('currencyID', invoice.currency)
224
- .up();
225
- // Invoice lines
226
- invoice.items.forEach((item, index) => {
227
- const invoiceLine = doc.ele('cac:InvoiceLine');
228
- invoiceLine.ele('cbc:ID').txt((index + 1).toString()).up();
229
- // Quantity
230
- invoiceLine.ele('cbc:InvoicedQuantity')
231
- .txt(item.unitQuantity.toString())
232
- .att('unitCode', this.mapUnitType(item.unitType))
233
- .up();
234
- // Line extension amount (net)
235
- const lineAmount = item.unitNetPrice * item.unitQuantity;
236
- invoiceLine.ele('cbc:LineExtensionAmount')
237
- .txt(lineAmount.toFixed(2))
238
- .att('currencyID', invoice.currency)
239
- .up();
240
- // Item details
241
- const itemEle = invoiceLine.ele('cac:Item');
242
- itemEle.ele('cbc:Description').txt(item.name).up();
243
- itemEle.ele('cbc:Name').txt(item.name).up();
244
- // Classified tax category
245
- itemEle.ele('cac:ClassifiedTaxCategory')
246
- .ele('cbc:ID').txt('S').up() // Standard rate
247
- .ele('cbc:Percent').txt(item.vatPercentage.toFixed(2)).up()
248
- .ele('cac:TaxScheme')
249
- .ele('cbc:ID').txt('VAT').up()
250
- .up()
251
- .up();
252
- // Price
253
- invoiceLine.ele('cac:Price')
254
- .ele('cbc:PriceAmount')
255
- .txt(item.unitNetPrice.toFixed(2))
256
- .att('currencyID', invoice.currency)
257
- .up()
258
- .up();
259
- });
260
- // Return the formatted XML
261
- return doc.end({ prettyPrint: true });
262
- }
263
- /**
264
- * Helper: Map your custom 'unitType' to an ISO code.
265
- */
266
- mapUnitType(unitType) {
267
- switch (unitType.toLowerCase()) {
268
- case 'hour':
269
- case 'hours':
270
- return 'HUR';
271
- case 'day':
272
- case 'days':
273
- return 'DAY';
274
- case 'piece':
275
- case 'pieces':
276
- return 'C62';
277
- default:
278
- return 'C62'; // fallback for unknown unit types
279
- }
280
- }
281
- }
282
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieGludm9pY2UuZW5jb2Rlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2Zvcm1hdHMveGludm9pY2UuZW5jb2Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUV6Qzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sZUFBZTtJQUUxQixnQkFBZSxDQUFDO0lBRWhCOztPQUVHO0lBQ0ksaUJBQWlCLENBQUMsU0FBMkM7UUFDbEUsZ0NBQWdDO1FBQ2hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXpELElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQXFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ2hGLE1BQU0sUUFBUSxHQUFzQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBQ3JFLE1BQU0sUUFBUSxHQUFzQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBRXJFLDBCQUEwQjtRQUMxQixNQUFNLEdBQUcsR0FBRyxnQkFBZ0I7YUFDekIsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7YUFDN0MsR0FBRyxDQUFDLFNBQVMsRUFBRTtZQUNkLE9BQU8sRUFBRSx3REFBd0Q7WUFDakUsV0FBVyxFQUFFLDBFQUEwRTtZQUN2RixXQUFXLEVBQUUsc0VBQXNFO1lBQ25GLFdBQVcsRUFBRSwyQ0FBMkM7U0FDekQsQ0FBQyxDQUFDO1FBRUwsaUJBQWlCO1FBQ2pCLEdBQUcsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFF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