@bitgo-beta/sdk-coin-canton 1.0.1-beta.82 → 1.0.1-beta.821

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 (181) hide show
  1. package/dist/src/canton.d.ts +22 -1
  2. package/dist/src/canton.d.ts.map +1 -1
  3. package/dist/src/canton.js +293 -10
  4. package/dist/src/cantonToken.d.ts +19 -0
  5. package/dist/src/cantonToken.d.ts.map +1 -0
  6. package/dist/src/cantonToken.js +52 -0
  7. package/dist/src/index.d.ts +1 -0
  8. package/dist/src/index.d.ts.map +1 -1
  9. package/dist/src/index.js +2 -1
  10. package/dist/src/lib/allocationAllocateBuilder.d.ts +126 -0
  11. package/dist/src/lib/allocationAllocateBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/allocationAllocateBuilder.js +248 -0
  13. package/dist/src/lib/allocationAllocateWithdrawnBuilder.d.ts +67 -0
  14. package/dist/src/lib/allocationAllocateWithdrawnBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/allocationAllocateWithdrawnBuilder.js +130 -0
  16. package/dist/src/lib/allocationRejectBuilder.d.ts +51 -0
  17. package/dist/src/lib/allocationRejectBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/allocationRejectBuilder.js +107 -0
  19. package/dist/src/lib/allocationRequestBuilder.d.ts +116 -0
  20. package/dist/src/lib/allocationRequestBuilder.d.ts.map +1 -0
  21. package/dist/src/lib/allocationRequestBuilder.js +243 -0
  22. package/dist/src/lib/amount.d.ts +8 -0
  23. package/dist/src/lib/amount.d.ts.map +1 -0
  24. package/dist/src/lib/amount.js +33 -0
  25. package/dist/src/lib/cantonCommandBuilder.d.ts +72 -0
  26. package/dist/src/lib/cantonCommandBuilder.d.ts.map +1 -0
  27. package/dist/src/lib/cantonCommandBuilder.js +173 -0
  28. package/dist/src/lib/clearSigning.d.ts +58 -0
  29. package/dist/src/lib/clearSigning.d.ts.map +1 -0
  30. package/dist/src/lib/clearSigning.js +66 -0
  31. package/dist/src/lib/cosignDelegationAcceptBuilder.d.ts +56 -0
  32. package/dist/src/lib/cosignDelegationAcceptBuilder.d.ts.map +1 -0
  33. package/dist/src/lib/cosignDelegationAcceptBuilder.js +112 -0
  34. package/dist/src/lib/cosignDelegationProposalBuilder.d.ts +60 -0
  35. package/dist/src/lib/cosignDelegationProposalBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/cosignDelegationProposalBuilder.js +111 -0
  37. package/dist/src/lib/endInvestorOnboardingOfferBuilder.d.ts +58 -0
  38. package/dist/src/lib/endInvestorOnboardingOfferBuilder.d.ts.map +1 -0
  39. package/dist/src/lib/endInvestorOnboardingOfferBuilder.js +112 -0
  40. package/dist/src/lib/iface.d.ts +141 -2
  41. package/dist/src/lib/iface.d.ts.map +1 -1
  42. package/dist/src/lib/iface.js +3 -1
  43. package/dist/src/lib/index.d.ts +13 -0
  44. package/dist/src/lib/index.d.ts.map +1 -1
  45. package/dist/src/lib/index.js +29 -2
  46. package/dist/src/lib/messages/cantonBaseMessage.d.ts +16 -0
  47. package/dist/src/lib/messages/cantonBaseMessage.d.ts.map +1 -0
  48. package/dist/src/lib/messages/cantonBaseMessage.js +28 -0
  49. package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessage.d.ts +14 -0
  50. package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessage.d.ts.map +1 -0
  51. package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessage.js +23 -0
  52. package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessageBuilder.d.ts +17 -0
  53. package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessageBuilder.d.ts.map +1 -0
  54. package/dist/src/lib/messages/cantonSignTopology/cantonSignTopologyMessageBuilder.js +25 -0
  55. package/dist/src/lib/messages/cantonSignTopology/index.d.ts +3 -0
  56. package/dist/src/lib/messages/cantonSignTopology/index.d.ts.map +1 -0
  57. package/dist/src/lib/messages/cantonSignTopology/index.js +19 -0
  58. package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessage.d.ts +13 -0
  59. package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessage.d.ts.map +1 -0
  60. package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessage.js +22 -0
  61. package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessageBuilder.d.ts +14 -0
  62. package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessageBuilder.d.ts.map +1 -0
  63. package/dist/src/lib/messages/cantonSignTransaction/cantonSignTransactionMessageBuilder.js +22 -0
  64. package/dist/src/lib/messages/cantonSignTransaction/index.d.ts +3 -0
  65. package/dist/src/lib/messages/cantonSignTransaction/index.d.ts.map +1 -0
  66. package/dist/src/lib/messages/cantonSignTransaction/index.js +19 -0
  67. package/dist/src/lib/messages/index.d.ts +5 -0
  68. package/dist/src/lib/messages/index.d.ts.map +1 -0
  69. package/dist/src/lib/messages/index.js +21 -0
  70. package/dist/src/lib/messages/messageBuilderFactory.d.ts +7 -0
  71. package/dist/src/lib/messages/messageBuilderFactory.d.ts.map +1 -0
  72. package/dist/src/lib/messages/messageBuilderFactory.js +23 -0
  73. package/dist/src/lib/oneStepPreApprovalBuilder.d.ts +8 -0
  74. package/dist/src/lib/oneStepPreApprovalBuilder.d.ts.map +1 -1
  75. package/dist/src/lib/oneStepPreApprovalBuilder.js +15 -1
  76. package/dist/src/lib/resourcesInterface.d.ts +1 -1
  77. package/dist/src/lib/resourcesInterface.d.ts.map +1 -1
  78. package/dist/src/lib/resourcesInterface.js +1 -1
  79. package/dist/src/lib/transaction/transaction.d.ts +17 -1
  80. package/dist/src/lib/transaction/transaction.d.ts.map +1 -1
  81. package/dist/src/lib/transaction/transaction.js +307 -16
  82. package/dist/src/lib/transactionBuilderFactory.d.ts +22 -0
  83. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  84. package/dist/src/lib/transactionBuilderFactory.js +78 -1
  85. package/dist/src/lib/transferAcknowledgeBuilder.d.ts +4 -4
  86. package/dist/src/lib/transferAcknowledgeBuilder.d.ts.map +1 -1
  87. package/dist/src/lib/transferAcknowledgeBuilder.js +5 -7
  88. package/dist/src/lib/transferBuilder.d.ts +84 -2
  89. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  90. package/dist/src/lib/transferBuilder.js +164 -2
  91. package/dist/src/lib/transferOfferWithdrawnBuilder.d.ts +67 -0
  92. package/dist/src/lib/transferOfferWithdrawnBuilder.d.ts.map +1 -0
  93. package/dist/src/lib/transferOfferWithdrawnBuilder.js +130 -0
  94. package/dist/src/lib/transferPreapprovalCancelBuilder.d.ts +68 -0
  95. package/dist/src/lib/transferPreapprovalCancelBuilder.d.ts.map +1 -0
  96. package/dist/src/lib/transferPreapprovalCancelBuilder.js +124 -0
  97. package/dist/src/lib/utils.d.ts +45 -3
  98. package/dist/src/lib/utils.d.ts.map +1 -1
  99. package/dist/src/lib/utils.js +776 -66
  100. package/dist/src/lib/walletInitBuilder.d.ts +2 -1
  101. package/dist/src/lib/walletInitBuilder.d.ts.map +1 -1
  102. package/dist/src/lib/walletInitBuilder.js +4 -1
  103. package/dist/src/lib/walletInitialization/walletInitTransaction.d.ts +2 -1
  104. package/dist/src/lib/walletInitialization/walletInitTransaction.d.ts.map +1 -1
  105. package/dist/src/lib/walletInitialization/walletInitTransaction.js +14 -1
  106. package/dist/src/register.d.ts +2 -0
  107. package/dist/src/register.d.ts.map +1 -1
  108. package/dist/src/register.js +19 -2
  109. package/dist/test/helper.d.ts +3 -0
  110. package/dist/test/helper.d.ts.map +1 -0
  111. package/dist/test/helper.js +9 -0
  112. package/dist/test/integration/canton.integration.d.ts +2 -0
  113. package/dist/test/integration/canton.integration.d.ts.map +1 -0
  114. package/dist/test/integration/canton.integration.js +157 -0
  115. package/dist/test/integration/canton.token.integration.d.ts +2 -0
  116. package/dist/test/integration/canton.token.integration.d.ts.map +1 -0
  117. package/dist/test/integration/canton.token.integration.js +51 -0
  118. package/dist/test/resources.d.ts +263 -2
  119. package/dist/test/resources.d.ts.map +1 -1
  120. package/dist/test/resources.js +269 -7
  121. package/dist/test/unit/builder/allocationAllocate/allocationAllocateBuilder.d.ts +2 -0
  122. package/dist/test/unit/builder/allocationAllocate/allocationAllocateBuilder.d.ts.map +1 -0
  123. package/dist/test/unit/builder/allocationAllocate/allocationAllocateBuilder.js +368 -0
  124. package/dist/test/unit/builder/allocationAllocateWithdrawn/allocationAllocateWithdrawnBuilder.d.ts +2 -0
  125. package/dist/test/unit/builder/allocationAllocateWithdrawn/allocationAllocateWithdrawnBuilder.d.ts.map +1 -0
  126. package/dist/test/unit/builder/allocationAllocateWithdrawn/allocationAllocateWithdrawnBuilder.js +133 -0
  127. package/dist/test/unit/builder/allocationReject/allocationRejectBuilder.d.ts +2 -0
  128. package/dist/test/unit/builder/allocationReject/allocationRejectBuilder.d.ts.map +1 -0
  129. package/dist/test/unit/builder/allocationReject/allocationRejectBuilder.js +121 -0
  130. package/dist/test/unit/builder/allocationRequest/allocationRequestBuilder.d.ts +2 -0
  131. package/dist/test/unit/builder/allocationRequest/allocationRequestBuilder.d.ts.map +1 -0
  132. package/dist/test/unit/builder/allocationRequest/allocationRequestBuilder.js +437 -0
  133. package/dist/test/unit/builder/cantonCommand/cantonCommandBuilder.d.ts +2 -0
  134. package/dist/test/unit/builder/cantonCommand/cantonCommandBuilder.d.ts.map +1 -0
  135. package/dist/test/unit/builder/cantonCommand/cantonCommandBuilder.js +340 -0
  136. package/dist/test/unit/builder/cosignDelegationAccept/cosignDelegationAcceptBuilder.d.ts +2 -0
  137. package/dist/test/unit/builder/cosignDelegationAccept/cosignDelegationAcceptBuilder.d.ts.map +1 -0
  138. package/dist/test/unit/builder/cosignDelegationAccept/cosignDelegationAcceptBuilder.js +116 -0
  139. package/dist/test/unit/builder/cosignDelegationProposal/cosignDelegationProposalBuilder.d.ts +2 -0
  140. package/dist/test/unit/builder/cosignDelegationProposal/cosignDelegationProposalBuilder.d.ts.map +1 -0
  141. package/dist/test/unit/builder/cosignDelegationProposal/cosignDelegationProposalBuilder.js +74 -0
  142. package/dist/test/unit/builder/endInvestorOnboardingOffer/endInvestorOnboardingOfferBuilder.d.ts +2 -0
  143. package/dist/test/unit/builder/endInvestorOnboardingOffer/endInvestorOnboardingOfferBuilder.d.ts.map +1 -0
  144. package/dist/test/unit/builder/endInvestorOnboardingOffer/endInvestorOnboardingOfferBuilder.js +116 -0
  145. package/dist/test/unit/builder/oneStepEnablement/oneStepEnablementBuilder.js +20 -1
  146. package/dist/test/unit/builder/transfer/transferBuilder.d.ts +2 -0
  147. package/dist/test/unit/builder/transfer/transferBuilder.d.ts.map +1 -0
  148. package/dist/test/unit/builder/transfer/transferBuilder.js +100 -0
  149. package/dist/test/unit/builder/transferAccept/transferAcceptBuilder.js +65 -1
  150. package/dist/test/unit/builder/transferAcknowledge/transferAcknowledgeBuilder.js +34 -1
  151. package/dist/test/unit/builder/transferOfferWithdrawn/transferOfferWithdrawnBuilder.d.ts +2 -0
  152. package/dist/test/unit/builder/transferOfferWithdrawn/transferOfferWithdrawnBuilder.d.ts.map +1 -0
  153. package/dist/test/unit/builder/transferOfferWithdrawn/transferOfferWithdrawnBuilder.js +64 -0
  154. package/dist/test/unit/builder/transferPreapprovalCancel/transferPreapprovalCancelBuilder.d.ts +2 -0
  155. package/dist/test/unit/builder/transferPreapprovalCancel/transferPreapprovalCancelBuilder.d.ts.map +1 -0
  156. package/dist/test/unit/builder/transferPreapprovalCancel/transferPreapprovalCancelBuilder.js +74 -0
  157. package/dist/test/unit/builder/transferReject/transferRejectBuilder.js +41 -1
  158. package/dist/test/unit/canton.d.ts +2 -0
  159. package/dist/test/unit/canton.d.ts.map +1 -0
  160. package/dist/test/unit/canton.js +853 -0
  161. package/dist/test/unit/index.d.ts +5 -0
  162. package/dist/test/unit/index.d.ts.map +1 -1
  163. package/dist/test/unit/index.js +6 -1
  164. package/dist/test/unit/messages/cantonSignTopologyMessage.d.ts +2 -0
  165. package/dist/test/unit/messages/cantonSignTopologyMessage.d.ts.map +1 -0
  166. package/dist/test/unit/messages/cantonSignTopologyMessage.js +46 -0
  167. package/dist/test/unit/messages/cantonSignTransactionMessage.d.ts +2 -0
  168. package/dist/test/unit/messages/cantonSignTransactionMessage.d.ts.map +1 -0
  169. package/dist/test/unit/messages/cantonSignTransactionMessage.js +48 -0
  170. package/dist/test/unit/messages/clearSigning.d.ts +2 -0
  171. package/dist/test/unit/messages/clearSigning.d.ts.map +1 -0
  172. package/dist/test/unit/messages/clearSigning.js +72 -0
  173. package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
  174. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  175. package/dist/test/unit/messages/messageBuilderFactory.js +52 -0
  176. package/dist/test/unit/register.d.ts +2 -0
  177. package/dist/test/unit/register.d.ts.map +1 -0
  178. package/dist/test/unit/register.js +65 -0
  179. package/dist/test/unit/utils.js +389 -9
  180. package/dist/tsconfig.tsbuildinfo +1 -1
  181. package/package.json +8 -8
@@ -5,31 +5,92 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const assert_1 = __importDefault(require("assert"));
7
7
  const should_1 = __importDefault(require("should"));
8
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
9
  const utils_1 = __importDefault(require("../../src/lib/utils"));
9
10
  const resources_1 = require("../resources");
10
11
  describe('Canton Util', function () {
11
12
  describe('Raw transaction parser', function () {
12
13
  it('should parse the prepared transaction', () => {
13
- const parsedData = utils_1.default.parseRawCantonTransactionData(resources_1.PreparedTransactionRawData);
14
+ const parsedData = utils_1.default.parseRawCantonTransactionData(resources_1.PreparedTransactionRawData, sdk_core_1.TransactionType.Send);
14
15
  should_1.default.exist(parsedData);
15
16
  assert_1.default.equal(parsedData.sender, 'abc-1::12200c1ee226fbdf9fba3461c2c0c73331b69d3c6fd8cfce28cdf864141141cc656d');
16
17
  assert_1.default.equal(parsedData.receiver, 'abc-2::12207e96ada18a845adf4dc01410265633d5266dca9bb280c98e35c3692db87d3e35');
17
- assert_1.default.equal(parsedData.amount, '20.0000000000');
18
+ assert_1.default.equal(parsedData.amount, '200000000000');
19
+ });
20
+ it('should parse the prepared transaction with memo id field', function () {
21
+ const parsedData = utils_1.default.parseRawCantonTransactionData(resources_1.PreparedTransactionWithMemo, sdk_core_1.TransactionType.Send);
22
+ should_1.default.exist(parsedData);
23
+ assert_1.default.equal(parsedData.sender, '1220b::1220bab6ef3eec37b1b3816099befe72b43bf6c1380077d6349254c41ffb7f7753bb');
24
+ assert_1.default.equal(parsedData.receiver, '1220a::1220ade60300cf7d0b18ffaa2ffe4f492ad1ad601cfc162b20f77ec99d16c2c2f158');
25
+ assert_1.default.equal(parsedData.amount, '1000000000');
26
+ assert_1.default.equal(parsedData.memoId, '11');
27
+ });
28
+ it('should parse correctly when receiver is on 2-step', () => {
29
+ const parsedData = utils_1.default.parseRawCantonTransactionData(resources_1.PreparedTxn2StepReceiver, sdk_core_1.TransactionType.Send);
30
+ should_1.default.exist(parsedData);
31
+ assert_1.default.equal(parsedData.sender, '1220a::1220ade60300cf7d0b18ffaa2ffe4f492ad1ad601cfc162b20f77ec99d16c2c2f158');
32
+ assert_1.default.equal(parsedData.receiver, 'ravi-test-party-1::122092e7d33ac10c0f3d55976342f37555df05da5b742956d56a62ae2367769079d2');
33
+ assert_1.default.equal(parsedData.amount, '20000000000');
34
+ });
35
+ it('should parse correctly 1', () => {
36
+ const parsedData = utils_1.default.parseRawCantonTransactionData(resources_1.PreparedTxn1StepReceiver, sdk_core_1.TransactionType.Send);
37
+ should_1.default.exist(parsedData);
38
+ assert_1.default.equal(parsedData.sender, '1220a::1220ade60300cf7d0b18ffaa2ffe4f492ad1ad601cfc162b20f77ec99d16c2c2f158');
39
+ assert_1.default.equal(parsedData.receiver, 'ravi-demo-party-txn-01-tapper::1220ea7ab5a723f8a6b2078e617e6c58cb7e78e49947ddc239e1a941aa56e6ba08b4');
40
+ assert_1.default.equal(parsedData.amount, '20000000000');
18
41
  });
19
42
  it('should parse the acceptance prepared transaction', () => {
20
- const parsedData = utils_1.default.parseRawCantonTransactionData(resources_1.TransferAcceptancePrepareResponse.preparedTransaction);
43
+ const parsedData = utils_1.default.parseRawCantonTransactionData(resources_1.TransferAcceptancePrepareResponse.preparedTransaction, sdk_core_1.TransactionType.TransferAccept);
21
44
  should_1.default.exist(parsedData);
22
45
  assert_1.default.equal(parsedData.sender, 'DSO::1220be58c29e65de40bf273be1dc2b266d43a9a002ea5b18955aeef7aac881bb471a');
23
- assert_1.default.equal(parsedData.receiver, 'ravi-demo-party-txn-01-tapper::1220ea7ab5a723f8a6b2078e617e6c58cb7e78e49947ddc239e1a941aa56e6ba08b4');
24
- assert_1.default.equal(parsedData.amount, '5.0000000000');
46
+ assert_1.default.equal(parsedData.receiver, 'abcde::12205b4e3537a95126d90604592344d8ad3c3ddccda4f79901954280ee19c576714d');
47
+ assert_1.default.equal(parsedData.amount, '50000000000');
48
+ });
49
+ it('should parse the Temple cosign delegation acceptance prepared transaction', () => {
50
+ const parsedData = utils_1.default.parseRawCantonTransactionData(resources_1.CosignDelegationAcceptTemplePrepareResponse.preparedTransaction, sdk_core_1.TransactionType.CosignDelegationAccept);
51
+ should_1.default.exist(parsedData);
52
+ assert_1.default.equal(parsedData.sender, 'ravi-2-step-party::122092e7d33ac10c0f3d55976342f37555df05da5b742956d56a62ae2367769079d2');
53
+ assert_1.default.equal(parsedData.receiver, 'test-delegation::122092e7d33ac10c0f3d55976342f37555df05da5b742956d56a62ae2367769079d2');
54
+ assert_1.default.equal(parsedData.amount, '0');
55
+ });
56
+ it('should parse the rejection prepared transaction', () => {
57
+ const parsedData = utils_1.default.parseRawCantonTransactionData(resources_1.TransferRejectionPrepareResponse.preparedTransaction, sdk_core_1.TransactionType.TransferReject);
58
+ should_1.default.exist(parsedData);
59
+ assert_1.default.equal(parsedData.sender, 'DSO::1220be58c29e65de40bf273be1dc2b266d43a9a002ea5b18955aeef7aac881bb471a');
60
+ assert_1.default.equal(parsedData.receiver, '12201::122038402cf1650876d2920d6047b11a4aaf0de7b428e9916009cba2a22b1ae22c1a');
61
+ assert_1.default.equal(parsedData.amount, '50000000000');
25
62
  });
26
63
  it('should parse the one-step preapproval prepared transaction', () => {
27
- const parsedData = utils_1.default.parseRawCantonTransactionData(resources_1.OneStepPreApprovalPrepareResponse.preparedTransaction);
64
+ const parsedData = utils_1.default.parseRawCantonTransactionData(resources_1.OneStepPreApprovalPrepareResponse.preparedTransaction, sdk_core_1.TransactionType.OneStepPreApproval);
28
65
  should_1.default.exist(parsedData);
29
66
  assert_1.default.equal(parsedData.sender, 'Bitgo-devnet-validator-1::1220a0a0f60b0e62b5d750c484b18c091dba23080c133d944614ba75a5858cba3045');
30
67
  assert_1.default.equal(parsedData.receiver, 'ravi-test-party-1::12205b4e3537a95126d90604592344d8ad3c3ddccda4f79901954280ee19c576714d');
31
68
  assert_1.default.equal(parsedData.amount, '0');
32
69
  });
70
+ it('should parse the coin TransferPreapproval_Cancel prepared transaction', () => {
71
+ const parsedData = utils_1.default.parseRawCantonTransactionData(resources_1.CoinTransferPreapprovalCancelPrepareResponse.preparedTransaction, sdk_core_1.TransactionType.TransferPreapprovalCancel);
72
+ should_1.default.exist(parsedData);
73
+ const party = 'ravi-testnet-party::122092e7d33ac10c0f3d55976342f37555df05da5b742956d56a62ae2367769079d2';
74
+ assert_1.default.equal(parsedData.sender, party);
75
+ assert_1.default.equal(parsedData.receiver, party);
76
+ assert_1.default.equal(parsedData.amount, '0');
77
+ });
78
+ it('should parse the token TransferPreapproval Archive (cancel) prepared transaction', () => {
79
+ const parsedData = utils_1.default.parseRawCantonTransactionData(resources_1.TokenTransferPreapprovalCancelPrepareResponse.preparedTransaction, sdk_core_1.TransactionType.TransferPreapprovalCancel);
80
+ should_1.default.exist(parsedData);
81
+ const party = 'ravi-testnet-party::122092e7d33ac10c0f3d55976342f37555df05da5b742956d56a62ae2367769079d2';
82
+ assert_1.default.equal(parsedData.sender, party);
83
+ assert_1.default.equal(parsedData.receiver, party);
84
+ assert_1.default.equal(parsedData.amount, '0');
85
+ });
86
+ it('should parse the allocation allocate prepared transaction', () => {
87
+ const parsedData = utils_1.default.parseRawCantonTransactionData(resources_1.CantonAllocationAllocatePrepareResponse.preparedTransaction, sdk_core_1.TransactionType.AllocationAllocate);
88
+ should_1.default.exist(parsedData);
89
+ assert_1.default.equal(parsedData.sender, 'ravi-2-step-party::122092e7d33ac10c0f3d55976342f37555df05da5b742956d56a62ae2367769079d2');
90
+ // receiver = transferLeg.receiver from DvpLegAllocation — the actual settlement counterparty
91
+ assert_1.default.equal(parsedData.receiver, 'ravi-2-step-party-new::122092e7d33ac10c0f3d55976342f37555df05da5b742956d56a62ae2367769079d2');
92
+ assert_1.default.equal(parsedData.amount, '50000000000');
93
+ });
33
94
  });
34
95
  describe('Wallet init transaction', function () {
35
96
  it('should locally generate and validate the hash for topology transaction', function () {
@@ -52,9 +113,9 @@ describe('Canton Util', function () {
52
113
  assert_1.default.strictEqual(isValid, true);
53
114
  });
54
115
  it('should return false when party hint is invalid', function () {
55
- const isValid = utils_1.default.isValidAddress(resources_1.CANTON_ADDRESSES.INVALID_PARTY_HINT);
116
+ const isValid = utils_1.default.isValidAddress(resources_1.CANTON_ADDRESSES.VALID_PARTY_HINT);
56
117
  should_1.default.exist(isValid);
57
- assert_1.default.strictEqual(isValid, false);
118
+ assert_1.default.strictEqual(isValid, true);
58
119
  });
59
120
  it('should return false when fingerprint is invalid', function () {
60
121
  const isValid = utils_1.default.isValidAddress(resources_1.CANTON_ADDRESSES.INVALID_FINGERPRINT);
@@ -71,6 +132,325 @@ describe('Canton Util', function () {
71
132
  should_1.default.exist(isValid);
72
133
  assert_1.default.strictEqual(isValid, false);
73
134
  });
135
+ it('should return true when memo id is valid', function () {
136
+ const isValid = utils_1.default.isValidAddress(resources_1.CANTON_ADDRESSES.VALID_MEMO_ID);
137
+ should_1.default.exist(isValid);
138
+ assert_1.default.strictEqual(isValid, true);
139
+ });
140
+ });
141
+ describe('Check if block hash is valid', function () {
142
+ it('should return true when the block hash is valid', function () {
143
+ const isValid = utils_1.default.isValidBlockId(resources_1.CANTON_BLOCK_HEIGHT.VALID_HASH);
144
+ should_1.default.exist(isValid);
145
+ assert_1.default.strictEqual(isValid, true);
146
+ });
147
+ it('should return true when the block hash has version', function () {
148
+ const isValid = utils_1.default.isValidBlockId(resources_1.CANTON_BLOCK_HEIGHT.VALID_HASH_WITH_VERSION);
149
+ should_1.default.exist(isValid);
150
+ assert_1.default.strictEqual(isValid, true);
151
+ });
152
+ it('should return false when the block hash is not a number', function () {
153
+ const isValid = utils_1.default.isValidBlockId(resources_1.CANTON_BLOCK_HEIGHT.INVALID_BLOCK_HASH);
154
+ should_1.default.exist(isValid);
155
+ assert_1.default.strictEqual(isValid, false);
156
+ });
157
+ it('should return false when the block hash is negative', function () {
158
+ const isValid = utils_1.default.isValidBlockId(resources_1.CANTON_BLOCK_HEIGHT.NEGATIVE_BLOCK_HASH);
159
+ should_1.default.exist(isValid);
160
+ assert_1.default.strictEqual(isValid, false);
161
+ });
162
+ });
163
+ });
164
+ describe('Canton Utils - CantonCommand helpers', function () {
165
+ describe('parseCantonTemplateId', function () {
166
+ it('should parse valid "Pkg:Module:Entity" format', function () {
167
+ const result = utils_1.default.parseCantonTemplateId('abc123:Utility.Registry.App.V0.Service.AllocationFactory:AllocationFactory');
168
+ should_1.default.exist(result);
169
+ assert_1.default.equal(result.pkg, 'abc123');
170
+ assert_1.default.equal(result.moduleName, 'Utility.Registry.App.V0.Service.AllocationFactory');
171
+ assert_1.default.equal(result.entityName, 'AllocationFactory');
172
+ });
173
+ it('should return undefined for non-string input', function () {
174
+ const result = utils_1.default.parseCantonTemplateId(123);
175
+ assert_1.default.equal(result, undefined);
176
+ });
177
+ it('should return undefined for wrong number of parts', function () {
178
+ const result = utils_1.default.parseCantonTemplateId('PkgOnly');
179
+ assert_1.default.equal(result, undefined);
180
+ });
181
+ it('should return undefined for empty parts', function () {
182
+ const result = utils_1.default.parseCantonTemplateId(':Module:Entity');
183
+ assert_1.default.equal(result, undefined);
184
+ });
185
+ it('should return undefined for string with only 2 parts', function () {
186
+ const result = utils_1.default.parseCantonTemplateId('Pkg:Module');
187
+ assert_1.default.equal(result, undefined);
188
+ });
189
+ });
190
+ describe('damlValueToJson', function () {
191
+ it('should return undefined for undefined input', function () {
192
+ const result = utils_1.default.damlValueToJson(undefined);
193
+ assert_1.default.equal(result, undefined);
194
+ });
195
+ it('should convert unit to null', function () {
196
+ const val = { sum: { oneofKind: 'unit', unit: {} } };
197
+ assert_1.default.equal(utils_1.default.damlValueToJson(val), null);
198
+ });
199
+ it('should convert bool correctly', function () {
200
+ const val = { sum: { oneofKind: 'bool', bool: true } };
201
+ assert_1.default.equal(utils_1.default.damlValueToJson(val), true);
202
+ });
203
+ it('should convert text correctly', function () {
204
+ const val = { sum: { oneofKind: 'text', text: 'hello' } };
205
+ assert_1.default.equal(utils_1.default.damlValueToJson(val), 'hello');
206
+ });
207
+ it('should convert contractId correctly', function () {
208
+ const val = { sum: { oneofKind: 'contractId', contractId: '00abc' } };
209
+ assert_1.default.equal(utils_1.default.damlValueToJson(val), '00abc');
210
+ });
211
+ it('should convert party correctly', function () {
212
+ const val = { sum: { oneofKind: 'party', party: 'Alice::1234' } };
213
+ assert_1.default.equal(utils_1.default.damlValueToJson(val), 'Alice::1234');
214
+ });
215
+ it('should convert numeric correctly', function () {
216
+ const val = { sum: { oneofKind: 'numeric', numeric: '100.0000000000' } };
217
+ assert_1.default.equal(utils_1.default.damlValueToJson(val), '100.0000000000');
218
+ });
219
+ it('should convert optional with value', function () {
220
+ const val = {
221
+ sum: {
222
+ oneofKind: 'optional',
223
+ optional: { value: { sum: { oneofKind: 'text', text: 'inner' } } },
224
+ },
225
+ };
226
+ assert_1.default.equal(utils_1.default.damlValueToJson(val), 'inner');
227
+ });
228
+ it('should convert optional without value to null', function () {
229
+ const val = { sum: { oneofKind: 'optional', optional: {} } };
230
+ assert_1.default.equal(utils_1.default.damlValueToJson(val), null);
231
+ });
232
+ it('should convert list to array', function () {
233
+ const val = {
234
+ sum: {
235
+ oneofKind: 'list',
236
+ list: {
237
+ elements: [{ sum: { oneofKind: 'text', text: 'a' } }, { sum: { oneofKind: 'text', text: 'b' } }],
238
+ },
239
+ },
240
+ };
241
+ assert_1.default.deepEqual(utils_1.default.damlValueToJson(val), ['a', 'b']);
242
+ });
243
+ it('should convert textMap to object', function () {
244
+ const val = {
245
+ sum: {
246
+ oneofKind: 'textMap',
247
+ textMap: {
248
+ entries: [
249
+ { key: 'k1', value: { sum: { oneofKind: 'text', text: 'v1' } } },
250
+ { key: 'k2', value: { sum: { oneofKind: 'bool', bool: false } } },
251
+ ],
252
+ },
253
+ },
254
+ };
255
+ assert_1.default.deepEqual(utils_1.default.damlValueToJson(val), { k1: 'v1', k2: false });
256
+ });
257
+ it('should convert record to object with label keys', function () {
258
+ const val = {
259
+ sum: {
260
+ oneofKind: 'record',
261
+ record: {
262
+ fields: [
263
+ { label: 'name', value: { sum: { oneofKind: 'text', text: 'Alice' } } },
264
+ { label: 'age', value: { sum: { oneofKind: 'int64', int64: '30' } } },
265
+ ],
266
+ },
267
+ },
268
+ };
269
+ assert_1.default.deepEqual(utils_1.default.damlValueToJson(val), { name: 'Alice', age: '30' });
270
+ });
271
+ it('should convert variant to keyed object', function () {
272
+ const val = {
273
+ sum: {
274
+ oneofKind: 'variant',
275
+ variant: {
276
+ constructor: 'Some',
277
+ value: { sum: { oneofKind: 'text', text: 'v' } },
278
+ },
279
+ },
280
+ };
281
+ assert_1.default.deepEqual(utils_1.default.damlValueToJson(val), { Some: 'v' });
282
+ });
283
+ it('should convert enum to string', function () {
284
+ const val = {
285
+ sum: {
286
+ oneofKind: 'enum',
287
+ enum: { constructor: 'Active' },
288
+ },
289
+ };
290
+ assert_1.default.equal(utils_1.default.damlValueToJson(val), 'Active');
291
+ });
292
+ });
293
+ describe('extractSubmitterActAs', function () {
294
+ it('should extract actAs from real PreparedTransaction', function () {
295
+ const actAs = utils_1.default.extractSubmitterActAs(resources_1.CantonExerciseCommandPrepareResponse.preparedTransaction);
296
+ should_1.default.exist(actAs);
297
+ assert_1.default.ok(Array.isArray(actAs));
298
+ assert_1.default.equal(actAs.length, 1);
299
+ assert_1.default.equal(actAs[0], 'RegRegistrar::1220508e54fb709dcb1a9b4096408ad415d2217d8881ad9034a9850752933ba88ad5');
300
+ });
301
+ });
302
+ describe('extractCantonCommandInfo', function () {
303
+ it('should extract ExerciseCommand info correctly', function () {
304
+ const info = utils_1.default.extractCantonCommandInfo(resources_1.CantonExerciseCommandPrepareResponse.preparedTransaction);
305
+ should_1.default.exist(info);
306
+ assert_1.default.equal(info.kind, 'ExerciseCommand');
307
+ assert_1.default.equal(info.templateId.moduleName, 'Utility.Registry.App.V0.Service.AllocationFactory');
308
+ assert_1.default.equal(info.templateId.entityName, 'AllocationFactory');
309
+ assert_1.default.equal(info.choice, 'AllocationFactory_OfferMint');
310
+ should_1.default.exist(info.contractId);
311
+ should_1.default.exist(info.actingParties);
312
+ });
313
+ });
314
+ describe('sameElements', function () {
315
+ it('should return true for identical arrays', function () {
316
+ assert_1.default.equal(utils_1.default.sameElements(['a', 'b', 'c'], ['a', 'b', 'c']), true);
317
+ });
318
+ it('should return true for same elements in different order', function () {
319
+ assert_1.default.equal(utils_1.default.sameElements(['c', 'a', 'b'], ['a', 'b', 'c']), true);
320
+ });
321
+ it('should return false for different lengths', function () {
322
+ assert_1.default.equal(utils_1.default.sameElements(['a', 'b'], ['a', 'b', 'c']), false);
323
+ });
324
+ it('should return false for different elements', function () {
325
+ assert_1.default.equal(utils_1.default.sameElements(['a', 'b', 'x'], ['a', 'b', 'c']), false);
326
+ });
327
+ it('should return true for empty arrays', function () {
328
+ assert_1.default.equal(utils_1.default.sameElements([], []), true);
329
+ });
330
+ it('should return false when one array has duplicates the other does not', function () {
331
+ assert_1.default.equal(utils_1.default.sameElements(['x', 'x'], ['x', 'y']), false);
332
+ });
333
+ });
334
+ describe('normalizeInjectAs', function () {
335
+ it('should strip "command." prefix from injectAs paths', function () {
336
+ const specs = [{ injectAs: 'command.ExerciseCommand.contractId' }];
337
+ const result = utils_1.default.normalizeInjectAs(specs);
338
+ assert_1.default.ok(result.has('ExerciseCommand.contractId'));
339
+ assert_1.default.ok(!result.has('command.ExerciseCommand.contractId'));
340
+ });
341
+ it('should handle specs with empty injectAs field', function () {
342
+ const result = utils_1.default.normalizeInjectAs([{ injectAs: '' }]);
343
+ assert_1.default.equal(result.size, 0);
344
+ });
345
+ it('should handle empty specs array', function () {
346
+ const result = utils_1.default.normalizeInjectAs([]);
347
+ assert_1.default.equal(result.size, 0);
348
+ });
349
+ it('should handle undefined specs', function () {
350
+ const result = utils_1.default.normalizeInjectAs(undefined);
351
+ assert_1.default.equal(result.size, 0);
352
+ });
353
+ it('should preserve paths that do not start with "command."', function () {
354
+ const specs = [{ injectAs: 'ExerciseCommand.contractId' }];
355
+ const result = utils_1.default.normalizeInjectAs(specs);
356
+ assert_1.default.ok(result.has('ExerciseCommand.contractId'));
357
+ });
358
+ });
359
+ describe('assertDeepCantonMatch', function () {
360
+ const noInject = new Set();
361
+ it('should pass for matching primitives', function () {
362
+ assert_1.default.doesNotThrow(() => utils_1.default.assertDeepCantonMatch('hello', 'hello', noInject));
363
+ assert_1.default.doesNotThrow(() => utils_1.default.assertDeepCantonMatch(42, 42, noInject));
364
+ assert_1.default.doesNotThrow(() => utils_1.default.assertDeepCantonMatch(true, true, noInject));
365
+ });
366
+ it('should pass for matching objects', function () {
367
+ assert_1.default.doesNotThrow(() => utils_1.default.assertDeepCantonMatch({ a: 'x', b: 'y' }, { a: 'x', b: 'y', extra: 'z' }, noInject));
368
+ });
369
+ it('should allow extra fields in actual that user did not specify', function () {
370
+ assert_1.default.doesNotThrow(() => utils_1.default.assertDeepCantonMatch({ name: 'Alice' }, { name: 'Alice', timestamp: '2024-01-01', hash: 'abc' }, noInject));
371
+ });
372
+ it('should pass for matching arrays', function () {
373
+ assert_1.default.doesNotThrow(() => utils_1.default.assertDeepCantonMatch(['a', 'b'], ['a', 'b'], noInject));
374
+ });
375
+ it('should skip paths in injectAsPaths', function () {
376
+ const injectPaths = new Set(['ExerciseCommand.contractId']);
377
+ assert_1.default.doesNotThrow(() => utils_1.default.assertDeepCantonMatch({ ExerciseCommand: { contractId: undefined, choice: 'Foo' } }, { ExerciseCommand: { contractId: '00abc', choice: 'Foo' } }, injectPaths));
378
+ });
379
+ it('should skip undefined expected values', function () {
380
+ assert_1.default.doesNotThrow(() => utils_1.default.assertDeepCantonMatch(undefined, 'anything', noInject));
381
+ });
382
+ it('should verify empty object {} against actual (not skip)', function () {
383
+ assert_1.default.doesNotThrow(() => utils_1.default.assertDeepCantonMatch({}, {}, noInject));
384
+ assert_1.default.doesNotThrow(() => utils_1.default.assertDeepCantonMatch({}, { extra: 'field' }, noInject));
385
+ });
386
+ it('should verify empty array [] against actual (not skip)', function () {
387
+ assert_1.default.doesNotThrow(() => utils_1.default.assertDeepCantonMatch([], [], noInject));
388
+ assert_1.default.throws(() => utils_1.default.assertDeepCantonMatch([], ['a'], noInject), /list-length mismatch/);
389
+ });
390
+ it('should compare numeric strings with BigNumber equivalence', function () {
391
+ assert_1.default.doesNotThrow(() => utils_1.default.assertDeepCantonMatch('100', '100.0000000000', noInject));
392
+ });
393
+ it('should throw on primitive mismatch', function () {
394
+ assert_1.default.throws(() => utils_1.default.assertDeepCantonMatch('hello', 'world', noInject), /mismatch/);
395
+ });
396
+ it('should throw on array length mismatch', function () {
397
+ assert_1.default.throws(() => utils_1.default.assertDeepCantonMatch(['a', 'b'], ['a'], noInject), /list-length mismatch/);
398
+ });
399
+ it('should throw on missing field (user specified but not in actual)', function () {
400
+ assert_1.default.throws(() => utils_1.default.assertDeepCantonMatch({ required: 'val' }, { other: 'val' }, noInject), /missing field/);
401
+ });
402
+ it('should throw on type mismatch', function () {
403
+ assert_1.default.throws(() => utils_1.default.assertDeepCantonMatch({ a: 'str' }, { a: 42 }, noInject), /mismatch/);
404
+ });
405
+ describe('ISO timestamp vs microsecond string normalisation', function () {
406
+ const isoTs = '2026-06-12T10:00:00.000Z';
407
+ const isoTsUs = String(new Date(isoTs).getTime() * 1000);
408
+ it('should pass when ISO timestamp (expected) equals microseconds (actual)', function () {
409
+ assert_1.default.doesNotThrow(() => utils_1.default.assertDeepCantonMatch(isoTs, isoTsUs, noInject));
410
+ });
411
+ it('should throw timestamp mismatch when microseconds do not correspond to the ISO value', function () {
412
+ const wrongUs = String(new Date(isoTs).getTime() * 1000 + 1000000);
413
+ assert_1.default.throws(() => utils_1.default.assertDeepCantonMatch(isoTs, wrongUs, noInject), /timestamp mismatch/);
414
+ });
415
+ it('should pass for ISO timestamp nested inside a mint-like choiceArgument object', function () {
416
+ const executeBefore = '2026-06-13T10:00:00.000Z';
417
+ const executeBeforeUs = String(new Date(executeBefore).getTime() * 1000);
418
+ const expected = {
419
+ expectedAdmin: 'registrar::1220abc',
420
+ mint: {
421
+ instrumentId: { admin: 'registrar::1220abc', id: 'STGUSD1' },
422
+ amount: '1000000.0',
423
+ holder: 'registrar::1220abc',
424
+ reference: 'mint-stgusd1-12345',
425
+ requestedAt: isoTs,
426
+ executeBefore: executeBefore,
427
+ meta: { values: {} },
428
+ },
429
+ };
430
+ const actual = {
431
+ expectedAdmin: 'registrar::1220abc',
432
+ mint: {
433
+ instrumentId: { admin: 'registrar::1220abc', id: 'STGUSD1' },
434
+ amount: '1000000.0000000000',
435
+ holder: 'registrar::1220abc',
436
+ reference: 'mint-stgusd1-12345',
437
+ requestedAt: isoTsUs,
438
+ executeBefore: executeBeforeUs,
439
+ meta: { values: {} },
440
+ },
441
+ };
442
+ assert_1.default.doesNotThrow(() => utils_1.default.assertDeepCantonMatch(expected, actual, noInject));
443
+ });
444
+ it('should throw when ISO timestamp in nested object does not match microseconds', function () {
445
+ const wrongUs = String(new Date(isoTs).getTime() * 1000 + 5000000);
446
+ const expected = { mint: { requestedAt: isoTs } };
447
+ const actual = { mint: { requestedAt: wrongUs } };
448
+ assert_1.default.throws(() => utils_1.default.assertDeepCantonMatch(expected, actual, noInject), /timestamp mismatch/);
449
+ });
450
+ it('should not treat an arbitrary non-timestamp ISO-like string as a timestamp', function () {
451
+ assert_1.default.throws(() => utils_1.default.assertDeepCantonMatch('not-a-timestamp', isoTsUs, noInject), /mismatch/);
452
+ });
453
+ });
74
454
  });
75
455
  });
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBQzVCLGdFQUF3QztBQUN4Qyw0Q0FPc0I7QUFFdEIsUUFBUSxDQUFDLGFBQWEsRUFBRTtJQUN0QixRQUFRLENBQUMsd0JBQXdCLEVBQUU7UUFDakMsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtZQUMvQyxNQUFNLFVBQVUsR0FBRyxlQUFLLENBQUMsNkJBQTZCLENBQUMsc0NBQTBCLENBQUMsQ0FBQztZQUNuRixnQkFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN6QixnQkFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLDZFQUE2RSxDQUFDLENBQUM7WUFDL0csZ0JBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSw2RUFBNkUsQ0FBQyxDQUFDO1lBQ2pILGdCQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUUsR0FBRyxFQUFFO1lBQzFELE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyw2QkFBNkIsQ0FBQyw2Q0FBaUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzlHLGdCQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pCLGdCQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsMkVBQTJFLENBQUMsQ0FBQztZQUM3RyxnQkFBTSxDQUFDLEtBQUssQ0FDVixVQUFVLENBQUMsUUFBUSxFQUNuQixxR0FBcUcsQ0FDdEcsQ0FBQztZQUNGLGdCQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUs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QUFXLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlEQUFpRCxFQUFFO1lBQ3BELE1BQU0sT0FBTyxHQUFHLGVBQUssQ0FBQyxjQUFjLENBQUMsNEJBQWdCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUMzRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHtcbiAgQ0FOVE9OX0FERFJFU1NFUyxcbiAgR2VuZXJhdGVUb3BvbG9neVJlc3BvbnNlLFxuICBPbmVTdGVwUHJlQXBwcm92YWxQcmVwYXJlUmVzcG9uc2UsXG4gIFByZXBhcmVkVHJhbnNhY3Rpb25SYXdEYXRhLFxuICBQcmVwYXJlU3VibWlzc2lvblJlc3BvbnNlLFxuICBUcmFuc2ZlckFjY2VwdGFuY2VQcmVwYXJlUmVzcG9uc2UsXG59IGZyb20gJy4uL3Jlc291cmNlcyc7XG5cbmRlc2NyaWJlKCdDYW50b24gVXRpbCcsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ1JhdyB0cmFuc2FjdGlvbiBwYXJzZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBwYXJzZSB0aGUgcHJlcGFyZWQgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXJzZWREYXRhID0gdXRpbHMucGFyc2VSYXdDYW50b25UcmFuc2FjdGlvbkRhdGEoUHJlcGFyZWRUcmFuc2FjdGlvblJhd0RhdGEpO1xuICAgICAgc2hvdWxkLmV4aXN0KHBhcnNlZERhdGEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZERhdGEuc2VuZGVyLCAnYWJjLTE6OjEyMjAwYzFlZTIyNmZiZGY5ZmJhMzQ2MWMyYzBjNzMzMzFiNjlkM2M2ZmQ4Y2ZjZTI4Y2RmODY0MTQxMTQxY2M2NTZkJyk7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VkRGF0YS5yZWNlaXZlciwgJ2FiYy0yOjoxMjIwN2U5NmFkYTE4YTg0NWFkZjRkYzAxNDEwMjY1NjMzZDUyNjZkY2E5YmIyODBjOThlMzVjMzY5MmRiODdkM2UzNScpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZERhdGEuYW1vdW50LCAnMjAuMDAwMDAwMDAwMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSB0aGUgYWNjZXB0YW5jZSBwcmVwYXJlZCB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB1dGlscy5wYXJzZVJhd0NhbnRvblRyYW5zYWN0aW9uRGF0YShUcmFuc2ZlckFjY2VwdGFuY2VQcmVwYXJlUmVzcG9uc2UucHJlcGFyZWRUcmFuc2FjdGlvbik7XG4gICAgICBzaG91bGQuZXhpc3QocGFyc2VkRGF0YSk7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VkRGF0YS5zZW5kZXIsICdEU086OjEyMjBiZTU4YzI5ZTY1ZGU0MGJmMjczYmUxZGMyYjI2NmQ0M2E5YTAwMmVhNWIxODk1NWFlZWY3YWFjODgxYmI0NzFhJyk7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIHBhcnNlZERhdGEucmVjZWl2ZXIsXG4gICAgICAgICdyYXZpLWRlbW8tcGFydHktdHhuLTAxLXRhcHBlcjo6MTIyMGVhN2FiNWE3MjNmOGE2YjIwNzhlNjE3ZTZjNThjYjdlNzhlNDk5NDdkZGMyMzllMWE5NDFhYTU2ZTZiYTA4YjQnXG4gICAgICApO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZERhdGEuYW1vdW50LCAnNS4wMDAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIHRoZSBvbmUtc3RlcCBwcmVhcHByb3ZhbCBwcmVwYXJlZCB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB1dGlscy5wYXJzZVJhd0NhbnRvblRyYW5zYWN0aW9uRGF0YShPbmVTdGVwUHJlQXBwcm92YWxQcmVwYXJlUmVzcG9uc2UucHJlcGFyZWRUcmFuc2FjdGlvbik7XG4gICAgICBzaG91bGQuZXhpc3QocGFyc2VkRGF0YSk7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIHBhcnNlZERhdGEuc2VuZGVyLFxuICAgICAgICAnQml0Z28tZGV2bmV0LXZhbGlkYXRvci0xOjoxMjIwYTBhMGY2MGIwZTYyYjVkNzUwYzQ4NGIxOGMwOTFkYmEyMzA4MGMxMzNkOTQ0NjE0YmE3NWE1ODU4Y2JhMzA0NSdcbiAgICAgICk7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIHBhcnNlZERhdGEucmVjZWl2ZXIsXG4gICAgICAgICdyYXZpLXRlc3QtcGFydHktMTo6MTIyMDViNGUzNTM3YTk1MTI2ZDkwNjA0NTkyMzQ0ZDhhZDNjM2RkY2NkYTRmNzk5MDE5NTQyODBlZTE5YzU3NjcxNGQnXG4gICAgICApO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZERhdGEuYW1vdW50LCAnMCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnV2FsbGV0IGluaXQgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBsb2NhbGx5IGdlbmVyYXRlIGFuZCB2YWxpZGF0ZSB0aGUgaGFzaCBmb3IgdG9wb2xvZ3kgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb21wdXRlZEhhc2ggPSB1dGlscy5jb21wdXRlSGFzaEZyb21DcmVhdGVQYXJ0eVJlc3BvbnNlKEdlbmVyYXRlVG9wb2xvZ3lSZXNwb25zZS50b3BvbG9neVRyYW5zYWN0aW9ucyk7XG4gICAgICBzaG91bGQuZXhpc3QoY29tcHV0ZWRIYXNoKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChjb21wdXRlZEhhc2gsIEdlbmVyYXRlVG9wb2xvZ3lSZXNwb25zZS5tdWx0aUhhc2gpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUHJlcGFyZSBzdWJtaXNzaW9uIHJlc3BvbnNlIHZhbGlkYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBsb2NhbGx5IGdlbmVyYXRlIGFuZCB2YWxpZGF0ZSB0aGUgaGFzaCBmb3IgcHJlcGFyZSBzdWJtaXNzaW9uIHJlc3BvbnNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY29tcHV0ZWRIYXNoID0gYXdhaXQgdXRpbHMuY29tcHV0ZUhhc2hGcm9tUHJlcGFyZVN1Ym1pc3Npb25SZXNwb25zZShcbiAgICAgICAgUHJlcGFyZVN1Ym1pc3Npb25SZXNwb25zZS5wcmVwYXJlZFRyYW5zYWN0aW9uXG4gICAgICApO1xuICAgICAgc2hvdWxkLmV4aXN0KGNvbXB1dGVkSGFzaCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY29tcHV0ZWRIYXNoLCBQcmVwYXJlU3VibWlzc2lvblJlc3BvbnNlLnByZXBhcmVkVHJhbnNhY3Rpb25IYXNoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0NoZWNrIGlmIHRoZSBhZGRyZXNzIGlzIHZhbGlkJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiB0aGUgYWRkcmVzcyBpcyB2YWxpZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB1dGlscy5pc1ZhbGlkQWRkcmVzcyhDQU5UT05fQUREUkVTU0VTLlZBTElEX0FERFJFU1MpO1xuICAgICAgc2hvdWxkLmV4aXN0KGlzVmFsaWQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzVmFsaWQsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBwYXJ0eSBoaW50IGlzIGludmFsaWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdXRpbHMuaXNWYWxpZEFkZHJlc3MoQ0FOVE9OX0FERFJFU1NFUy5JTlZBTElEX1BBUlRZX0hJTlQpO1xuICAgICAgc2hvdWxkLmV4aXN0KGlzVmFsaWQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzVmFsaWQsIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gZmluZ2VycHJpbnQgaXMgaW52YWxpZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB1dGlscy5pc1ZhbGlkQWRkcmVzcyhDQU5UT05fQUREUkVTU0VTLklOVkFMSURfRklOR0VSUFJJTlQpO1xuICAgICAgc2hvdWxkLmV4aXN0KGlzVmFsaWQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzVmFsaWQsIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gcGFydHkgaGludCBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHV0aWxzLmlzVmFsaWRBZGRyZXNzKENBTlRPTl9BRERSRVNTRVMuTUlTU0lOR19QQVJUWV9ISU5UKTtcbiAgICAgIHNob3VsZC5leGlzdChpc1ZhbGlkKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIGZpbmdlcnByaW50IGlzIG1pc3NpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdXRpbHMuaXNWYWxpZEFkZHJlc3MoQ0FOVE9OX0FERFJFU1NFUy5NSVNTSU5HX0ZJTkdFUlBSSU5UKTtcbiAgICAgIHNob3VsZC5leGlzdChpc1ZhbGlkKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
456
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQTRCO0FBRTVCLG1EQUF1RDtBQUV2RCxnRUFBd0M7QUFFeEMsNENBaUJzQjtBQUV0QixRQUFRLENBQUMsYUFBYSxFQUFFO0lBQ3RCLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRTtRQUNqQyxFQUFFLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxFQUFFO1lBQy9DLE1BQU0sVUFBVSxHQUFHLGVBQUssQ0FBQyw2QkFBNkIsQ0FBQyxzQ0FBMEIsRUFBRSwwQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pHLGdCQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pCLGdCQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsNkVBQTZFLENBQUMsQ0FBQztZQUMvRyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLDZFQUE2RSxDQUFDLENBQUM7WUFDakgsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwREFBMEQsRUFBRTtZQUM3RCxNQUFNLFVBQVUsR0FBRyxlQUFLLENBQUMsNkJBQTZCLENBQUMsdUNBQTJCLEVBQUUsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN6QixnQkFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLDZFQUE2RSxDQUFDLENBQUM7WUFDL0csZ0JBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSw2RUFBNkUsQ0FBQyxDQUFDO1lBQ2pILGdCQUFNLENB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O1lBQzVDLGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHlEQUF5RCxFQUFFO1lBQzVELGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJDQUEyQyxFQUFFO1lBQzlDLGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNENBQTRDLEVBQUU7WUFDL0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMscUNBQXFDLEVBQUU7WUFDeEMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0VBQXNF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QUFDLGVBQUssQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDckcsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgVmFsdWUgfSBmcm9tICcuLi8uLi9zcmMvbGliL3Jlc291cmNlc0ludGVyZmFjZSc7XG5pbXBvcnQge1xuICBDQU5UT05fQUREUkVTU0VTLFxuICBDQU5UT05fQkxPQ0tfSEVJR0hULFxuICBDYW50b25BbGxvY2F0aW9uQWxsb2NhdGVQcmVwYXJlUmVzcG9uc2UsXG4gIENhbnRvbkV4ZXJjaXNlQ29tbWFuZFByZXBhcmVSZXNwb25zZSxcbiAgQ29pblRyYW5zZmVyUHJlYXBwcm92YWxDYW5jZWxQcmVwYXJlUmVzcG9uc2UsXG4gIENvc2lnbkRlbGVnYXRpb25BY2NlcHRUZW1wbGVQcmVwYXJlUmVzcG9uc2UsXG4gIEdlbmVyYXRlVG9wb2xvZ3lSZXNwb25zZSxcbiAgT25lU3RlcFByZUFwcHJvdmFsUHJlcGFyZVJlc3BvbnNlLFxuICBQcmVwYXJlZFRyYW5zYWN0aW9uUmF3RGF0YSxcbiAgUHJlcGFyZWRUcmFuc2FjdGlvbldpdGhNZW1vLFxuICBQcmVwYXJlZFR4bjFTdGVwUmVjZWl2ZXIsXG4gIFByZXBhcmVkVHhuMlN0ZXBSZWNlaXZlcixcbiAgUHJlcGFyZVN1Ym1pc3Npb25SZXNwb25zZSxcbiAgVG9rZW5UcmFuc2ZlclByZWFwcHJvdmFsQ2FuY2VsUHJlcGFyZVJlc3BvbnNlLFxuICBUcmFuc2ZlckFjY2VwdGFuY2VQcmVwYXJlUmVzcG9uc2UsXG4gIFRyYW5zZmVyUmVqZWN0aW9uUHJlcGFyZVJlc3BvbnNlLFxufSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuXG5kZXNjcmliZSgnQ2FudG9uIFV0aWwnLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdSYXcgdHJhbnNhY3Rpb24gcGFyc2VyJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcGFyc2UgdGhlIHByZXBhcmVkIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IHV0aWxzLnBhcnNlUmF3Q2FudG9uVHJhbnNhY3Rpb25EYXRhKFByZXBhcmVkVHJhbnNhY3Rpb25SYXdEYXRhLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBzaG91bGQuZXhpc3QocGFyc2VkRGF0YSk7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VkRGF0YS5zZW5kZXIsICdhYmMtMTo6MTIyMDBjMWVlMjI2ZmJkZjlmYmEzNDYxYzJjMGM3MzMzMWI2OWQzYzZmZDhjZmNlMjhjZGY4NjQxNDExNDFjYzY1NmQnKTtcbiAgICAgIGFzc2VydC5lcXVhbChwYXJzZWREYXRhLnJlY2VpdmVyLCAnYWJjLTI6OjEyMjA3ZTk2YWRhMThhODQ1YWRmNGRjMDE0MTAyNjU2MzNkNTI2NmRjYTliYjI4MGM5OGUzNWMzNjkyZGI4N2QzZTM1Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VkRGF0YS5hbW91bnQsICcyMDAwMDAwMDAwMDAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgdGhlIHByZXBhcmVkIHRyYW5zYWN0aW9uIHdpdGggbWVtbyBpZCBmaWVsZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB1dGlscy5wYXJzZVJhd0NhbnRvblRyYW5zYWN0aW9uRGF0YShQcmVwYXJlZFRyYW5zYWN0aW9uV2l0aE1lbW8sIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHNob3VsZC5leGlzdChwYXJzZWREYXRhKTtcbiAgICAgIGFzc2VydC5lcXVhbChwYXJzZWREYXRhLnNlbmRlciwgJzEyMjBiOjoxMjIwYmFiNmVmM2VlYzM3YjFiMzgxNjA5OWJlZmU3MmI0M2JmNmMxMzgwMDc3ZDYzNDkyNTRjNDFmZmI3Zjc3NTNiYicpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZERhdGEucmVjZWl2ZXIsICcxMjIwYTo6MTIyMGFkZTYwMzAwY2Y3ZDBiMThmZmFhMmZmZTRmNDkyYWQxYWQ2MDFjZmMxNjJiMjBmNzdlYzk5ZDE2YzJjMmYxNTgnKTtcbiAgICAgIGFzc2VydC5lcXVhbChwYXJzZWREYXRhLmFtb3VudCwgJzEwMDAwMDAwMDAnKTtcbiAgICAgIGFzc2VydC5lcXVhbChwYXJzZWREYXRhLm1lbW9JZCwgJzExJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIGNvcnJlY3RseSB3aGVuIHJlY2VpdmVyIGlzIG9uIDItc3RlcCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB1dGlscy5wYXJzZVJhd0NhbnRvblRyYW5zYWN0aW9uRGF0YShQcmVwYXJlZFR4bjJTdGVwUmVjZWl2ZXIsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgIHNob3VsZC5leGlzdChwYXJzZWREYXRhKTtcbiAgICAgIGFzc2VydC5lcXVhbChwYXJzZWREYXRhLnNlbmRlciwgJzEyMjBhOjoxMjIwYWRlNjAzMDBjZjdkMGIxOGZmYWEyZmZlNGY0OTJhZDFhZDYwMWNmYzE2MmIyMGY3N2VjOTlkMTZjMmMyZjE1OCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICBwYXJzZWREYXRhLnJlY2VpdmVyLFxuICAgICAgICAncmF2aS10ZXN0LXBhcnR5LTE6OjEyMjA5MmU3ZDMzYWMxMGMwZjNkNTU5NzYzNDJmMzc1NTVkZjA1ZGE1Yjc0Mjk1NmQ1NmE2MmFlMjM2Nzc2OTA3OWQyJ1xuICAgICAgKTtcbiAgICAgIGFzc2VydC5lcXVhbChwYXJzZWREYXRhLmFtb3VudCwgJzIwMDAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIGNvcnJlY3RseSAxJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IHV0aWxzLnBhcnNlUmF3Q2FudG9uVHJhbnNhY3Rpb25EYXRhKFByZXBhcmVkVHhuMVN0ZXBSZWNlaXZlciwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgc2hvdWxkLmV4aXN0KHBhcnNlZERhdGEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZERhdGEuc2VuZGVyLCAnMTIyMGE6OjEyMjBhZGU2MDMwMGNmN2QwYjE4ZmZhYTJmZmU0ZjQ5MmFkMWFkNjAxY2ZjMTYyYjIwZjc3ZWM5OWQxNmMyYzJmMTU4Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIHBhcnNlZERhdGEucmVjZWl2ZXIsXG4gICAgICAgICdyYXZpLWRlbW8tcGFydHktdHhuLTAxLXRhcHBlcjo6MTIyMGVhN2FiNWE3MjNmOGE2YjIwNzhlNjE3ZTZjNThjYjdlNzhlNDk5NDdkZGMyMzllMWE5NDFhYTU2ZTZiYTA4YjQnXG4gICAgICApO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZERhdGEuYW1vdW50LCAnMjAwMDAwMDAwMDAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgdGhlIGFjY2VwdGFuY2UgcHJlcGFyZWQgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCBwYXJzZWREYXRhID0gdXRpbHMucGFyc2VSYXdDYW50b25UcmFuc2FjdGlvbkRhdGEoXG4gICAgICAgIFRyYW5zZmVyQWNjZXB0YW5jZVByZXBhcmVSZXNwb25zZS5wcmVwYXJlZFRyYW5zYWN0aW9uLFxuICAgICAgICBUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXJBY2NlcHRcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXhpc3QocGFyc2VkRGF0YSk7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VkRGF0YS5zZW5kZXIsICdEU086OjEyMjBiZTU4YzI5ZTY1ZGU0MGJmMjczYmUxZGMyYjI2NmQ0M2E5YTAwMmVhNWIxODk1NWFlZWY3YWFjODgxYmI0NzFhJyk7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VkRGF0YS5yZWNlaXZlciwgJ2FiY2RlOjoxMjIwNWI0ZTM1MzdhOTUxMjZkOTA2MDQ1OTIzNDRkOGFkM2MzZGRjY2RhNGY3OTkwMTk1NDI4MGVlMTljNTc2NzE0ZCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZERhdGEuYW1vdW50LCAnNTAwMDAwMDAwMDAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgdGhlIFRlbXBsZSBjb3NpZ24gZGVsZWdhdGlvbiBhY2NlcHRhbmNlIHByZXBhcmVkIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IHV0aWxzLnBhcnNlUmF3Q2FudG9uVHJhbnNhY3Rpb25EYXRhKFxuICAgICAgICBDb3NpZ25EZWxlZ2F0aW9uQWNjZXB0VGVtcGxlUHJlcGFyZVJlc3BvbnNlLnByZXBhcmVkVHJhbnNhY3Rpb24sXG4gICAgICAgIFRyYW5zYWN0aW9uVHlwZS5Db3NpZ25EZWxlZ2F0aW9uQWNjZXB0XG4gICAgICApO1xuICAgICAgc2hvdWxkLmV4aXN0KHBhcnNlZERhdGEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICBwYXJzZWREYXRhLnNlbmRlcixcbiAgICAgICAgJ3JhdmktMi1zdGVwLXBhcnR5OjoxMjIwOTJlN2QzM2FjMTBjMGYzZDU1OTc2MzQyZjM3NTU1ZGYwNWRhNWI3NDI5NTZkNTZhNjJhZTIzNjc3NjkwNzlkMidcbiAgICAgICk7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIHBhcnNlZERhdGEucmVjZWl2ZXIsXG4gICAgICAgICd0ZXN0LWRlbGVnYXRpb246OjEyMjA5MmU3ZDMzYWMxMGMwZjNkNTU5NzYzNDJmMzc1NTVkZjA1ZGE1Yjc0Mjk1NmQ1NmE2MmFlMjM2Nzc2OTA3OWQyJ1xuICAgICAgKTtcbiAgICAgIGFzc2VydC5lcXVhbChwYXJzZWREYXRhLmFtb3VudCwgJzAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgdGhlIHJlamVjdGlvbiBwcmVwYXJlZCB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB1dGlscy5wYXJzZVJhd0NhbnRvblRyYW5zYWN0aW9uRGF0YShcbiAgICAgICAgVHJhbnNmZXJSZWplY3Rpb25QcmVwYXJlUmVzcG9uc2UucHJlcGFyZWRUcmFuc2FjdGlvbixcbiAgICAgICAgVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyUmVqZWN0XG4gICAgICApO1xuICAgICAgc2hvdWxkLmV4aXN0KHBhcnNlZERhdGEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZERhdGEuc2VuZGVyLCAnRFNPOjoxMjIwYmU1OGMyOWU2NWRlNDBiZjI3M2JlMWRjMmIyNjZkNDNhOWEwMDJlYTViMTg5NTVhZWVmN2FhYzg4MWJiNDcxYScpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZERhdGEucmVjZWl2ZXIsICcxMjIwMTo6MTIyMDM4NDAyY2YxNjUwODc2ZDI5MjBkNjA0N2IxMWE0YWFmMGRlN2I0MjhlOTkxNjAwOWNiYTJhMjJiMWFlMjJjMWEnKTtcbiAgICAgIGFzc2VydC5lcXVhbChwYXJzZWREYXRhLmFtb3VudCwgJzUwMDAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIHRoZSBvbmUtc3RlcCBwcmVhcHByb3ZhbCBwcmVwYXJlZCB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB1dGlscy5wYXJzZVJhd0NhbnRvblRyYW5zYWN0aW9uRGF0YShcbiAgICAgICAgT25lU3RlcFByZUFwcHJvdmFsUHJlcGFyZVJlc3BvbnNlLnByZXBhcmVkVHJhbnNhY3Rpb24sXG4gICAgICAgIFRyYW5zYWN0aW9uVHlwZS5PbmVTdGVwUHJlQXBwcm92YWxcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXhpc3QocGFyc2VkRGF0YSk7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIHBhcnNlZERhdGEuc2VuZGVyLFxuICAgICAgICAnQml0Z28tZGV2bmV0LXZhbGlkYXRvci0xOjoxMjIwYTBhMGY2MGIwZTYyYjVkNzUwYzQ4NGIxOGMwOTFkYmEyMzA4MGMxMzNkOTQ0NjE0YmE3NWE1ODU4Y2JhMzA0NSdcbiAgICAgICk7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIHBhcnNlZERhdGEucmVjZWl2ZXIsXG4gICAgICAgICdyYXZpLXRlc3QtcGFydHktMTo6MTIyMDViNGUzNTM3YTk1MTI2ZDkwNjA0NTkyMzQ0ZDhhZDNjM2RkY2NkYTRmNzk5MDE5NTQyODBlZTE5YzU3NjcxNGQnXG4gICAgICApO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZERhdGEuYW1vdW50LCAnMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSB0aGUgY29pbiBUcmFuc2ZlclByZWFwcHJvdmFsX0NhbmNlbCBwcmVwYXJlZCB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB1dGlscy5wYXJzZVJhd0NhbnRvblRyYW5zYWN0aW9uRGF0YShcbiAgICAgICAgQ29pblRyYW5zZmVyUHJlYXBwcm92YWxDYW5jZWxQcmVwYXJlUmVzcG9uc2UucHJlcGFyZWRUcmFuc2FjdGlvbixcbiAgICAgICAgVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyUHJlYXBwcm92YWxDYW5jZWxcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXhpc3QocGFyc2VkRGF0YSk7XG4gICAgICBjb25zdCBwYXJ0eSA9ICdyYXZpLXRlc3RuZXQtcGFydHk6OjEyMjA5MmU3ZDMzYWMxMGMwZjNkNTU5NzYzNDJmMzc1NTVkZjA1ZGE1Yjc0Mjk1NmQ1NmE2MmFlMjM2Nzc2OTA3OWQyJztcbiAgICAgIGFzc2VydC5lcXVhbChwYXJzZWREYXRhLnNlbmRlciwgcGFydHkpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZERhdGEucmVjZWl2ZXIsIHBhcnR5KTtcbiAgICAgIGFzc2VydC5lcXVhbChwYXJzZWREYXRhLmFtb3VudCwgJzAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgdGhlIHRva2VuIFRyYW5zZmVyUHJlYXBwcm92YWwgQXJjaGl2ZSAoY2FuY2VsKSBwcmVwYXJlZCB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB1dGlscy5wYXJzZVJhd0NhbnRvblRyYW5zYWN0aW9uRGF0YShcbiAgICAgICAgVG9rZW5UcmFuc2ZlclByZWFwcHJvdmFsQ2FuY2VsUHJlcGFyZVJlc3BvbnNlLnByZXBhcmVkVHJhbnNhY3Rpb24sXG4gICAgICAgIFRyYW5zYWN0aW9uVHlwZS5UcmFuc2ZlclByZWFwcHJvdmFsQ2FuY2VsXG4gICAgICApO1xuICAgICAgc2hvdWxkLmV4aXN0KHBhcnNlZERhdGEpO1xuICAgICAgY29uc3QgcGFydHkgPSAncmF2aS10ZXN0bmV0LXBhcnR5OjoxMjIwOTJlN2QzM2FjMTBjMGYzZDU1OTc2MzQyZjM3NTU1ZGYwNWRhNWI3NDI5NTZkNTZhNjJhZTIzNjc3NjkwNzlkMic7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VkRGF0YS5zZW5kZXIsIHBhcnR5KTtcbiAgICAgIGFzc2VydC5lcXVhbChwYXJzZWREYXRhLnJlY2VpdmVyLCBwYXJ0eSk7XG4gICAgICBhc3NlcnQuZXF1YWwocGFyc2VkRGF0YS5hbW91bnQsICcwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhcnNlIHRoZSBhbGxvY2F0aW9uIGFsbG9jYXRlIHByZXBhcmVkIHRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IHV0aWxzLnBhcnNlUmF3Q2FudG9uVHJhbnNhY3Rpb25EYXRhKFxuICAgICAgICBDYW50b25BbGxvY2F0aW9uQWxsb2NhdGVQcmVwYXJlUmVzcG9uc2UucHJlcGFyZWRUcmFuc2FjdGlvbixcbiAgICAgICAgVHJhbnNhY3Rpb25UeXBlLkFsbG9jYXRpb25BbGxvY2F0ZVxuICAgICAgKTtcbiAgICAgIHNob3VsZC5leGlzdChwYXJzZWREYXRhKTtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgcGFyc2VkRGF0YS5zZW5kZXIsXG4gICAgICAgICdyYXZpLTItc3RlcC1wYXJ0eTo6MTIyMDkyZTdkMzNhYzEwYzBmM2Q1NTk3NjM0MmYzNzU1NWRmMDVkYTViNzQyOTU2ZDU2YTYyYWUyMzY3NzY5MDc5ZDInXG4gICAgICApO1xuICAgICAgLy8gcmVjZWl2ZXIgPSB0cmFuc2ZlckxlZy5yZWNlaXZlciBmcm9tIER2cExlZ0FsbG9jYXRpb24g4oCUIHRoZSBhY3R1YWwgc2V0dGxlbWVudCBjb3VudGVycGFydHlcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgcGFyc2VkRGF0YS5yZWNlaXZlcixcbiAgICAgICAgJ3JhdmktMi1zdGVwLXBhcnR5LW5ldzo6MTIyMDkyZTdkMzNhYzEwYzBmM2Q1NTk3NjM0MmYzNzU1NWRmMDVkYTViNzQyOTU2ZDU2YTYyYWUyMzY3NzY5MDc5ZDInXG4gICAgICApO1xuICAgICAgYXNzZXJ0LmVxdWFsKHBhcnNlZERhdGEuYW1vdW50LCAnNTAwMDAwMDAwMDAnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1dhbGxldCBpbml0IHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgbG9jYWxseSBnZW5lcmF0ZSBhbmQgdmFsaWRhdGUgdGhlIGhhc2ggZm9yIHRvcG9sb2d5IHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgY29tcHV0ZWRIYXNoID0gdXRpbHMuY29tcHV0ZUhhc2hGcm9tQ3JlYXRlUGFydHlSZXNwb25zZShHZW5lcmF0ZVRvcG9sb2d5UmVzcG9uc2UudG9wb2xvZ3lUcmFuc2FjdGlvbnMpO1xuICAgICAgc2hvdWxkLmV4aXN0KGNvbXB1dGVkSGFzaCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY29tcHV0ZWRIYXNoLCBHZW5lcmF0ZVRvcG9sb2d5UmVzcG9uc2UubXVsdGlIYXNoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1ByZXBhcmUgc3VibWlzc2lvbiByZXNwb25zZSB2YWxpZGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgbG9jYWxseSBnZW5lcmF0ZSBhbmQgdmFsaWRhdGUgdGhlIGhhc2ggZm9yIHByZXBhcmUgc3VibWlzc2lvbiByZXNwb25zZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbXB1dGVkSGFzaCA9IGF3YWl0IHV0aWxzLmNvbXB1dGVIYXNoRnJvbVByZXBhcmVTdWJtaXNzaW9uUmVzcG9uc2UoXG4gICAgICAgIFByZXBhcmVTdWJtaXNzaW9uUmVzcG9uc2UucHJlcGFyZWRUcmFuc2FjdGlvblxuICAgICAgKTtcbiAgICAgIHNob3VsZC5leGlzdChjb21wdXRlZEhhc2gpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNvbXB1dGVkSGFzaCwgUHJlcGFyZVN1Ym1pc3Npb25SZXNwb25zZS5wcmVwYXJlZFRyYW5zYWN0aW9uSGFzaCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDaGVjayBpZiB0aGUgYWRkcmVzcyBpcyB2YWxpZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdGhlIGFkZHJlc3MgaXMgdmFsaWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdXRpbHMuaXNWYWxpZEFkZHJlc3MoQ0FOVE9OX0FERFJFU1NFUy5WQUxJRF9BRERSRVNTKTtcbiAgICAgIHNob3VsZC5leGlzdChpc1ZhbGlkKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIHdoZW4gcGFydHkgaGludCBpcyBpbnZhbGlkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHV0aWxzLmlzVmFsaWRBZGRyZXNzKENBTlRPTl9BRERSRVNTRVMuVkFMSURfUEFSVFlfSElOVCk7XG4gICAgICBzaG91bGQuZXhpc3QoaXNWYWxpZCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIGZpbmdlcnByaW50IGlzIGludmFsaWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdXRpbHMuaXNWYWxpZEFkZHJlc3MoQ0FOVE9OX0FERFJFU1NFUy5JTlZBTElEX0ZJTkdFUlBSSU5UKTtcbiAgICAgIHNob3VsZC5leGlzdChpc1ZhbGlkKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHBhcnR5IGhpbnQgaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB1dGlscy5pc1ZhbGlkQWRkcmVzcyhDQU5UT05fQUREUkVTU0VTLk1JU1NJTkdfUEFSVFlfSElOVCk7XG4gICAgICBzaG91bGQuZXhpc3QoaXNWYWxpZCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZCwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBmaW5nZXJwcmludCBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHV0aWxzLmlzVmFsaWRBZGRyZXNzKENBTlRPTl9BRERSRVNTRVMuTUlTU0lOR19GSU5HRVJQUklOVCk7XG4gICAgICBzaG91bGQuZXhpc3QoaXNWYWxpZCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZCwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIG1lbW8gaWQgaXMgdmFsaWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdXRpbHMuaXNWYWxpZEFkZHJlc3MoQ0FOVE9OX0FERFJFU1NFUy5WQUxJRF9NRU1PX0lEKTtcbiAgICAgIHNob3VsZC5leGlzdChpc1ZhbGlkKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpc1ZhbGlkLCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0NoZWNrIGlmIGJsb2NrIGhhc2ggaXMgdmFsaWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBibG9jayBoYXNoIGlzIHZhbGlkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaXNWYWxpZCA9IHV0aWxzLmlzVmFsaWRCbG9ja0lkKENBTlRPTl9CTE9DS19IRUlHSFQuVkFMSURfSEFTSCk7XG4gICAgICBzaG91bGQuZXhpc3QoaXNWYWxpZCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdGhlIGJsb2NrIGhhc2ggaGFzIHZlcnNpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBpc1ZhbGlkID0gdXRpbHMuaXNWYWxpZEJsb2NrSWQoQ0FOVE9OX0JMT0NLX0hFSUdIVC5WQUxJRF9IQVNIX1dJVEhfVkVSU0lPTik7XG4gICAgICBzaG91bGQuZXhpc3QoaXNWYWxpZCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHRoZSBibG9jayBoYXNoIGlzIG5vdCBhIG51bWJlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB1dGlscy5pc1ZhbGlkQmxvY2tJZChDQU5UT05fQkxPQ0tfSEVJR0hULklOVkFMSURfQkxPQ0tfSEFTSCk7XG4gICAgICBzaG91bGQuZXhpc3QoaXNWYWxpZCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaXNWYWxpZCwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiB0aGUgYmxvY2sgaGFzaCBpcyBuZWdhdGl2ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSB1dGlscy5pc1ZhbGlkQmxvY2tJZChDQU5UT05fQkxPQ0tfSEVJR0hULk5FR0FUSVZFX0JMT0NLX0hBU0gpO1xuICAgICAgc2hvdWxkLmV4aXN0KGlzVmFsaWQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlzVmFsaWQsIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ0NhbnRvbiBVdGlscyAtIENhbnRvbkNvbW1hbmQgaGVscGVycycsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ3BhcnNlQ2FudG9uVGVtcGxhdGVJZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHBhcnNlIHZhbGlkIFwiUGtnOk1vZHVsZTpFbnRpdHlcIiBmb3JtYXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB1dGlscy5wYXJzZUNhbnRvblRlbXBsYXRlSWQoXG4gICAgICAgICdhYmMxMjM6VXRpbGl0eS5SZWdpc3RyeS5BcHAuVjAuU2VydmljZS5BbGxvY2F0aW9uRmFjdG9yeTpBbGxvY2F0aW9uRmFjdG9yeSdcbiAgICAgICk7XG4gICAgICBzaG91bGQuZXhpc3QocmVzdWx0KTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQhLnBrZywgJ2FiYzEyMycpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCEubW9kdWxlTmFtZSwgJ1V0aWxpdHkuUmVnaXN0cnkuQXBwLlYwLlNlcnZpY2UuQWxsb2NhdGlvbkZhY3RvcnknKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQhLmVudGl0eU5hbWUsICdBbGxvY2F0aW9uRmFjdG9yeScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIGZvciBub24tc3RyaW5nIGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdXRpbHMucGFyc2VDYW50b25UZW1wbGF0ZUlkKDEyMyBhcyB1bmtub3duIGFzIHN0cmluZyk7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIGZvciB3cm9uZyBudW1iZXIgb2YgcGFydHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB1dGlscy5wYXJzZUNhbnRvblRlbXBsYXRlSWQoJ1BrZ09ubHknKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB1bmRlZmluZWQgZm9yIGVtcHR5IHBhcnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdXRpbHMucGFyc2VDYW50b25UZW1wbGF0ZUlkKCc6TW9kdWxlOkVudGl0eScpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgdW5kZWZpbmVkKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCBmb3Igc3RyaW5nIHdpdGggb25seSAyIHBhcnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdXRpbHMucGFyc2VDYW50b25UZW1wbGF0ZUlkKCdQa2c6TW9kdWxlJyk7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCB1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGFtbFZhbHVlVG9Kc29uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCBmb3IgdW5kZWZpbmVkIGlucHV0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdXRpbHMuZGFtbFZhbHVlVG9Kc29uKHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IHVuaXQgdG8gbnVsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbDogVmFsdWUgPSB7IHN1bTogeyBvbmVvZktpbmQ6ICd1bml0JywgdW5pdDoge30gfSB9O1xuICAgICAgYXNzZXJ0LmVxdWFsKHV0aWxzLmRhbWxWYWx1ZVRvSnNvbih2YWwpLCBudWxsKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29udmVydCBib29sIGNvcnJlY3RseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbDogVmFsdWUgPSB7IHN1bTogeyBvbmVvZktpbmQ6ICdib29sJywgYm9vbDogdHJ1ZSB9IH07XG4gICAgICBhc3NlcnQuZXF1YWwodXRpbHMuZGFtbFZhbHVlVG9Kc29uKHZhbCksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IHRleHQgY29ycmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsOiBWYWx1ZSA9IHsgc3VtOiB7IG9uZW9mS2luZDogJ3RleHQnLCB0ZXh0OiAnaGVsbG8nIH0gfTtcbiAgICAgIGFzc2VydC5lcXVhbCh1dGlscy5kYW1sVmFsdWVUb0pzb24odmFsKSwgJ2hlbGxvJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgY29udHJhY3RJZCBjb3JyZWN0bHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWw6IFZhbHVlID0geyBzdW06IHsgb25lb2ZLaW5kOiAnY29udHJhY3RJZCcsIGNvbnRyYWN0SWQ6ICcwMGFiYycgfSB9O1xuICAgICAgYXNzZXJ0LmVxdWFsKHV0aWxzLmRhbWxWYWx1ZVRvSnNvbih2YWwpLCAnMDBhYmMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29udmVydCBwYXJ0eSBjb3JyZWN0bHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWw6IFZhbHVlID0geyBzdW06IHsgb25lb2ZLaW5kOiAncGFydHknLCBwYXJ0eTogJ0FsaWNlOjoxMjM0JyB9IH07XG4gICAgICBhc3NlcnQuZXF1YWwodXRpbHMuZGFtbFZhbHVlVG9Kc29uKHZhbCksICdBbGljZTo6MTIzNCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IG51bWVyaWMgY29ycmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsOiBWYWx1ZSA9IHsgc3VtOiB7IG9uZW9mS2luZDogJ251bWVyaWMnLCBudW1lcmljOiAnMTAwLjAwMDAwMDAwMDAnIH0gfTtcbiAgICAgIGFzc2VydC5lcXVhbCh1dGlscy5kYW1sVmFsdWVUb0pzb24odmFsKSwgJzEwMC4wMDAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgb3B0aW9uYWwgd2l0aCB2YWx1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbDogVmFsdWUgPSB7XG4gICAgICAgIHN1bToge1xuICAgICAgICAgIG9uZW9mS2luZDogJ29wdGlvbmFsJyxcbiAgICAgICAgICBvcHRpb25hbDogeyB2YWx1ZTogeyBzdW06IHsgb25lb2ZLaW5kOiAndGV4dCcsIHRleHQ6ICdpbm5lcicgfSB9IH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgYXNzZXJ0LmVxdWFsKHV0aWxzLmRhbWxWYWx1ZVRvSnNvbih2YWwpLCAnaW5uZXInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29udmVydCBvcHRpb25hbCB3aXRob3V0IHZhbHVlIHRvIG51bGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWw6IFZhbHVlID0geyBzdW06IHsgb25lb2ZLaW5kOiAnb3B0aW9uYWwnLCBvcHRpb25hbDoge30gfSB9O1xuICAgICAgYXNzZXJ0LmVxdWFsKHV0aWxzLmRhbWxWYWx1ZVRvSnNvbih2YWwpLCBudWxsKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29udmVydCBsaXN0IHRvIGFycmF5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdmFsOiBWYWx1ZSA9IHtcbiAgICAgICAgc3VtOiB7XG4gICAgICAgICAgb25lb2ZLaW5kOiAnbGlzdCcsXG4gICAgICAgICAgbGlzdDoge1xuICAgICAgICAgICAgZWxlbWVudHM6IFt7IHN1bTogeyBvbmVvZktpbmQ6ICd0ZXh0JywgdGV4dDogJ2EnIH0gfSwgeyBzdW06IHsgb25lb2ZLaW5kOiAndGV4dCcsIHRleHQ6ICdiJyB9IH1dLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh1dGlscy5kYW1sVmFsdWVUb0pzb24odmFsKSwgWydhJywgJ2InXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgdGV4dE1hcCB0byBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB2YWw6IFZhbHVlID0ge1xuICAgICAgICBzdW06IHtcbiAgICAgICAgICBvbmVvZktpbmQ6ICd0ZXh0TWFwJyxcbiAgICAgICAgICB0ZXh0TWFwOiB7XG4gICAgICAgICAgICBlbnRyaWVzOiBbXG4gICAgICAgICAgICAgIHsga2V5OiAnazEnLCB2YWx1ZTogeyBzdW06IHsgb25lb2ZLaW5kOiAndGV4dCcsIHRleHQ6ICd2MScgfSB9IH0sXG4gICAgICAgICAgICAgIHsga2V5OiAnazInLCB2YWx1ZTogeyBzdW06IHsgb25lb2ZLaW5kOiAnYm9vbCcsIGJvb2w6IGZhbHNlIH0gfSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodXRpbHMuZGFtbFZhbHVlVG9Kc29uKHZhbCksIHsgazE6ICd2MScsIGsyOiBmYWxzZSB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29udmVydCByZWNvcmQgdG8gb2JqZWN0IHdpdGggbGFiZWwga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbDogVmFsdWUgPSB7XG4gICAgICAgIHN1bToge1xuICAgICAgICAgIG9uZW9mS2luZDogJ3JlY29yZCcsXG4gICAgICAgICAgcmVjb3JkOiB7XG4gICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ25hbWUnLCB2YWx1ZTogeyBzdW06IHsgb25lb2ZLaW5kOiAndGV4dCcsIHRleHQ6ICdBbGljZScgfSB9IH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdhZ2UnLCB2YWx1ZTogeyBzdW06IHsgb25lb2ZLaW5kOiAnaW50NjQnLCBpbnQ2NDogJzMwJyB9IH0gfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHV0aWxzLmRhbWxWYWx1ZVRvSnNvbih2YWwpLCB7IG5hbWU6ICdBbGljZScsIGFnZTogJzMwJyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29udmVydCB2YXJpYW50IHRvIGtleWVkIG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbDogVmFsdWUgPSB7XG4gICAgICAgIHN1bToge1xuICAgICAgICAgIG9uZW9mS2luZDogJ3ZhcmlhbnQnLFxuICAgICAgICAgIHZhcmlhbnQ6IHtcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yOiAnU29tZScsXG4gICAgICAgICAgICB2YWx1ZTogeyBzdW06IHsgb25lb2ZLaW5kOiAndGV4dCcsIHRleHQ6ICd2JyB9IH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHV0aWxzLmRhbWxWYWx1ZVRvSnNvbih2YWwpLCB7IFNvbWU6ICd2JyB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29udmVydCBlbnVtIHRvIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHZhbDogVmFsdWUgPSB7XG4gICAgICAgIHN1bToge1xuICAgICAgICAgIG9uZW9mS2luZDogJ2VudW0nLFxuICAgICAgICAgIGVudW06IHsgY29uc3RydWN0b3I6ICdBY3RpdmUnIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgICAgYXNzZXJ0LmVxdWFsKHV0aWxzLmRhbWxWYWx1ZVRvSnNvbih2YWwpLCAnQWN0aXZlJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdleHRyYWN0U3VibWl0dGVyQWN0QXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBleHRyYWN0IGFjdEFzIGZyb20gcmVhbCBQcmVwYXJlZFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWN0QXMgPSB1dGlscy5leHRyYWN0U3VibWl0dGVyQWN0QXMoQ2FudG9uRXhlcmNpc2VDb21tYW5kUHJlcGFyZVJlc3BvbnNlLnByZXBhcmVkVHJhbnNhY3Rpb24pO1xuICAgICAgc2hvdWxkLmV4aXN0KGFjdEFzKTtcbiAgICAgIGFzc2VydC5vayhBcnJheS5pc0FycmF5KGFjdEFzKSk7XG4gICAgICBhc3NlcnQuZXF1YWwoYWN0QXMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbChhY3RBc1swXSwgJ1JlZ1JlZ2lzdHJhcjo6MTIyMDUwOGU1NGZiNzA5ZGNiMWE5YjQwOTY0MDhhZDQxNWQyMjE3ZDg4ODFhZDkwMzRhOTg1MDc1MjkzM2JhODhhZDUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2V4dHJhY3RDYW50b25Db21tYW5kSW5mbycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGV4dHJhY3QgRXhlcmNpc2VDb21tYW5kIGluZm8gY29ycmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW5mbyA9IHV0aWxzLmV4dHJhY3RDYW50b25Db21tYW5kSW5mbyhDYW50b25FeGVyY2lzZUNvbW1hbmRQcmVwYXJlUmVzcG9uc2UucHJlcGFyZWRUcmFuc2FjdGlvbik7XG4gICAgICBzaG91bGQuZXhpc3QoaW5mbyk7XG4gICAgICBhc3NlcnQuZXF1YWwoaW5mby5raW5kLCAnRXhlcmNpc2VDb21tYW5kJyk7XG4gICAgICBhc3NlcnQuZXF1YWwoaW5mby50ZW1wbGF0ZUlkLm1vZHVsZU5hbWUsICdVdGlsaXR5LlJlZ2lzdHJ5LkFwcC5WMC5TZXJ2aWNlLkFsbG9jYXRpb25GYWN0b3J5Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwoaW5mby50ZW1wbGF0ZUlkLmVudGl0eU5hbWUsICdBbGxvY2F0aW9uRmFjdG9yeScpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGluZm8uY2hvaWNlLCAnQWxsb2NhdGlvbkZhY3RvcnlfT2ZmZXJNaW50Jyk7XG4gICAgICBzaG91bGQuZXhpc3QoaW5mby5jb250cmFjdElkKTtcbiAgICAgIHNob3VsZC5leGlzdChpbmZvLmFjdGluZ1BhcnRpZXMpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2FtZUVsZW1lbnRzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIGlkZW50aWNhbCBhcnJheXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwodXRpbHMuc2FtZUVsZW1lbnRzKFsnYScsICdiJywgJ2MnXSwgWydhJywgJ2InLCAnYyddKSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciBzYW1lIGVsZW1lbnRzIGluIGRpZmZlcmVudCBvcmRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbCh1dGlscy5zYW1lRWxlbWVudHMoWydjJywgJ2EnLCAnYiddLCBbJ2EnLCAnYicsICdjJ10pLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBkaWZmZXJlbnQgbGVuZ3RocycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbCh1dGlscy5zYW1lRWxlbWVudHMoWydhJywgJ2InXSwgWydhJywgJ2InLCAnYyddKSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgZm9yIGRpZmZlcmVudCBlbGVtZW50cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbCh1dGlscy5zYW1lRWxlbWVudHMoWydhJywgJ2InLCAneCddLCBbJ2EnLCAnYicsICdjJ10pLCBmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciBlbXB0eSBhcnJheXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwodXRpbHMuc2FtZUVsZW1lbnRzKFtdLCBbXSksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBvbmUgYXJyYXkgaGFzIGR1cGxpY2F0ZXMgdGhlIG90aGVyIGRvZXMgbm90JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKHV0aWxzLnNhbWVFbGVtZW50cyhbJ3gnLCAneCddLCBbJ3gnLCAneSddKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9ybWFsaXplSW5qZWN0QXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdHJpcCBcImNvbW1hbmQuXCIgcHJlZml4IGZyb20gaW5qZWN0QXMgcGF0aHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzcGVjcyA9IFt7IGluamVjdEFzOiAnY29tbWFuZC5FeGVyY2lzZUNvbW1hbmQuY29udHJhY3RJZCcgfV07XG4gICAgICBjb25zdCByZXN1bHQgPSB1dGlscy5ub3JtYWxpemVJbmplY3RBcyhzcGVjcyk7XG4gICAgICBhc3NlcnQub2socmVzdWx0LmhhcygnRXhlcmNpc2VDb21tYW5kLmNvbnRyYWN0SWQnKSk7XG4gICAgICBhc3NlcnQub2soIXJlc3VsdC5oYXMoJ2NvbW1hbmQuRXhlcmNpc2VDb21tYW5kLmNvbnRyYWN0SWQnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBzcGVjcyB3aXRoIGVtcHR5IGluamVjdEFzIGZpZWxkJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdXRpbHMubm9ybWFsaXplSW5qZWN0QXMoW3sgaW5qZWN0QXM6ICcnIH1dKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc2l6ZSwgMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBlbXB0eSBzcGVjcyBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHV0aWxzLm5vcm1hbGl6ZUluamVjdEFzKFtdKTtcbiAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc2l6ZSwgMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSB1bmRlZmluZWQgc3BlY3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB1dGlscy5ub3JtYWxpemVJbmplY3RBcyh1bmRlZmluZWQpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zaXplLCAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJlc2VydmUgcGF0aHMgdGhhdCBkbyBub3Qgc3RhcnQgd2l0aCBcImNvbW1hbmQuXCInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzcGVjcyA9IFt7IGluamVjdEFzOiAnRXhlcmNpc2VDb21tYW5kLmNvbnRyYWN0SWQnIH1dO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdXRpbHMubm9ybWFsaXplSW5qZWN0QXMoc3BlY3MpO1xuICAgICAgYXNzZXJ0Lm9rKHJlc3VsdC5oYXMoJ0V4ZXJjaXNlQ29tbWFuZC5jb250cmFjdElkJykpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYXNzZXJ0RGVlcENhbnRvbk1hdGNoJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG5vSW5qZWN0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBpdCgnc2hvdWxkIHBhc3MgZm9yIG1hdGNoaW5nIHByaW1pdGl2ZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHV0aWxzLmFzc2VydERlZXBDYW50b25NYXRjaCgnaGVsbG8nLCAnaGVsbG8nLCBub0luamVjdCkpO1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB1dGlscy5hc3NlcnREZWVwQ2FudG9uTWF0Y2goNDIsIDQyLCBub0luamVjdCkpO1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB1dGlscy5hc3NlcnREZWVwQ2FudG9uTWF0Y2godHJ1ZSwgdHJ1ZSwgbm9JbmplY3QpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFzcyBmb3IgbWF0Y2hpbmcgb2JqZWN0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT5cbiAgICAgICAgdXRpbHMuYXNzZXJ0RGVlcENhbnRvbk1hdGNoKHsgYTogJ3gnLCBiOiAneScgfSwgeyBhOiAneCcsIGI6ICd5JywgZXh0cmE6ICd6JyB9LCBub0luamVjdClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFsbG93IGV4dHJhIGZpZWxkcyBpbiBhY3R1YWwgdGhhdCB1c2VyIGRpZCBub3Qgc3BlY2lmeScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT5cbiAgICAgICAgdXRpbHMuYXNzZXJ0RGVlcENhbnRvbk1hdGNoKFxuICAgICAgICAgIHsgbmFtZTogJ0FsaWNlJyB9LFxuICAgICAgICAgIHsgbmFtZTogJ0FsaWNlJywgdGltZXN0YW1wOiAnMjAyNC0wMS0wMScsIGhhc2g6ICdhYmMnIH0sXG4gICAgICAgICAgbm9JbmplY3RcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcGFzcyBmb3IgbWF0Y2hpbmcgYXJyYXlzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB1dGlscy5hc3NlcnREZWVwQ2FudG9uTWF0Y2goWydhJywgJ2InXSwgWydhJywgJ2InXSwgbm9JbmplY3QpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2tpcCBwYXRocyBpbiBpbmplY3RBc1BhdGhzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaW5qZWN0UGF0aHMgPSBuZXcgU2V0KFsnRXhlcmNpc2VDb21tYW5kLmNvbnRyYWN0SWQnXSk7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+XG4gICAgICAgIHV0aWxzLmFzc2VydERlZXBDYW50b25NYXRjaChcbiAgICAgICAgICB7IEV4ZXJjaXNlQ29tbWFuZDogeyBjb250cmFjdElkOiB1bmRlZmluZWQsIGNob2ljZTogJ0ZvbycgfSB9LFxuICAgICAgICAgIHsgRXhlcmNpc2VDb21tYW5kOiB7IGNvbnRyYWN0SWQ6ICcwMGFiYycsIGNob2ljZTogJ0ZvbycgfSB9LFxuICAgICAgICAgIGluamVjdFBhdGhzXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNraXAgdW5kZWZpbmVkIGV4cGVjdGVkIHZhbHVlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4gdXRpbHMuYXNzZXJ0RGVlcENhbnRvbk1hdGNoKHVuZGVmaW5lZCwgJ2FueXRoaW5nJywgbm9JbmplY3QpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IGVtcHR5IG9iamVjdCB7fSBhZ2FpbnN0IGFjdHVhbCAobm90IHNraXApJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB1dGlscy5hc3NlcnREZWVwQ2FudG9uTWF0Y2goe30sIHt9LCBub0luamVjdCkpO1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB1dGlscy5hc3NlcnREZWVwQ2FudG9uTWF0Y2goe30sIHsgZXh0cmE6ICdmaWVsZCcgfSwgbm9JbmplY3QpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IGVtcHR5IGFycmF5IFtdIGFnYWluc3QgYWN0dWFsIChub3Qgc2tpcCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHV0aWxzLmFzc2VydERlZXBDYW50b25NYXRjaChbXSwgW10sIG5vSW5qZWN0KSk7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHV0aWxzLmFzc2VydERlZXBDYW50b25NYXRjaChbXSwgWydhJ10sIG5vSW5qZWN0KSwgL2xpc3QtbGVuZ3RoIG1pc21hdGNoLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbXBhcmUgbnVtZXJpYyBzdHJpbmdzIHdpdGggQmlnTnVtYmVyIGVxdWl2YWxlbmNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB1dGlscy5hc3NlcnREZWVwQ2FudG9uTWF0Y2goJzEwMCcsICcxMDAuMDAwMDAwMDAwMCcsIG5vSW5qZWN0KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIHByaW1pdGl2ZSBtaXNtYXRjaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdXRpbHMuYXNzZXJ0RGVlcENhbnRvbk1hdGNoKCdoZWxsbycsICd3b3JsZCcsIG5vSW5qZWN0KSwgL21pc21hdGNoLyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIGFycmF5IGxlbmd0aCBtaXNtYXRjaCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdXRpbHMuYXNzZXJ0RGVlcENhbnRvbk1hdGNoKFsnYScsICdiJ10sIFsnYSddLCBub0luamVjdCksIC9saXN0LWxlbmd0aCBtaXNtYXRjaC8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBvbiBtaXNzaW5nIGZpZWxkICh1c2VyIHNwZWNpZmllZCBidXQgbm90IGluIGFjdHVhbCknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB1dGlscy5hc3NlcnREZWVwQ2FudG9uTWF0Y2goeyByZXF1aXJlZDogJ3ZhbCcgfSwgeyBvdGhlcjogJ3ZhbCcgfSwgbm9JbmplY3QpLFxuICAgICAgICAvbWlzc2luZyBmaWVsZC9cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IG9uIHR5cGUgbWlzbWF0Y2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHV0aWxzLmFzc2VydERlZXBDYW50b25NYXRjaCh7IGE6ICdzdHInIH0sIHsgYTogNDIgfSwgbm9JbmplY3QpLCAvbWlzbWF0Y2gvKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdJU08gdGltZXN0YW1wIHZzIG1pY3Jvc2Vjb25kIHN0cmluZyBub3JtYWxpc2F0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaXNvVHMgPSAnMjAyNi0wNi0xMlQxMDowMDowMC4wMDBaJztcbiAgICAgIGNvbnN0IGlzb1RzVXMgPSBTdHJpbmcobmV3IERhdGUoaXNvVHMpLmdldFRpbWUoKSAqIDEwMDApO1xuXG4gICAgICBpdCgnc2hvdWxkIHBhc3Mgd2hlbiBJU08gdGltZXN0YW1wIChleHBlY3RlZCkgZXF1YWxzIG1pY3Jvc2Vjb25kcyAoYWN0dWFsKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB1dGlscy5hc3NlcnREZWVwQ2FudG9uTWF0Y2goaXNvVHMsIGlzb1RzVXMsIG5vSW5qZWN0KSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyB0aW1lc3RhbXAgbWlzbWF0Y2ggd2hlbiBtaWNyb3NlY29uZHMgZG8gbm90IGNvcnJlc3BvbmQgdG8gdGhlIElTTyB2YWx1ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgd3JvbmdVcyA9IFN0cmluZyhuZXcgRGF0ZShpc29UcykuZ2V0VGltZSgpICogMTAwMCArIDFfMDAwXzAwMCk7XG4gICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdXRpbHMuYXNzZXJ0RGVlcENhbnRvbk1hdGNoKGlzb1RzLCB3cm9uZ1VzLCBub0luamVjdCksIC90aW1lc3RhbXAgbWlzbWF0Y2gvKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHBhc3MgZm9yIElTTyB0aW1lc3RhbXAgbmVzdGVkIGluc2lkZSBhIG1pbnQtbGlrZSBjaG9pY2VBcmd1bWVudCBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGVCZWZvcmUgPSAnMjAyNi0wNi0xM1QxMDowMDowMC4wMDBaJztcbiAgICAgICAgY29uc3QgZXhlY3V0ZUJlZm9yZVVzID0gU3RyaW5nKG5ldyBEYXRlKGV4ZWN1dGVCZWZvcmUpLmdldFRpbWUoKSAqIDEwMDApO1xuXG4gICAgICAgIGNvbnN0IGV4cGVjdGVkID0ge1xuICAgICAgICAgIGV4cGVjdGVkQWRtaW46ICdyZWdpc3RyYXI6OjEyMjBhYmMnLFxuICAgICAgICAgIG1pbnQ6IHtcbiAgICAgICAgICAgIGluc3RydW1lbnRJZDogeyBhZG1pbjogJ3JlZ2lzdHJhcjo6MTIyMGFiYycsIGlkOiAnU1RHVVNEMScgfSxcbiAgICAgICAgICAgIGFtb3VudDogJzEwMDAwMDAuMCcsXG4gICAgICAgICAgICBob2xkZXI6ICdyZWdpc3RyYXI6OjEyMjBhYmMnLFxuICAgICAgICAgICAgcmVmZXJlbmNlOiAnbWludC1zdGd1c2QxLTEyMzQ1JyxcbiAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBpc29UcyxcbiAgICAgICAgICAgIGV4ZWN1dGVCZWZvcmU6IGV4ZWN1dGVCZWZvcmUsXG4gICAgICAgICAgICBtZXRhOiB7IHZhbHVlczoge30gfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFjdHVhbCA9IHtcbiAgICAgICAgICBleHBlY3RlZEFkbWluOiAncmVnaXN0cmFyOjoxMjIwYWJjJyxcbiAgICAgICAgICBtaW50OiB7XG4gICAgICAgICAgICBpbnN0cnVtZW50SWQ6IHsgYWRtaW46ICdyZWdpc3RyYXI6OjEyMjBhYmMnLCBpZDogJ1NUR1VTRDEnIH0sXG4gICAgICAgICAgICBhbW91bnQ6ICcxMDAwMDAwLjAwMDAwMDAwMDAnLFxuICAgICAgICAgICAgaG9sZGVyOiAncmVnaXN0cmFyOjoxMjIwYWJjJyxcbiAgICAgICAgICAgIHJlZmVyZW5jZTogJ21pbnQtc3RndXNkMS0xMjM0NScsXG4gICAgICAgICAgICByZXF1ZXN0ZWRBdDogaXNvVHNVcyxcbiAgICAgICAgICAgIGV4ZWN1dGVCZWZvcmU6IGV4ZWN1dGVCZWZvcmVVcyxcbiAgICAgICAgICAgIG1ldGE6IHsgdmFsdWVzOiB7fSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB1dGlscy5hc3NlcnREZWVwQ2FudG9uTWF0Y2goZXhwZWN0ZWQsIGFjdHVhbCwgbm9JbmplY3QpKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gSVNPIHRpbWVzdGFtcCBpbiBuZXN0ZWQgb2JqZWN0IGRvZXMgbm90IG1hdGNoIG1pY3Jvc2Vjb25kcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3Qgd3JvbmdVcyA9IFN0cmluZyhuZXcgRGF0ZShpc29UcykuZ2V0VGltZSgpICogMTAwMCArIDVfMDAwXzAwMCk7XG5cbiAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSB7IG1pbnQ6IHsgcmVxdWVzdGVkQXQ6IGlzb1RzIH0gfTtcbiAgICAgICAgY29uc3QgYWN0dWFsID0geyBtaW50OiB7IHJlcXVlc3RlZEF0OiB3cm9uZ1VzIH0gfTtcblxuICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHV0aWxzLmFzc2VydERlZXBDYW50b25NYXRjaChleHBlY3RlZCwgYWN0dWFsLCBub0luamVjdCksIC90aW1lc3RhbXAgbWlzbWF0Y2gvKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCB0cmVhdCBhbiBhcmJpdHJhcnkgbm9uLXRpbWVzdGFtcCBJU08tbGlrZSBzdHJpbmcgYXMgYSB0aW1lc3RhbXAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdXRpbHMuYXNzZXJ0RGVlcENhbnRvbk1hdGNoKCdub3QtYS10aW1lc3RhbXAnLCBpc29Uc1VzLCBub0luamVjdCksIC9taXNtYXRjaC8pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=