@buildonspark/spark-sdk 0.5.0 → 0.5.1

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 (81) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/bare/index.cjs +1608 -3635
  3. package/dist/bare/index.d.cts +27 -435
  4. package/dist/bare/index.d.ts +27 -435
  5. package/dist/bare/index.js +1608 -3634
  6. package/dist/{chunk-RU434ZAE.js → chunk-F3BFSHVR.js} +357 -391
  7. package/dist/{chunk-UYEB2VPG.js → chunk-IOIEBLMK.js} +7 -1
  8. package/dist/{chunk-EU3I7GFB.js → chunk-STB6WMU7.js} +1 -1
  9. package/dist/{chunk-JE3MXMPW.js → chunk-UTECVGQQ.js} +93 -202
  10. package/dist/{chunk-ZP6Z6DFX.js → chunk-YFVVYZCS.js} +37 -5
  11. package/dist/{client-D1dLzWu0.d.ts → client-C9kc4cog.d.cts} +9 -3
  12. package/dist/{client-CVn0R_eM.d.cts → client-eyjf4knu.d.ts} +9 -3
  13. package/dist/graphql/objects/index.cjs +7 -1
  14. package/dist/graphql/objects/index.d.cts +3 -3
  15. package/dist/graphql/objects/index.d.ts +3 -3
  16. package/dist/graphql/objects/index.js +1 -1
  17. package/dist/index.browser.d.ts +27 -435
  18. package/dist/index.browser.js +1613 -3639
  19. package/dist/index.node.cjs +1613 -3640
  20. package/dist/index.node.d.cts +7 -8
  21. package/dist/index.node.d.ts +7 -8
  22. package/dist/index.node.js +5 -7
  23. package/dist/native/index.react-native.cjs +1613 -3640
  24. package/dist/native/index.react-native.d.cts +27 -435
  25. package/dist/native/index.react-native.d.ts +27 -435
  26. package/dist/native/index.react-native.js +1613 -3639
  27. package/dist/proto/spark.cjs +93 -202
  28. package/dist/proto/spark.d.cts +1 -1
  29. package/dist/proto/spark.d.ts +1 -1
  30. package/dist/proto/spark.js +1 -1
  31. package/dist/proto/spark_token.cjs +36 -4
  32. package/dist/proto/spark_token.d.cts +4 -1
  33. package/dist/proto/spark_token.d.ts +4 -1
  34. package/dist/proto/spark_token.js +2 -2
  35. package/dist/{spark-2Fxnvl8K.d.cts → spark-d6w3BLGZ.d.cts} +10 -328
  36. package/dist/{spark-2Fxnvl8K.d.ts → spark-d6w3BLGZ.d.ts} +10 -328
  37. package/dist/{spark-wallet.node-DlhZiDgY.d.ts → spark-wallet.node-MReThHBY.d.ts} +6 -7
  38. package/dist/{spark-wallet.node-xKJXzAEd.d.cts → spark-wallet.node-eR0svGws.d.cts} +6 -7
  39. package/dist/tests/test-utils.cjs +409 -2429
  40. package/dist/tests/test-utils.d.cts +3 -3
  41. package/dist/tests/test-utils.d.ts +3 -3
  42. package/dist/tests/test-utils.js +5 -5
  43. package/dist/types/index.cjs +100 -203
  44. package/dist/types/index.d.cts +2 -2
  45. package/dist/types/index.d.ts +2 -2
  46. package/dist/types/index.js +3 -3
  47. package/package.json +3 -3
  48. package/src/graphql/client.ts +36 -1
  49. package/src/graphql/objects/LightningSendRequestStatus.ts +25 -13
  50. package/src/proto/common.ts +1 -1
  51. package/src/proto/google/protobuf/descriptor.ts +1 -1
  52. package/src/proto/google/protobuf/duration.ts +1 -1
  53. package/src/proto/google/protobuf/empty.ts +1 -1
  54. package/src/proto/google/protobuf/timestamp.ts +1 -1
  55. package/src/proto/mock.ts +1 -1
  56. package/src/proto/spark.ts +113 -446
  57. package/src/proto/spark_authn.ts +1 -1
  58. package/src/proto/spark_token.ts +41 -2
  59. package/src/proto/validate/validate.ts +1 -1
  60. package/src/services/connection/connection.ts +23 -60
  61. package/src/services/coop-exit.ts +3 -5
  62. package/src/services/deposit.ts +1 -1
  63. package/src/services/lightning.ts +1 -1
  64. package/src/services/signing.ts +5 -6
  65. package/src/services/transfer.ts +250 -240
  66. package/src/services/wallet-config.ts +22 -5
  67. package/src/spark-wallet/proto-descriptors.ts +1 -1
  68. package/src/spark-wallet/proto-reflection.ts +0 -2
  69. package/src/spark-wallet/spark-wallet.ts +2 -2
  70. package/src/spark_descriptors.pb +0 -0
  71. package/src/tests/bufbuild-reflection.test.ts +2 -3
  72. package/src/tests/integration/coop-exit.test.ts +6 -1
  73. package/src/tests/integration/htlc.test.ts +5 -0
  74. package/src/tests/integration/lightning.test.ts +24 -4
  75. package/src/tests/integration/time-sync.test.ts +18 -0
  76. package/src/tests/integration/transfer.test.ts +42 -7
  77. package/src/tests/ssp-client-retry.test.ts +161 -0
  78. package/src/tests/token-hashing.test.ts +92 -0
  79. package/src/utils/token-hashing.ts +4 -51
  80. package/src/utils/transaction.ts +1 -2
  81. package/src/utils/unilateral-exit.ts +139 -142
@@ -73,7 +73,7 @@ var isWebExtension = (
73
73
  );
74
74
  var isWebExtensionContentScript = isWebExtension && "window" in globalThis;
75
75
  var userAgent = "navigator" in globalThis ? parseUserAgent(globalThis.navigator.userAgent) || "unknown-user-agent" : void 0;
76
- var packageVersion = true ? "0.5.0" : "unknown";
76
+ var packageVersion = true ? "0.5.1" : "unknown";
77
77
  var baseEnvStr = "unknown";
78
78
  if (isBun) {
79
79
  const bunVersion = "version" in globalThis.Bun ? globalThis.Bun.version : "unknown-version";
@@ -802,6 +802,9 @@ function preimageRequestRoleFromJSON(object) {
802
802
  case 1:
803
803
  case "PREIMAGE_REQUEST_ROLE_SENDER":
804
804
  return 1 /* PREIMAGE_REQUEST_ROLE_SENDER */;
805
+ case 2:
806
+ case "PREIMAGE_REQUEST_ROLE_RECEIVER_AND_SENDER":
807
+ return 2 /* PREIMAGE_REQUEST_ROLE_RECEIVER_AND_SENDER */;
805
808
  case -1:
806
809
  case "UNRECOGNIZED":
807
810
  default:
@@ -814,36 +817,8 @@ function preimageRequestRoleToJSON(object) {
814
817
  return "PREIMAGE_REQUEST_ROLE_RECEIVER";
815
818
  case 1 /* PREIMAGE_REQUEST_ROLE_SENDER */:
816
819
  return "PREIMAGE_REQUEST_ROLE_SENDER";
817
- case -1 /* UNRECOGNIZED */:
818
- default:
819
- return "UNRECOGNIZED";
820
- }
821
- }
822
- function utxoSwapRequestTypeFromJSON(object) {
823
- switch (object) {
824
- case 0:
825
- case "Fixed":
826
- return 0 /* Fixed */;
827
- case 1:
828
- case "MaxFee":
829
- return 1 /* MaxFee */;
830
- case 2:
831
- case "Refund":
832
- return 2 /* Refund */;
833
- case -1:
834
- case "UNRECOGNIZED":
835
- default:
836
- return -1 /* UNRECOGNIZED */;
837
- }
838
- }
839
- function utxoSwapRequestTypeToJSON(object) {
840
- switch (object) {
841
- case 0 /* Fixed */:
842
- return "Fixed";
843
- case 1 /* MaxFee */:
844
- return "MaxFee";
845
- case 2 /* Refund */:
846
- return "Refund";
820
+ case 2 /* PREIMAGE_REQUEST_ROLE_RECEIVER_AND_SENDER */:
821
+ return "PREIMAGE_REQUEST_ROLE_RECEIVER_AND_SENDER";
847
822
  case -1 /* UNRECOGNIZED */:
848
823
  default:
849
824
  return "UNRECOGNIZED";
@@ -916,6 +891,9 @@ function treeNodeStatusFromJSON(object) {
916
891
  case 9:
917
892
  case "TREE_NODE_STATUS_EXITED":
918
893
  return 9 /* TREE_NODE_STATUS_EXITED */;
894
+ case 10:
895
+ case "TREE_NODE_STATUS_RENEW_LOCKED":
896
+ return 10 /* TREE_NODE_STATUS_RENEW_LOCKED */;
919
897
  case -1:
920
898
  case "UNRECOGNIZED":
921
899
  default:
@@ -944,6 +922,8 @@ function treeNodeStatusToJSON(object) {
944
922
  return "TREE_NODE_STATUS_AGGREGATE_LOCK";
945
923
  case 9 /* TREE_NODE_STATUS_EXITED */:
946
924
  return "TREE_NODE_STATUS_EXITED";
925
+ case 10 /* TREE_NODE_STATUS_RENEW_LOCKED */:
926
+ return "TREE_NODE_STATUS_RENEW_LOCKED";
947
927
  case -1 /* UNRECOGNIZED */:
948
928
  default:
949
929
  return "UNRECOGNIZED";
@@ -3884,225 +3864,6 @@ var NodeSignatures = {
3884
3864
  return message;
3885
3865
  }
3886
3866
  };
3887
- function createBaseStartTreeCreationRequest() {
3888
- return {
3889
- identityPublicKey: new Uint8Array(0),
3890
- onChainUtxo: void 0,
3891
- rootTxSigningJob: void 0,
3892
- refundTxSigningJob: void 0,
3893
- directRootTxSigningJob: void 0,
3894
- directRefundTxSigningJob: void 0,
3895
- directFromCpfpRefundTxSigningJob: void 0
3896
- };
3897
- }
3898
- var StartTreeCreationRequest = {
3899
- encode(message, writer = new import_wire4.BinaryWriter()) {
3900
- if (message.identityPublicKey.length !== 0) {
3901
- writer.uint32(10).bytes(message.identityPublicKey);
3902
- }
3903
- if (message.onChainUtxo !== void 0) {
3904
- UTXO.encode(message.onChainUtxo, writer.uint32(18).fork()).join();
3905
- }
3906
- if (message.rootTxSigningJob !== void 0) {
3907
- SigningJob.encode(message.rootTxSigningJob, writer.uint32(26).fork()).join();
3908
- }
3909
- if (message.refundTxSigningJob !== void 0) {
3910
- SigningJob.encode(message.refundTxSigningJob, writer.uint32(34).fork()).join();
3911
- }
3912
- if (message.directRootTxSigningJob !== void 0) {
3913
- SigningJob.encode(message.directRootTxSigningJob, writer.uint32(42).fork()).join();
3914
- }
3915
- if (message.directRefundTxSigningJob !== void 0) {
3916
- SigningJob.encode(message.directRefundTxSigningJob, writer.uint32(50).fork()).join();
3917
- }
3918
- if (message.directFromCpfpRefundTxSigningJob !== void 0) {
3919
- SigningJob.encode(message.directFromCpfpRefundTxSigningJob, writer.uint32(58).fork()).join();
3920
- }
3921
- return writer;
3922
- },
3923
- decode(input, length) {
3924
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
3925
- const end = length === void 0 ? reader.len : reader.pos + length;
3926
- const message = createBaseStartTreeCreationRequest();
3927
- while (reader.pos < end) {
3928
- const tag = reader.uint32();
3929
- switch (tag >>> 3) {
3930
- case 1: {
3931
- if (tag !== 10) {
3932
- break;
3933
- }
3934
- message.identityPublicKey = reader.bytes();
3935
- continue;
3936
- }
3937
- case 2: {
3938
- if (tag !== 18) {
3939
- break;
3940
- }
3941
- message.onChainUtxo = UTXO.decode(reader, reader.uint32());
3942
- continue;
3943
- }
3944
- case 3: {
3945
- if (tag !== 26) {
3946
- break;
3947
- }
3948
- message.rootTxSigningJob = SigningJob.decode(reader, reader.uint32());
3949
- continue;
3950
- }
3951
- case 4: {
3952
- if (tag !== 34) {
3953
- break;
3954
- }
3955
- message.refundTxSigningJob = SigningJob.decode(reader, reader.uint32());
3956
- continue;
3957
- }
3958
- case 5: {
3959
- if (tag !== 42) {
3960
- break;
3961
- }
3962
- message.directRootTxSigningJob = SigningJob.decode(reader, reader.uint32());
3963
- continue;
3964
- }
3965
- case 6: {
3966
- if (tag !== 50) {
3967
- break;
3968
- }
3969
- message.directRefundTxSigningJob = SigningJob.decode(reader, reader.uint32());
3970
- continue;
3971
- }
3972
- case 7: {
3973
- if (tag !== 58) {
3974
- break;
3975
- }
3976
- message.directFromCpfpRefundTxSigningJob = SigningJob.decode(reader, reader.uint32());
3977
- continue;
3978
- }
3979
- }
3980
- if ((tag & 7) === 4 || tag === 0) {
3981
- break;
3982
- }
3983
- reader.skip(tag & 7);
3984
- }
3985
- return message;
3986
- },
3987
- fromJSON(object) {
3988
- return {
3989
- identityPublicKey: isSet3(object.identityPublicKey) ? bytesFromBase642(object.identityPublicKey) : new Uint8Array(0),
3990
- onChainUtxo: isSet3(object.onChainUtxo) ? UTXO.fromJSON(object.onChainUtxo) : void 0,
3991
- rootTxSigningJob: isSet3(object.rootTxSigningJob) ? SigningJob.fromJSON(object.rootTxSigningJob) : void 0,
3992
- refundTxSigningJob: isSet3(object.refundTxSigningJob) ? SigningJob.fromJSON(object.refundTxSigningJob) : void 0,
3993
- directRootTxSigningJob: isSet3(object.directRootTxSigningJob) ? SigningJob.fromJSON(object.directRootTxSigningJob) : void 0,
3994
- directRefundTxSigningJob: isSet3(object.directRefundTxSigningJob) ? SigningJob.fromJSON(object.directRefundTxSigningJob) : void 0,
3995
- directFromCpfpRefundTxSigningJob: isSet3(object.directFromCpfpRefundTxSigningJob) ? SigningJob.fromJSON(object.directFromCpfpRefundTxSigningJob) : void 0
3996
- };
3997
- },
3998
- toJSON(message) {
3999
- const obj = {};
4000
- if (message.identityPublicKey.length !== 0) {
4001
- obj.identityPublicKey = base64FromBytes2(message.identityPublicKey);
4002
- }
4003
- if (message.onChainUtxo !== void 0) {
4004
- obj.onChainUtxo = UTXO.toJSON(message.onChainUtxo);
4005
- }
4006
- if (message.rootTxSigningJob !== void 0) {
4007
- obj.rootTxSigningJob = SigningJob.toJSON(message.rootTxSigningJob);
4008
- }
4009
- if (message.refundTxSigningJob !== void 0) {
4010
- obj.refundTxSigningJob = SigningJob.toJSON(message.refundTxSigningJob);
4011
- }
4012
- if (message.directRootTxSigningJob !== void 0) {
4013
- obj.directRootTxSigningJob = SigningJob.toJSON(message.directRootTxSigningJob);
4014
- }
4015
- if (message.directRefundTxSigningJob !== void 0) {
4016
- obj.directRefundTxSigningJob = SigningJob.toJSON(message.directRefundTxSigningJob);
4017
- }
4018
- if (message.directFromCpfpRefundTxSigningJob !== void 0) {
4019
- obj.directFromCpfpRefundTxSigningJob = SigningJob.toJSON(message.directFromCpfpRefundTxSigningJob);
4020
- }
4021
- return obj;
4022
- },
4023
- create(base) {
4024
- return StartTreeCreationRequest.fromPartial(base ?? {});
4025
- },
4026
- fromPartial(object) {
4027
- const message = createBaseStartTreeCreationRequest();
4028
- message.identityPublicKey = object.identityPublicKey ?? new Uint8Array(0);
4029
- message.onChainUtxo = object.onChainUtxo !== void 0 && object.onChainUtxo !== null ? UTXO.fromPartial(object.onChainUtxo) : void 0;
4030
- message.rootTxSigningJob = object.rootTxSigningJob !== void 0 && object.rootTxSigningJob !== null ? SigningJob.fromPartial(object.rootTxSigningJob) : void 0;
4031
- message.refundTxSigningJob = object.refundTxSigningJob !== void 0 && object.refundTxSigningJob !== null ? SigningJob.fromPartial(object.refundTxSigningJob) : void 0;
4032
- message.directRootTxSigningJob = object.directRootTxSigningJob !== void 0 && object.directRootTxSigningJob !== null ? SigningJob.fromPartial(object.directRootTxSigningJob) : void 0;
4033
- message.directRefundTxSigningJob = object.directRefundTxSigningJob !== void 0 && object.directRefundTxSigningJob !== null ? SigningJob.fromPartial(object.directRefundTxSigningJob) : void 0;
4034
- message.directFromCpfpRefundTxSigningJob = object.directFromCpfpRefundTxSigningJob !== void 0 && object.directFromCpfpRefundTxSigningJob !== null ? SigningJob.fromPartial(object.directFromCpfpRefundTxSigningJob) : void 0;
4035
- return message;
4036
- }
4037
- };
4038
- function createBaseStartTreeCreationResponse() {
4039
- return { treeId: "", rootNodeSignatureShares: void 0 };
4040
- }
4041
- var StartTreeCreationResponse = {
4042
- encode(message, writer = new import_wire4.BinaryWriter()) {
4043
- if (message.treeId !== "") {
4044
- writer.uint32(10).string(message.treeId);
4045
- }
4046
- if (message.rootNodeSignatureShares !== void 0) {
4047
- NodeSignatureShares.encode(message.rootNodeSignatureShares, writer.uint32(18).fork()).join();
4048
- }
4049
- return writer;
4050
- },
4051
- decode(input, length) {
4052
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
4053
- const end = length === void 0 ? reader.len : reader.pos + length;
4054
- const message = createBaseStartTreeCreationResponse();
4055
- while (reader.pos < end) {
4056
- const tag = reader.uint32();
4057
- switch (tag >>> 3) {
4058
- case 1: {
4059
- if (tag !== 10) {
4060
- break;
4061
- }
4062
- message.treeId = reader.string();
4063
- continue;
4064
- }
4065
- case 2: {
4066
- if (tag !== 18) {
4067
- break;
4068
- }
4069
- message.rootNodeSignatureShares = NodeSignatureShares.decode(reader, reader.uint32());
4070
- continue;
4071
- }
4072
- }
4073
- if ((tag & 7) === 4 || tag === 0) {
4074
- break;
4075
- }
4076
- reader.skip(tag & 7);
4077
- }
4078
- return message;
4079
- },
4080
- fromJSON(object) {
4081
- return {
4082
- treeId: isSet3(object.treeId) ? globalThis.String(object.treeId) : "",
4083
- rootNodeSignatureShares: isSet3(object.rootNodeSignatureShares) ? NodeSignatureShares.fromJSON(object.rootNodeSignatureShares) : void 0
4084
- };
4085
- },
4086
- toJSON(message) {
4087
- const obj = {};
4088
- if (message.treeId !== "") {
4089
- obj.treeId = message.treeId;
4090
- }
4091
- if (message.rootNodeSignatureShares !== void 0) {
4092
- obj.rootNodeSignatureShares = NodeSignatureShares.toJSON(message.rootNodeSignatureShares);
4093
- }
4094
- return obj;
4095
- },
4096
- create(base) {
4097
- return StartTreeCreationResponse.fromPartial(base ?? {});
4098
- },
4099
- fromPartial(object) {
4100
- const message = createBaseStartTreeCreationResponse();
4101
- message.treeId = object.treeId ?? "";
4102
- message.rootNodeSignatureShares = object.rootNodeSignatureShares !== void 0 && object.rootNodeSignatureShares !== null ? NodeSignatureShares.fromPartial(object.rootNodeSignatureShares) : void 0;
4103
- return message;
4104
- }
4105
- };
4106
3867
  function createBaseStartDepositTreeCreationRequest() {
4107
3868
  return {
4108
3869
  identityPublicKey: new Uint8Array(0),
@@ -6078,104 +5839,6 @@ var SendLeafKeyTweak_PubkeySharesTweakEntry = {
6078
5839
  return message;
6079
5840
  }
6080
5841
  };
6081
- function createBaseFinalizeTransferRequest() {
6082
- return { transferId: "", ownerIdentityPublicKey: new Uint8Array(0), leavesToSend: [], sparkPaymentIntent: "" };
6083
- }
6084
- var FinalizeTransferRequest = {
6085
- encode(message, writer = new import_wire4.BinaryWriter()) {
6086
- if (message.transferId !== "") {
6087
- writer.uint32(10).string(message.transferId);
6088
- }
6089
- if (message.ownerIdentityPublicKey.length !== 0) {
6090
- writer.uint32(18).bytes(message.ownerIdentityPublicKey);
6091
- }
6092
- for (const v of message.leavesToSend) {
6093
- SendLeafKeyTweak.encode(v, writer.uint32(26).fork()).join();
6094
- }
6095
- if (message.sparkPaymentIntent !== "") {
6096
- writer.uint32(34).string(message.sparkPaymentIntent);
6097
- }
6098
- return writer;
6099
- },
6100
- decode(input, length) {
6101
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
6102
- const end = length === void 0 ? reader.len : reader.pos + length;
6103
- const message = createBaseFinalizeTransferRequest();
6104
- while (reader.pos < end) {
6105
- const tag = reader.uint32();
6106
- switch (tag >>> 3) {
6107
- case 1: {
6108
- if (tag !== 10) {
6109
- break;
6110
- }
6111
- message.transferId = reader.string();
6112
- continue;
6113
- }
6114
- case 2: {
6115
- if (tag !== 18) {
6116
- break;
6117
- }
6118
- message.ownerIdentityPublicKey = reader.bytes();
6119
- continue;
6120
- }
6121
- case 3: {
6122
- if (tag !== 26) {
6123
- break;
6124
- }
6125
- message.leavesToSend.push(SendLeafKeyTweak.decode(reader, reader.uint32()));
6126
- continue;
6127
- }
6128
- case 4: {
6129
- if (tag !== 34) {
6130
- break;
6131
- }
6132
- message.sparkPaymentIntent = reader.string();
6133
- continue;
6134
- }
6135
- }
6136
- if ((tag & 7) === 4 || tag === 0) {
6137
- break;
6138
- }
6139
- reader.skip(tag & 7);
6140
- }
6141
- return message;
6142
- },
6143
- fromJSON(object) {
6144
- return {
6145
- transferId: isSet3(object.transferId) ? globalThis.String(object.transferId) : "",
6146
- ownerIdentityPublicKey: isSet3(object.ownerIdentityPublicKey) ? bytesFromBase642(object.ownerIdentityPublicKey) : new Uint8Array(0),
6147
- leavesToSend: globalThis.Array.isArray(object?.leavesToSend) ? object.leavesToSend.map((e) => SendLeafKeyTweak.fromJSON(e)) : [],
6148
- sparkPaymentIntent: isSet3(object.sparkPaymentIntent) ? globalThis.String(object.sparkPaymentIntent) : ""
6149
- };
6150
- },
6151
- toJSON(message) {
6152
- const obj = {};
6153
- if (message.transferId !== "") {
6154
- obj.transferId = message.transferId;
6155
- }
6156
- if (message.ownerIdentityPublicKey.length !== 0) {
6157
- obj.ownerIdentityPublicKey = base64FromBytes2(message.ownerIdentityPublicKey);
6158
- }
6159
- if (message.leavesToSend?.length) {
6160
- obj.leavesToSend = message.leavesToSend.map((e) => SendLeafKeyTweak.toJSON(e));
6161
- }
6162
- if (message.sparkPaymentIntent !== "") {
6163
- obj.sparkPaymentIntent = message.sparkPaymentIntent;
6164
- }
6165
- return obj;
6166
- },
6167
- create(base) {
6168
- return FinalizeTransferRequest.fromPartial(base ?? {});
6169
- },
6170
- fromPartial(object) {
6171
- const message = createBaseFinalizeTransferRequest();
6172
- message.transferId = object.transferId ?? "";
6173
- message.ownerIdentityPublicKey = object.ownerIdentityPublicKey ?? new Uint8Array(0);
6174
- message.leavesToSend = object.leavesToSend?.map((e) => SendLeafKeyTweak.fromPartial(e)) || [];
6175
- message.sparkPaymentIntent = object.sparkPaymentIntent ?? "";
6176
- return message;
6177
- }
6178
- };
6179
5842
  function createBaseFinalizeTransferWithTransferPackageRequest() {
6180
5843
  return { transferId: "", ownerIdentityPublicKey: new Uint8Array(0), transferPackage: void 0 };
6181
5844
  }
@@ -8547,753 +8210,6 @@ var CooperativeExitResponse = {
8547
8210
  return message;
8548
8211
  }
8549
8212
  };
8550
- function createBaseCounterLeafSwapRequest() {
8551
- return {
8552
- transfer: void 0,
8553
- swapId: "",
8554
- adaptorPublicKey: new Uint8Array(0),
8555
- directAdaptorPublicKey: new Uint8Array(0),
8556
- directFromCpfpAdaptorPublicKey: new Uint8Array(0)
8557
- };
8558
- }
8559
- var CounterLeafSwapRequest = {
8560
- encode(message, writer = new import_wire4.BinaryWriter()) {
8561
- if (message.transfer !== void 0) {
8562
- StartTransferRequest.encode(message.transfer, writer.uint32(10).fork()).join();
8563
- }
8564
- if (message.swapId !== "") {
8565
- writer.uint32(18).string(message.swapId);
8566
- }
8567
- if (message.adaptorPublicKey.length !== 0) {
8568
- writer.uint32(26).bytes(message.adaptorPublicKey);
8569
- }
8570
- if (message.directAdaptorPublicKey.length !== 0) {
8571
- writer.uint32(34).bytes(message.directAdaptorPublicKey);
8572
- }
8573
- if (message.directFromCpfpAdaptorPublicKey.length !== 0) {
8574
- writer.uint32(42).bytes(message.directFromCpfpAdaptorPublicKey);
8575
- }
8576
- return writer;
8577
- },
8578
- decode(input, length) {
8579
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
8580
- const end = length === void 0 ? reader.len : reader.pos + length;
8581
- const message = createBaseCounterLeafSwapRequest();
8582
- while (reader.pos < end) {
8583
- const tag = reader.uint32();
8584
- switch (tag >>> 3) {
8585
- case 1: {
8586
- if (tag !== 10) {
8587
- break;
8588
- }
8589
- message.transfer = StartTransferRequest.decode(reader, reader.uint32());
8590
- continue;
8591
- }
8592
- case 2: {
8593
- if (tag !== 18) {
8594
- break;
8595
- }
8596
- message.swapId = reader.string();
8597
- continue;
8598
- }
8599
- case 3: {
8600
- if (tag !== 26) {
8601
- break;
8602
- }
8603
- message.adaptorPublicKey = reader.bytes();
8604
- continue;
8605
- }
8606
- case 4: {
8607
- if (tag !== 34) {
8608
- break;
8609
- }
8610
- message.directAdaptorPublicKey = reader.bytes();
8611
- continue;
8612
- }
8613
- case 5: {
8614
- if (tag !== 42) {
8615
- break;
8616
- }
8617
- message.directFromCpfpAdaptorPublicKey = reader.bytes();
8618
- continue;
8619
- }
8620
- }
8621
- if ((tag & 7) === 4 || tag === 0) {
8622
- break;
8623
- }
8624
- reader.skip(tag & 7);
8625
- }
8626
- return message;
8627
- },
8628
- fromJSON(object) {
8629
- return {
8630
- transfer: isSet3(object.transfer) ? StartTransferRequest.fromJSON(object.transfer) : void 0,
8631
- swapId: isSet3(object.swapId) ? globalThis.String(object.swapId) : "",
8632
- adaptorPublicKey: isSet3(object.adaptorPublicKey) ? bytesFromBase642(object.adaptorPublicKey) : new Uint8Array(0),
8633
- directAdaptorPublicKey: isSet3(object.directAdaptorPublicKey) ? bytesFromBase642(object.directAdaptorPublicKey) : new Uint8Array(0),
8634
- directFromCpfpAdaptorPublicKey: isSet3(object.directFromCpfpAdaptorPublicKey) ? bytesFromBase642(object.directFromCpfpAdaptorPublicKey) : new Uint8Array(0)
8635
- };
8636
- },
8637
- toJSON(message) {
8638
- const obj = {};
8639
- if (message.transfer !== void 0) {
8640
- obj.transfer = StartTransferRequest.toJSON(message.transfer);
8641
- }
8642
- if (message.swapId !== "") {
8643
- obj.swapId = message.swapId;
8644
- }
8645
- if (message.adaptorPublicKey.length !== 0) {
8646
- obj.adaptorPublicKey = base64FromBytes2(message.adaptorPublicKey);
8647
- }
8648
- if (message.directAdaptorPublicKey.length !== 0) {
8649
- obj.directAdaptorPublicKey = base64FromBytes2(message.directAdaptorPublicKey);
8650
- }
8651
- if (message.directFromCpfpAdaptorPublicKey.length !== 0) {
8652
- obj.directFromCpfpAdaptorPublicKey = base64FromBytes2(message.directFromCpfpAdaptorPublicKey);
8653
- }
8654
- return obj;
8655
- },
8656
- create(base) {
8657
- return CounterLeafSwapRequest.fromPartial(base ?? {});
8658
- },
8659
- fromPartial(object) {
8660
- const message = createBaseCounterLeafSwapRequest();
8661
- message.transfer = object.transfer !== void 0 && object.transfer !== null ? StartTransferRequest.fromPartial(object.transfer) : void 0;
8662
- message.swapId = object.swapId ?? "";
8663
- message.adaptorPublicKey = object.adaptorPublicKey ?? new Uint8Array(0);
8664
- message.directAdaptorPublicKey = object.directAdaptorPublicKey ?? new Uint8Array(0);
8665
- message.directFromCpfpAdaptorPublicKey = object.directFromCpfpAdaptorPublicKey ?? new Uint8Array(0);
8666
- return message;
8667
- }
8668
- };
8669
- function createBaseCounterLeafSwapResponse() {
8670
- return { transfer: void 0, signingResults: [] };
8671
- }
8672
- var CounterLeafSwapResponse = {
8673
- encode(message, writer = new import_wire4.BinaryWriter()) {
8674
- if (message.transfer !== void 0) {
8675
- Transfer.encode(message.transfer, writer.uint32(10).fork()).join();
8676
- }
8677
- for (const v of message.signingResults) {
8678
- LeafRefundTxSigningResult.encode(v, writer.uint32(18).fork()).join();
8679
- }
8680
- return writer;
8681
- },
8682
- decode(input, length) {
8683
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
8684
- const end = length === void 0 ? reader.len : reader.pos + length;
8685
- const message = createBaseCounterLeafSwapResponse();
8686
- while (reader.pos < end) {
8687
- const tag = reader.uint32();
8688
- switch (tag >>> 3) {
8689
- case 1: {
8690
- if (tag !== 10) {
8691
- break;
8692
- }
8693
- message.transfer = Transfer.decode(reader, reader.uint32());
8694
- continue;
8695
- }
8696
- case 2: {
8697
- if (tag !== 18) {
8698
- break;
8699
- }
8700
- message.signingResults.push(LeafRefundTxSigningResult.decode(reader, reader.uint32()));
8701
- continue;
8702
- }
8703
- }
8704
- if ((tag & 7) === 4 || tag === 0) {
8705
- break;
8706
- }
8707
- reader.skip(tag & 7);
8708
- }
8709
- return message;
8710
- },
8711
- fromJSON(object) {
8712
- return {
8713
- transfer: isSet3(object.transfer) ? Transfer.fromJSON(object.transfer) : void 0,
8714
- signingResults: globalThis.Array.isArray(object?.signingResults) ? object.signingResults.map((e) => LeafRefundTxSigningResult.fromJSON(e)) : []
8715
- };
8716
- },
8717
- toJSON(message) {
8718
- const obj = {};
8719
- if (message.transfer !== void 0) {
8720
- obj.transfer = Transfer.toJSON(message.transfer);
8721
- }
8722
- if (message.signingResults?.length) {
8723
- obj.signingResults = message.signingResults.map((e) => LeafRefundTxSigningResult.toJSON(e));
8724
- }
8725
- return obj;
8726
- },
8727
- create(base) {
8728
- return CounterLeafSwapResponse.fromPartial(base ?? {});
8729
- },
8730
- fromPartial(object) {
8731
- const message = createBaseCounterLeafSwapResponse();
8732
- message.transfer = object.transfer !== void 0 && object.transfer !== null ? Transfer.fromPartial(object.transfer) : void 0;
8733
- message.signingResults = object.signingResults?.map((e) => LeafRefundTxSigningResult.fromPartial(e)) || [];
8734
- return message;
8735
- }
8736
- };
8737
- function createBaseRefreshTimelockRequest() {
8738
- return { leafId: "", ownerIdentityPublicKey: new Uint8Array(0), signingJobs: [] };
8739
- }
8740
- var RefreshTimelockRequest = {
8741
- encode(message, writer = new import_wire4.BinaryWriter()) {
8742
- if (message.leafId !== "") {
8743
- writer.uint32(10).string(message.leafId);
8744
- }
8745
- if (message.ownerIdentityPublicKey.length !== 0) {
8746
- writer.uint32(18).bytes(message.ownerIdentityPublicKey);
8747
- }
8748
- for (const v of message.signingJobs) {
8749
- SigningJob.encode(v, writer.uint32(26).fork()).join();
8750
- }
8751
- return writer;
8752
- },
8753
- decode(input, length) {
8754
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
8755
- const end = length === void 0 ? reader.len : reader.pos + length;
8756
- const message = createBaseRefreshTimelockRequest();
8757
- while (reader.pos < end) {
8758
- const tag = reader.uint32();
8759
- switch (tag >>> 3) {
8760
- case 1: {
8761
- if (tag !== 10) {
8762
- break;
8763
- }
8764
- message.leafId = reader.string();
8765
- continue;
8766
- }
8767
- case 2: {
8768
- if (tag !== 18) {
8769
- break;
8770
- }
8771
- message.ownerIdentityPublicKey = reader.bytes();
8772
- continue;
8773
- }
8774
- case 3: {
8775
- if (tag !== 26) {
8776
- break;
8777
- }
8778
- message.signingJobs.push(SigningJob.decode(reader, reader.uint32()));
8779
- continue;
8780
- }
8781
- }
8782
- if ((tag & 7) === 4 || tag === 0) {
8783
- break;
8784
- }
8785
- reader.skip(tag & 7);
8786
- }
8787
- return message;
8788
- },
8789
- fromJSON(object) {
8790
- return {
8791
- leafId: isSet3(object.leafId) ? globalThis.String(object.leafId) : "",
8792
- ownerIdentityPublicKey: isSet3(object.ownerIdentityPublicKey) ? bytesFromBase642(object.ownerIdentityPublicKey) : new Uint8Array(0),
8793
- signingJobs: globalThis.Array.isArray(object?.signingJobs) ? object.signingJobs.map((e) => SigningJob.fromJSON(e)) : []
8794
- };
8795
- },
8796
- toJSON(message) {
8797
- const obj = {};
8798
- if (message.leafId !== "") {
8799
- obj.leafId = message.leafId;
8800
- }
8801
- if (message.ownerIdentityPublicKey.length !== 0) {
8802
- obj.ownerIdentityPublicKey = base64FromBytes2(message.ownerIdentityPublicKey);
8803
- }
8804
- if (message.signingJobs?.length) {
8805
- obj.signingJobs = message.signingJobs.map((e) => SigningJob.toJSON(e));
8806
- }
8807
- return obj;
8808
- },
8809
- create(base) {
8810
- return RefreshTimelockRequest.fromPartial(base ?? {});
8811
- },
8812
- fromPartial(object) {
8813
- const message = createBaseRefreshTimelockRequest();
8814
- message.leafId = object.leafId ?? "";
8815
- message.ownerIdentityPublicKey = object.ownerIdentityPublicKey ?? new Uint8Array(0);
8816
- message.signingJobs = object.signingJobs?.map((e) => SigningJob.fromPartial(e)) || [];
8817
- return message;
8818
- }
8819
- };
8820
- function createBaseRefreshTimelockSigningResult() {
8821
- return { signingResult: void 0, verifyingKey: new Uint8Array(0) };
8822
- }
8823
- var RefreshTimelockSigningResult = {
8824
- encode(message, writer = new import_wire4.BinaryWriter()) {
8825
- if (message.signingResult !== void 0) {
8826
- SigningResult.encode(message.signingResult, writer.uint32(10).fork()).join();
8827
- }
8828
- if (message.verifyingKey.length !== 0) {
8829
- writer.uint32(18).bytes(message.verifyingKey);
8830
- }
8831
- return writer;
8832
- },
8833
- decode(input, length) {
8834
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
8835
- const end = length === void 0 ? reader.len : reader.pos + length;
8836
- const message = createBaseRefreshTimelockSigningResult();
8837
- while (reader.pos < end) {
8838
- const tag = reader.uint32();
8839
- switch (tag >>> 3) {
8840
- case 1: {
8841
- if (tag !== 10) {
8842
- break;
8843
- }
8844
- message.signingResult = SigningResult.decode(reader, reader.uint32());
8845
- continue;
8846
- }
8847
- case 2: {
8848
- if (tag !== 18) {
8849
- break;
8850
- }
8851
- message.verifyingKey = reader.bytes();
8852
- continue;
8853
- }
8854
- }
8855
- if ((tag & 7) === 4 || tag === 0) {
8856
- break;
8857
- }
8858
- reader.skip(tag & 7);
8859
- }
8860
- return message;
8861
- },
8862
- fromJSON(object) {
8863
- return {
8864
- signingResult: isSet3(object.signingResult) ? SigningResult.fromJSON(object.signingResult) : void 0,
8865
- verifyingKey: isSet3(object.verifyingKey) ? bytesFromBase642(object.verifyingKey) : new Uint8Array(0)
8866
- };
8867
- },
8868
- toJSON(message) {
8869
- const obj = {};
8870
- if (message.signingResult !== void 0) {
8871
- obj.signingResult = SigningResult.toJSON(message.signingResult);
8872
- }
8873
- if (message.verifyingKey.length !== 0) {
8874
- obj.verifyingKey = base64FromBytes2(message.verifyingKey);
8875
- }
8876
- return obj;
8877
- },
8878
- create(base) {
8879
- return RefreshTimelockSigningResult.fromPartial(base ?? {});
8880
- },
8881
- fromPartial(object) {
8882
- const message = createBaseRefreshTimelockSigningResult();
8883
- message.signingResult = object.signingResult !== void 0 && object.signingResult !== null ? SigningResult.fromPartial(object.signingResult) : void 0;
8884
- message.verifyingKey = object.verifyingKey ?? new Uint8Array(0);
8885
- return message;
8886
- }
8887
- };
8888
- function createBaseRefreshTimelockResponse() {
8889
- return { signingResults: [] };
8890
- }
8891
- var RefreshTimelockResponse = {
8892
- encode(message, writer = new import_wire4.BinaryWriter()) {
8893
- for (const v of message.signingResults) {
8894
- RefreshTimelockSigningResult.encode(v, writer.uint32(10).fork()).join();
8895
- }
8896
- return writer;
8897
- },
8898
- decode(input, length) {
8899
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
8900
- const end = length === void 0 ? reader.len : reader.pos + length;
8901
- const message = createBaseRefreshTimelockResponse();
8902
- while (reader.pos < end) {
8903
- const tag = reader.uint32();
8904
- switch (tag >>> 3) {
8905
- case 1: {
8906
- if (tag !== 10) {
8907
- break;
8908
- }
8909
- message.signingResults.push(RefreshTimelockSigningResult.decode(reader, reader.uint32()));
8910
- continue;
8911
- }
8912
- }
8913
- if ((tag & 7) === 4 || tag === 0) {
8914
- break;
8915
- }
8916
- reader.skip(tag & 7);
8917
- }
8918
- return message;
8919
- },
8920
- fromJSON(object) {
8921
- return {
8922
- signingResults: globalThis.Array.isArray(object?.signingResults) ? object.signingResults.map((e) => RefreshTimelockSigningResult.fromJSON(e)) : []
8923
- };
8924
- },
8925
- toJSON(message) {
8926
- const obj = {};
8927
- if (message.signingResults?.length) {
8928
- obj.signingResults = message.signingResults.map((e) => RefreshTimelockSigningResult.toJSON(e));
8929
- }
8930
- return obj;
8931
- },
8932
- create(base) {
8933
- return RefreshTimelockResponse.fromPartial(base ?? {});
8934
- },
8935
- fromPartial(object) {
8936
- const message = createBaseRefreshTimelockResponse();
8937
- message.signingResults = object.signingResults?.map((e) => RefreshTimelockSigningResult.fromPartial(e)) || [];
8938
- return message;
8939
- }
8940
- };
8941
- function createBaseExtendLeafRequest() {
8942
- return {
8943
- leafId: "",
8944
- ownerIdentityPublicKey: new Uint8Array(0),
8945
- nodeTxSigningJob: void 0,
8946
- refundTxSigningJob: void 0,
8947
- directNodeTxSigningJob: void 0,
8948
- directRefundTxSigningJob: void 0,
8949
- directFromCpfpRefundTxSigningJob: void 0
8950
- };
8951
- }
8952
- var ExtendLeafRequest = {
8953
- encode(message, writer = new import_wire4.BinaryWriter()) {
8954
- if (message.leafId !== "") {
8955
- writer.uint32(10).string(message.leafId);
8956
- }
8957
- if (message.ownerIdentityPublicKey.length !== 0) {
8958
- writer.uint32(18).bytes(message.ownerIdentityPublicKey);
8959
- }
8960
- if (message.nodeTxSigningJob !== void 0) {
8961
- SigningJob.encode(message.nodeTxSigningJob, writer.uint32(26).fork()).join();
8962
- }
8963
- if (message.refundTxSigningJob !== void 0) {
8964
- SigningJob.encode(message.refundTxSigningJob, writer.uint32(34).fork()).join();
8965
- }
8966
- if (message.directNodeTxSigningJob !== void 0) {
8967
- SigningJob.encode(message.directNodeTxSigningJob, writer.uint32(42).fork()).join();
8968
- }
8969
- if (message.directRefundTxSigningJob !== void 0) {
8970
- SigningJob.encode(message.directRefundTxSigningJob, writer.uint32(50).fork()).join();
8971
- }
8972
- if (message.directFromCpfpRefundTxSigningJob !== void 0) {
8973
- SigningJob.encode(message.directFromCpfpRefundTxSigningJob, writer.uint32(58).fork()).join();
8974
- }
8975
- return writer;
8976
- },
8977
- decode(input, length) {
8978
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
8979
- const end = length === void 0 ? reader.len : reader.pos + length;
8980
- const message = createBaseExtendLeafRequest();
8981
- while (reader.pos < end) {
8982
- const tag = reader.uint32();
8983
- switch (tag >>> 3) {
8984
- case 1: {
8985
- if (tag !== 10) {
8986
- break;
8987
- }
8988
- message.leafId = reader.string();
8989
- continue;
8990
- }
8991
- case 2: {
8992
- if (tag !== 18) {
8993
- break;
8994
- }
8995
- message.ownerIdentityPublicKey = reader.bytes();
8996
- continue;
8997
- }
8998
- case 3: {
8999
- if (tag !== 26) {
9000
- break;
9001
- }
9002
- message.nodeTxSigningJob = SigningJob.decode(reader, reader.uint32());
9003
- continue;
9004
- }
9005
- case 4: {
9006
- if (tag !== 34) {
9007
- break;
9008
- }
9009
- message.refundTxSigningJob = SigningJob.decode(reader, reader.uint32());
9010
- continue;
9011
- }
9012
- case 5: {
9013
- if (tag !== 42) {
9014
- break;
9015
- }
9016
- message.directNodeTxSigningJob = SigningJob.decode(reader, reader.uint32());
9017
- continue;
9018
- }
9019
- case 6: {
9020
- if (tag !== 50) {
9021
- break;
9022
- }
9023
- message.directRefundTxSigningJob = SigningJob.decode(reader, reader.uint32());
9024
- continue;
9025
- }
9026
- case 7: {
9027
- if (tag !== 58) {
9028
- break;
9029
- }
9030
- message.directFromCpfpRefundTxSigningJob = SigningJob.decode(reader, reader.uint32());
9031
- continue;
9032
- }
9033
- }
9034
- if ((tag & 7) === 4 || tag === 0) {
9035
- break;
9036
- }
9037
- reader.skip(tag & 7);
9038
- }
9039
- return message;
9040
- },
9041
- fromJSON(object) {
9042
- return {
9043
- leafId: isSet3(object.leafId) ? globalThis.String(object.leafId) : "",
9044
- ownerIdentityPublicKey: isSet3(object.ownerIdentityPublicKey) ? bytesFromBase642(object.ownerIdentityPublicKey) : new Uint8Array(0),
9045
- nodeTxSigningJob: isSet3(object.nodeTxSigningJob) ? SigningJob.fromJSON(object.nodeTxSigningJob) : void 0,
9046
- refundTxSigningJob: isSet3(object.refundTxSigningJob) ? SigningJob.fromJSON(object.refundTxSigningJob) : void 0,
9047
- directNodeTxSigningJob: isSet3(object.directNodeTxSigningJob) ? SigningJob.fromJSON(object.directNodeTxSigningJob) : void 0,
9048
- directRefundTxSigningJob: isSet3(object.directRefundTxSigningJob) ? SigningJob.fromJSON(object.directRefundTxSigningJob) : void 0,
9049
- directFromCpfpRefundTxSigningJob: isSet3(object.directFromCpfpRefundTxSigningJob) ? SigningJob.fromJSON(object.directFromCpfpRefundTxSigningJob) : void 0
9050
- };
9051
- },
9052
- toJSON(message) {
9053
- const obj = {};
9054
- if (message.leafId !== "") {
9055
- obj.leafId = message.leafId;
9056
- }
9057
- if (message.ownerIdentityPublicKey.length !== 0) {
9058
- obj.ownerIdentityPublicKey = base64FromBytes2(message.ownerIdentityPublicKey);
9059
- }
9060
- if (message.nodeTxSigningJob !== void 0) {
9061
- obj.nodeTxSigningJob = SigningJob.toJSON(message.nodeTxSigningJob);
9062
- }
9063
- if (message.refundTxSigningJob !== void 0) {
9064
- obj.refundTxSigningJob = SigningJob.toJSON(message.refundTxSigningJob);
9065
- }
9066
- if (message.directNodeTxSigningJob !== void 0) {
9067
- obj.directNodeTxSigningJob = SigningJob.toJSON(message.directNodeTxSigningJob);
9068
- }
9069
- if (message.directRefundTxSigningJob !== void 0) {
9070
- obj.directRefundTxSigningJob = SigningJob.toJSON(message.directRefundTxSigningJob);
9071
- }
9072
- if (message.directFromCpfpRefundTxSigningJob !== void 0) {
9073
- obj.directFromCpfpRefundTxSigningJob = SigningJob.toJSON(message.directFromCpfpRefundTxSigningJob);
9074
- }
9075
- return obj;
9076
- },
9077
- create(base) {
9078
- return ExtendLeafRequest.fromPartial(base ?? {});
9079
- },
9080
- fromPartial(object) {
9081
- const message = createBaseExtendLeafRequest();
9082
- message.leafId = object.leafId ?? "";
9083
- message.ownerIdentityPublicKey = object.ownerIdentityPublicKey ?? new Uint8Array(0);
9084
- message.nodeTxSigningJob = object.nodeTxSigningJob !== void 0 && object.nodeTxSigningJob !== null ? SigningJob.fromPartial(object.nodeTxSigningJob) : void 0;
9085
- message.refundTxSigningJob = object.refundTxSigningJob !== void 0 && object.refundTxSigningJob !== null ? SigningJob.fromPartial(object.refundTxSigningJob) : void 0;
9086
- message.directNodeTxSigningJob = object.directNodeTxSigningJob !== void 0 && object.directNodeTxSigningJob !== null ? SigningJob.fromPartial(object.directNodeTxSigningJob) : void 0;
9087
- message.directRefundTxSigningJob = object.directRefundTxSigningJob !== void 0 && object.directRefundTxSigningJob !== null ? SigningJob.fromPartial(object.directRefundTxSigningJob) : void 0;
9088
- message.directFromCpfpRefundTxSigningJob = object.directFromCpfpRefundTxSigningJob !== void 0 && object.directFromCpfpRefundTxSigningJob !== null ? SigningJob.fromPartial(object.directFromCpfpRefundTxSigningJob) : void 0;
9089
- return message;
9090
- }
9091
- };
9092
- function createBaseExtendLeafSigningResult() {
9093
- return { signingResult: void 0, verifyingKey: new Uint8Array(0) };
9094
- }
9095
- var ExtendLeafSigningResult = {
9096
- encode(message, writer = new import_wire4.BinaryWriter()) {
9097
- if (message.signingResult !== void 0) {
9098
- SigningResult.encode(message.signingResult, writer.uint32(10).fork()).join();
9099
- }
9100
- if (message.verifyingKey.length !== 0) {
9101
- writer.uint32(18).bytes(message.verifyingKey);
9102
- }
9103
- return writer;
9104
- },
9105
- decode(input, length) {
9106
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
9107
- const end = length === void 0 ? reader.len : reader.pos + length;
9108
- const message = createBaseExtendLeafSigningResult();
9109
- while (reader.pos < end) {
9110
- const tag = reader.uint32();
9111
- switch (tag >>> 3) {
9112
- case 1: {
9113
- if (tag !== 10) {
9114
- break;
9115
- }
9116
- message.signingResult = SigningResult.decode(reader, reader.uint32());
9117
- continue;
9118
- }
9119
- case 2: {
9120
- if (tag !== 18) {
9121
- break;
9122
- }
9123
- message.verifyingKey = reader.bytes();
9124
- continue;
9125
- }
9126
- }
9127
- if ((tag & 7) === 4 || tag === 0) {
9128
- break;
9129
- }
9130
- reader.skip(tag & 7);
9131
- }
9132
- return message;
9133
- },
9134
- fromJSON(object) {
9135
- return {
9136
- signingResult: isSet3(object.signingResult) ? SigningResult.fromJSON(object.signingResult) : void 0,
9137
- verifyingKey: isSet3(object.verifyingKey) ? bytesFromBase642(object.verifyingKey) : new Uint8Array(0)
9138
- };
9139
- },
9140
- toJSON(message) {
9141
- const obj = {};
9142
- if (message.signingResult !== void 0) {
9143
- obj.signingResult = SigningResult.toJSON(message.signingResult);
9144
- }
9145
- if (message.verifyingKey.length !== 0) {
9146
- obj.verifyingKey = base64FromBytes2(message.verifyingKey);
9147
- }
9148
- return obj;
9149
- },
9150
- create(base) {
9151
- return ExtendLeafSigningResult.fromPartial(base ?? {});
9152
- },
9153
- fromPartial(object) {
9154
- const message = createBaseExtendLeafSigningResult();
9155
- message.signingResult = object.signingResult !== void 0 && object.signingResult !== null ? SigningResult.fromPartial(object.signingResult) : void 0;
9156
- message.verifyingKey = object.verifyingKey ?? new Uint8Array(0);
9157
- return message;
9158
- }
9159
- };
9160
- function createBaseExtendLeafResponse() {
9161
- return {
9162
- leafId: "",
9163
- nodeTxSigningResult: void 0,
9164
- refundTxSigningResult: void 0,
9165
- directNodeTxSigningResult: void 0,
9166
- directRefundTxSigningResult: void 0,
9167
- directFromCpfpRefundTxSigningResult: void 0
9168
- };
9169
- }
9170
- var ExtendLeafResponse = {
9171
- encode(message, writer = new import_wire4.BinaryWriter()) {
9172
- if (message.leafId !== "") {
9173
- writer.uint32(10).string(message.leafId);
9174
- }
9175
- if (message.nodeTxSigningResult !== void 0) {
9176
- ExtendLeafSigningResult.encode(message.nodeTxSigningResult, writer.uint32(18).fork()).join();
9177
- }
9178
- if (message.refundTxSigningResult !== void 0) {
9179
- ExtendLeafSigningResult.encode(message.refundTxSigningResult, writer.uint32(26).fork()).join();
9180
- }
9181
- if (message.directNodeTxSigningResult !== void 0) {
9182
- ExtendLeafSigningResult.encode(message.directNodeTxSigningResult, writer.uint32(34).fork()).join();
9183
- }
9184
- if (message.directRefundTxSigningResult !== void 0) {
9185
- ExtendLeafSigningResult.encode(message.directRefundTxSigningResult, writer.uint32(42).fork()).join();
9186
- }
9187
- if (message.directFromCpfpRefundTxSigningResult !== void 0) {
9188
- ExtendLeafSigningResult.encode(message.directFromCpfpRefundTxSigningResult, writer.uint32(50).fork()).join();
9189
- }
9190
- return writer;
9191
- },
9192
- decode(input, length) {
9193
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
9194
- const end = length === void 0 ? reader.len : reader.pos + length;
9195
- const message = createBaseExtendLeafResponse();
9196
- while (reader.pos < end) {
9197
- const tag = reader.uint32();
9198
- switch (tag >>> 3) {
9199
- case 1: {
9200
- if (tag !== 10) {
9201
- break;
9202
- }
9203
- message.leafId = reader.string();
9204
- continue;
9205
- }
9206
- case 2: {
9207
- if (tag !== 18) {
9208
- break;
9209
- }
9210
- message.nodeTxSigningResult = ExtendLeafSigningResult.decode(reader, reader.uint32());
9211
- continue;
9212
- }
9213
- case 3: {
9214
- if (tag !== 26) {
9215
- break;
9216
- }
9217
- message.refundTxSigningResult = ExtendLeafSigningResult.decode(reader, reader.uint32());
9218
- continue;
9219
- }
9220
- case 4: {
9221
- if (tag !== 34) {
9222
- break;
9223
- }
9224
- message.directNodeTxSigningResult = ExtendLeafSigningResult.decode(reader, reader.uint32());
9225
- continue;
9226
- }
9227
- case 5: {
9228
- if (tag !== 42) {
9229
- break;
9230
- }
9231
- message.directRefundTxSigningResult = ExtendLeafSigningResult.decode(reader, reader.uint32());
9232
- continue;
9233
- }
9234
- case 6: {
9235
- if (tag !== 50) {
9236
- break;
9237
- }
9238
- message.directFromCpfpRefundTxSigningResult = ExtendLeafSigningResult.decode(reader, reader.uint32());
9239
- continue;
9240
- }
9241
- }
9242
- if ((tag & 7) === 4 || tag === 0) {
9243
- break;
9244
- }
9245
- reader.skip(tag & 7);
9246
- }
9247
- return message;
9248
- },
9249
- fromJSON(object) {
9250
- return {
9251
- leafId: isSet3(object.leafId) ? globalThis.String(object.leafId) : "",
9252
- nodeTxSigningResult: isSet3(object.nodeTxSigningResult) ? ExtendLeafSigningResult.fromJSON(object.nodeTxSigningResult) : void 0,
9253
- refundTxSigningResult: isSet3(object.refundTxSigningResult) ? ExtendLeafSigningResult.fromJSON(object.refundTxSigningResult) : void 0,
9254
- directNodeTxSigningResult: isSet3(object.directNodeTxSigningResult) ? ExtendLeafSigningResult.fromJSON(object.directNodeTxSigningResult) : void 0,
9255
- directRefundTxSigningResult: isSet3(object.directRefundTxSigningResult) ? ExtendLeafSigningResult.fromJSON(object.directRefundTxSigningResult) : void 0,
9256
- directFromCpfpRefundTxSigningResult: isSet3(object.directFromCpfpRefundTxSigningResult) ? ExtendLeafSigningResult.fromJSON(object.directFromCpfpRefundTxSigningResult) : void 0
9257
- };
9258
- },
9259
- toJSON(message) {
9260
- const obj = {};
9261
- if (message.leafId !== "") {
9262
- obj.leafId = message.leafId;
9263
- }
9264
- if (message.nodeTxSigningResult !== void 0) {
9265
- obj.nodeTxSigningResult = ExtendLeafSigningResult.toJSON(message.nodeTxSigningResult);
9266
- }
9267
- if (message.refundTxSigningResult !== void 0) {
9268
- obj.refundTxSigningResult = ExtendLeafSigningResult.toJSON(message.refundTxSigningResult);
9269
- }
9270
- if (message.directNodeTxSigningResult !== void 0) {
9271
- obj.directNodeTxSigningResult = ExtendLeafSigningResult.toJSON(message.directNodeTxSigningResult);
9272
- }
9273
- if (message.directRefundTxSigningResult !== void 0) {
9274
- obj.directRefundTxSigningResult = ExtendLeafSigningResult.toJSON(message.directRefundTxSigningResult);
9275
- }
9276
- if (message.directFromCpfpRefundTxSigningResult !== void 0) {
9277
- obj.directFromCpfpRefundTxSigningResult = ExtendLeafSigningResult.toJSON(
9278
- message.directFromCpfpRefundTxSigningResult
9279
- );
9280
- }
9281
- return obj;
9282
- },
9283
- create(base) {
9284
- return ExtendLeafResponse.fromPartial(base ?? {});
9285
- },
9286
- fromPartial(object) {
9287
- const message = createBaseExtendLeafResponse();
9288
- message.leafId = object.leafId ?? "";
9289
- message.nodeTxSigningResult = object.nodeTxSigningResult !== void 0 && object.nodeTxSigningResult !== null ? ExtendLeafSigningResult.fromPartial(object.nodeTxSigningResult) : void 0;
9290
- message.refundTxSigningResult = object.refundTxSigningResult !== void 0 && object.refundTxSigningResult !== null ? ExtendLeafSigningResult.fromPartial(object.refundTxSigningResult) : void 0;
9291
- message.directNodeTxSigningResult = object.directNodeTxSigningResult !== void 0 && object.directNodeTxSigningResult !== null ? ExtendLeafSigningResult.fromPartial(object.directNodeTxSigningResult) : void 0;
9292
- message.directRefundTxSigningResult = object.directRefundTxSigningResult !== void 0 && object.directRefundTxSigningResult !== null ? ExtendLeafSigningResult.fromPartial(object.directRefundTxSigningResult) : void 0;
9293
- message.directFromCpfpRefundTxSigningResult = object.directFromCpfpRefundTxSigningResult !== void 0 && object.directFromCpfpRefundTxSigningResult !== null ? ExtendLeafSigningResult.fromPartial(object.directFromCpfpRefundTxSigningResult) : void 0;
9294
- return message;
9295
- }
9296
- };
9297
8213
  function createBaseSigningOperatorInfo() {
9298
8214
  return { index: 0, identifier: "", publicKey: new Uint8Array(0), address: "" };
9299
8215
  }
@@ -10543,125 +9459,6 @@ var QueryNodesResponse_NodesEntry = {
10543
9459
  return message;
10544
9460
  }
10545
9461
  };
10546
- function createBaseCancelTransferRequest() {
10547
- return { transferId: "", senderIdentityPublicKey: new Uint8Array(0) };
10548
- }
10549
- var CancelTransferRequest = {
10550
- encode(message, writer = new import_wire4.BinaryWriter()) {
10551
- if (message.transferId !== "") {
10552
- writer.uint32(10).string(message.transferId);
10553
- }
10554
- if (message.senderIdentityPublicKey.length !== 0) {
10555
- writer.uint32(18).bytes(message.senderIdentityPublicKey);
10556
- }
10557
- return writer;
10558
- },
10559
- decode(input, length) {
10560
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
10561
- const end = length === void 0 ? reader.len : reader.pos + length;
10562
- const message = createBaseCancelTransferRequest();
10563
- while (reader.pos < end) {
10564
- const tag = reader.uint32();
10565
- switch (tag >>> 3) {
10566
- case 1: {
10567
- if (tag !== 10) {
10568
- break;
10569
- }
10570
- message.transferId = reader.string();
10571
- continue;
10572
- }
10573
- case 2: {
10574
- if (tag !== 18) {
10575
- break;
10576
- }
10577
- message.senderIdentityPublicKey = reader.bytes();
10578
- continue;
10579
- }
10580
- }
10581
- if ((tag & 7) === 4 || tag === 0) {
10582
- break;
10583
- }
10584
- reader.skip(tag & 7);
10585
- }
10586
- return message;
10587
- },
10588
- fromJSON(object) {
10589
- return {
10590
- transferId: isSet3(object.transferId) ? globalThis.String(object.transferId) : "",
10591
- senderIdentityPublicKey: isSet3(object.senderIdentityPublicKey) ? bytesFromBase642(object.senderIdentityPublicKey) : new Uint8Array(0)
10592
- };
10593
- },
10594
- toJSON(message) {
10595
- const obj = {};
10596
- if (message.transferId !== "") {
10597
- obj.transferId = message.transferId;
10598
- }
10599
- if (message.senderIdentityPublicKey.length !== 0) {
10600
- obj.senderIdentityPublicKey = base64FromBytes2(message.senderIdentityPublicKey);
10601
- }
10602
- return obj;
10603
- },
10604
- create(base) {
10605
- return CancelTransferRequest.fromPartial(base ?? {});
10606
- },
10607
- fromPartial(object) {
10608
- const message = createBaseCancelTransferRequest();
10609
- message.transferId = object.transferId ?? "";
10610
- message.senderIdentityPublicKey = object.senderIdentityPublicKey ?? new Uint8Array(0);
10611
- return message;
10612
- }
10613
- };
10614
- function createBaseCancelTransferResponse() {
10615
- return { transfer: void 0 };
10616
- }
10617
- var CancelTransferResponse = {
10618
- encode(message, writer = new import_wire4.BinaryWriter()) {
10619
- if (message.transfer !== void 0) {
10620
- Transfer.encode(message.transfer, writer.uint32(10).fork()).join();
10621
- }
10622
- return writer;
10623
- },
10624
- decode(input, length) {
10625
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
10626
- const end = length === void 0 ? reader.len : reader.pos + length;
10627
- const message = createBaseCancelTransferResponse();
10628
- while (reader.pos < end) {
10629
- const tag = reader.uint32();
10630
- switch (tag >>> 3) {
10631
- case 1: {
10632
- if (tag !== 10) {
10633
- break;
10634
- }
10635
- message.transfer = Transfer.decode(reader, reader.uint32());
10636
- continue;
10637
- }
10638
- }
10639
- if ((tag & 7) === 4 || tag === 0) {
10640
- break;
10641
- }
10642
- reader.skip(tag & 7);
10643
- }
10644
- return message;
10645
- },
10646
- fromJSON(object) {
10647
- return { transfer: isSet3(object.transfer) ? Transfer.fromJSON(object.transfer) : void 0 };
10648
- },
10649
- toJSON(message) {
10650
- const obj = {};
10651
- if (message.transfer !== void 0) {
10652
- obj.transfer = Transfer.toJSON(message.transfer);
10653
- }
10654
- return obj;
10655
- },
10656
- create(base) {
10657
- return CancelTransferResponse.fromPartial(base ?? {});
10658
- },
10659
- fromPartial(object) {
10660
- const message = createBaseCancelTransferResponse();
10661
- message.transfer = object.transfer !== void 0 && object.transfer !== null ? Transfer.fromPartial(object.transfer) : void 0;
10662
- return message;
10663
- }
10664
- };
10665
9462
  function createBaseQueryUnusedDepositAddressesRequest() {
10666
9463
  return { identityPublicKey: new Uint8Array(0), network: 0, limit: 0, offset: 0 };
10667
9464
  }
@@ -11861,267 +10658,6 @@ var InitiateStaticDepositUtxoRefundResponse = {
11861
10658
  return message;
11862
10659
  }
11863
10660
  };
11864
- function createBaseInitiateUtxoSwapRequest() {
11865
- return {
11866
- onChainUtxo: void 0,
11867
- requestType: 0,
11868
- amount: void 0,
11869
- sspSignature: new Uint8Array(0),
11870
- userSignature: new Uint8Array(0),
11871
- transfer: void 0,
11872
- spendTxSigningJob: void 0
11873
- };
11874
- }
11875
- var InitiateUtxoSwapRequest = {
11876
- encode(message, writer = new import_wire4.BinaryWriter()) {
11877
- if (message.onChainUtxo !== void 0) {
11878
- UTXO.encode(message.onChainUtxo, writer.uint32(10).fork()).join();
11879
- }
11880
- if (message.requestType !== 0) {
11881
- writer.uint32(16).int32(message.requestType);
11882
- }
11883
- switch (message.amount?.$case) {
11884
- case "creditAmountSats":
11885
- writer.uint32(24).uint64(message.amount.creditAmountSats);
11886
- break;
11887
- case "maxFeeSats":
11888
- writer.uint32(32).uint64(message.amount.maxFeeSats);
11889
- break;
11890
- }
11891
- if (message.sspSignature.length !== 0) {
11892
- writer.uint32(42).bytes(message.sspSignature);
11893
- }
11894
- if (message.userSignature.length !== 0) {
11895
- writer.uint32(50).bytes(message.userSignature);
11896
- }
11897
- if (message.transfer !== void 0) {
11898
- StartTransferRequest.encode(message.transfer, writer.uint32(58).fork()).join();
11899
- }
11900
- if (message.spendTxSigningJob !== void 0) {
11901
- SigningJob.encode(message.spendTxSigningJob, writer.uint32(66).fork()).join();
11902
- }
11903
- return writer;
11904
- },
11905
- decode(input, length) {
11906
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
11907
- const end = length === void 0 ? reader.len : reader.pos + length;
11908
- const message = createBaseInitiateUtxoSwapRequest();
11909
- while (reader.pos < end) {
11910
- const tag = reader.uint32();
11911
- switch (tag >>> 3) {
11912
- case 1: {
11913
- if (tag !== 10) {
11914
- break;
11915
- }
11916
- message.onChainUtxo = UTXO.decode(reader, reader.uint32());
11917
- continue;
11918
- }
11919
- case 2: {
11920
- if (tag !== 16) {
11921
- break;
11922
- }
11923
- message.requestType = reader.int32();
11924
- continue;
11925
- }
11926
- case 3: {
11927
- if (tag !== 24) {
11928
- break;
11929
- }
11930
- message.amount = { $case: "creditAmountSats", creditAmountSats: longToNumber2(reader.uint64()) };
11931
- continue;
11932
- }
11933
- case 4: {
11934
- if (tag !== 32) {
11935
- break;
11936
- }
11937
- message.amount = { $case: "maxFeeSats", maxFeeSats: longToNumber2(reader.uint64()) };
11938
- continue;
11939
- }
11940
- case 5: {
11941
- if (tag !== 42) {
11942
- break;
11943
- }
11944
- message.sspSignature = reader.bytes();
11945
- continue;
11946
- }
11947
- case 6: {
11948
- if (tag !== 50) {
11949
- break;
11950
- }
11951
- message.userSignature = reader.bytes();
11952
- continue;
11953
- }
11954
- case 7: {
11955
- if (tag !== 58) {
11956
- break;
11957
- }
11958
- message.transfer = StartTransferRequest.decode(reader, reader.uint32());
11959
- continue;
11960
- }
11961
- case 8: {
11962
- if (tag !== 66) {
11963
- break;
11964
- }
11965
- message.spendTxSigningJob = SigningJob.decode(reader, reader.uint32());
11966
- continue;
11967
- }
11968
- }
11969
- if ((tag & 7) === 4 || tag === 0) {
11970
- break;
11971
- }
11972
- reader.skip(tag & 7);
11973
- }
11974
- return message;
11975
- },
11976
- fromJSON(object) {
11977
- return {
11978
- onChainUtxo: isSet3(object.onChainUtxo) ? UTXO.fromJSON(object.onChainUtxo) : void 0,
11979
- requestType: isSet3(object.requestType) ? utxoSwapRequestTypeFromJSON(object.requestType) : 0,
11980
- amount: isSet3(object.creditAmountSats) ? { $case: "creditAmountSats", creditAmountSats: globalThis.Number(object.creditAmountSats) } : isSet3(object.maxFeeSats) ? { $case: "maxFeeSats", maxFeeSats: globalThis.Number(object.maxFeeSats) } : void 0,
11981
- sspSignature: isSet3(object.sspSignature) ? bytesFromBase642(object.sspSignature) : new Uint8Array(0),
11982
- userSignature: isSet3(object.userSignature) ? bytesFromBase642(object.userSignature) : new Uint8Array(0),
11983
- transfer: isSet3(object.transfer) ? StartTransferRequest.fromJSON(object.transfer) : void 0,
11984
- spendTxSigningJob: isSet3(object.spendTxSigningJob) ? SigningJob.fromJSON(object.spendTxSigningJob) : void 0
11985
- };
11986
- },
11987
- toJSON(message) {
11988
- const obj = {};
11989
- if (message.onChainUtxo !== void 0) {
11990
- obj.onChainUtxo = UTXO.toJSON(message.onChainUtxo);
11991
- }
11992
- if (message.requestType !== 0) {
11993
- obj.requestType = utxoSwapRequestTypeToJSON(message.requestType);
11994
- }
11995
- if (message.amount?.$case === "creditAmountSats") {
11996
- obj.creditAmountSats = Math.round(message.amount.creditAmountSats);
11997
- } else if (message.amount?.$case === "maxFeeSats") {
11998
- obj.maxFeeSats = Math.round(message.amount.maxFeeSats);
11999
- }
12000
- if (message.sspSignature.length !== 0) {
12001
- obj.sspSignature = base64FromBytes2(message.sspSignature);
12002
- }
12003
- if (message.userSignature.length !== 0) {
12004
- obj.userSignature = base64FromBytes2(message.userSignature);
12005
- }
12006
- if (message.transfer !== void 0) {
12007
- obj.transfer = StartTransferRequest.toJSON(message.transfer);
12008
- }
12009
- if (message.spendTxSigningJob !== void 0) {
12010
- obj.spendTxSigningJob = SigningJob.toJSON(message.spendTxSigningJob);
12011
- }
12012
- return obj;
12013
- },
12014
- create(base) {
12015
- return InitiateUtxoSwapRequest.fromPartial(base ?? {});
12016
- },
12017
- fromPartial(object) {
12018
- const message = createBaseInitiateUtxoSwapRequest();
12019
- message.onChainUtxo = object.onChainUtxo !== void 0 && object.onChainUtxo !== null ? UTXO.fromPartial(object.onChainUtxo) : void 0;
12020
- message.requestType = object.requestType ?? 0;
12021
- switch (object.amount?.$case) {
12022
- case "creditAmountSats": {
12023
- if (object.amount?.creditAmountSats !== void 0 && object.amount?.creditAmountSats !== null) {
12024
- message.amount = { $case: "creditAmountSats", creditAmountSats: object.amount.creditAmountSats };
12025
- }
12026
- break;
12027
- }
12028
- case "maxFeeSats": {
12029
- if (object.amount?.maxFeeSats !== void 0 && object.amount?.maxFeeSats !== null) {
12030
- message.amount = { $case: "maxFeeSats", maxFeeSats: object.amount.maxFeeSats };
12031
- }
12032
- break;
12033
- }
12034
- }
12035
- message.sspSignature = object.sspSignature ?? new Uint8Array(0);
12036
- message.userSignature = object.userSignature ?? new Uint8Array(0);
12037
- message.transfer = object.transfer !== void 0 && object.transfer !== null ? StartTransferRequest.fromPartial(object.transfer) : void 0;
12038
- message.spendTxSigningJob = object.spendTxSigningJob !== void 0 && object.spendTxSigningJob !== null ? SigningJob.fromPartial(object.spendTxSigningJob) : void 0;
12039
- return message;
12040
- }
12041
- };
12042
- function createBaseInitiateUtxoSwapResponse() {
12043
- return { spendTxSigningResult: void 0, transfer: void 0, depositAddress: void 0 };
12044
- }
12045
- var InitiateUtxoSwapResponse = {
12046
- encode(message, writer = new import_wire4.BinaryWriter()) {
12047
- if (message.spendTxSigningResult !== void 0) {
12048
- SigningResult.encode(message.spendTxSigningResult, writer.uint32(10).fork()).join();
12049
- }
12050
- if (message.transfer !== void 0) {
12051
- Transfer.encode(message.transfer, writer.uint32(18).fork()).join();
12052
- }
12053
- if (message.depositAddress !== void 0) {
12054
- DepositAddressQueryResult.encode(message.depositAddress, writer.uint32(26).fork()).join();
12055
- }
12056
- return writer;
12057
- },
12058
- decode(input, length) {
12059
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
12060
- const end = length === void 0 ? reader.len : reader.pos + length;
12061
- const message = createBaseInitiateUtxoSwapResponse();
12062
- while (reader.pos < end) {
12063
- const tag = reader.uint32();
12064
- switch (tag >>> 3) {
12065
- case 1: {
12066
- if (tag !== 10) {
12067
- break;
12068
- }
12069
- message.spendTxSigningResult = SigningResult.decode(reader, reader.uint32());
12070
- continue;
12071
- }
12072
- case 2: {
12073
- if (tag !== 18) {
12074
- break;
12075
- }
12076
- message.transfer = Transfer.decode(reader, reader.uint32());
12077
- continue;
12078
- }
12079
- case 3: {
12080
- if (tag !== 26) {
12081
- break;
12082
- }
12083
- message.depositAddress = DepositAddressQueryResult.decode(reader, reader.uint32());
12084
- continue;
12085
- }
12086
- }
12087
- if ((tag & 7) === 4 || tag === 0) {
12088
- break;
12089
- }
12090
- reader.skip(tag & 7);
12091
- }
12092
- return message;
12093
- },
12094
- fromJSON(object) {
12095
- return {
12096
- spendTxSigningResult: isSet3(object.spendTxSigningResult) ? SigningResult.fromJSON(object.spendTxSigningResult) : void 0,
12097
- transfer: isSet3(object.transfer) ? Transfer.fromJSON(object.transfer) : void 0,
12098
- depositAddress: isSet3(object.depositAddress) ? DepositAddressQueryResult.fromJSON(object.depositAddress) : void 0
12099
- };
12100
- },
12101
- toJSON(message) {
12102
- const obj = {};
12103
- if (message.spendTxSigningResult !== void 0) {
12104
- obj.spendTxSigningResult = SigningResult.toJSON(message.spendTxSigningResult);
12105
- }
12106
- if (message.transfer !== void 0) {
12107
- obj.transfer = Transfer.toJSON(message.transfer);
12108
- }
12109
- if (message.depositAddress !== void 0) {
12110
- obj.depositAddress = DepositAddressQueryResult.toJSON(message.depositAddress);
12111
- }
12112
- return obj;
12113
- },
12114
- create(base) {
12115
- return InitiateUtxoSwapResponse.fromPartial(base ?? {});
12116
- },
12117
- fromPartial(object) {
12118
- const message = createBaseInitiateUtxoSwapResponse();
12119
- message.spendTxSigningResult = object.spendTxSigningResult !== void 0 && object.spendTxSigningResult !== null ? SigningResult.fromPartial(object.spendTxSigningResult) : void 0;
12120
- message.transfer = object.transfer !== void 0 && object.transfer !== null ? Transfer.fromPartial(object.transfer) : void 0;
12121
- message.depositAddress = object.depositAddress !== void 0 && object.depositAddress !== null ? DepositAddressQueryResult.fromPartial(object.depositAddress) : void 0;
12122
- return message;
12123
- }
12124
- };
12125
10661
  function createBaseExitingTree() {
12126
10662
  return { treeId: "", userSigningCommitment: void 0, vin: 0 };
12127
10663
  }
@@ -12507,451 +11043,6 @@ var ExitSingleNodeTreesResponse = {
12507
11043
  return message;
12508
11044
  }
12509
11045
  };
12510
- function createBaseQueryNodesDistributionRequest() {
12511
- return { ownerIdentityPublicKey: new Uint8Array(0) };
12512
- }
12513
- var QueryNodesDistributionRequest = {
12514
- encode(message, writer = new import_wire4.BinaryWriter()) {
12515
- if (message.ownerIdentityPublicKey.length !== 0) {
12516
- writer.uint32(10).bytes(message.ownerIdentityPublicKey);
12517
- }
12518
- return writer;
12519
- },
12520
- decode(input, length) {
12521
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
12522
- const end = length === void 0 ? reader.len : reader.pos + length;
12523
- const message = createBaseQueryNodesDistributionRequest();
12524
- while (reader.pos < end) {
12525
- const tag = reader.uint32();
12526
- switch (tag >>> 3) {
12527
- case 1: {
12528
- if (tag !== 10) {
12529
- break;
12530
- }
12531
- message.ownerIdentityPublicKey = reader.bytes();
12532
- continue;
12533
- }
12534
- }
12535
- if ((tag & 7) === 4 || tag === 0) {
12536
- break;
12537
- }
12538
- reader.skip(tag & 7);
12539
- }
12540
- return message;
12541
- },
12542
- fromJSON(object) {
12543
- return {
12544
- ownerIdentityPublicKey: isSet3(object.ownerIdentityPublicKey) ? bytesFromBase642(object.ownerIdentityPublicKey) : new Uint8Array(0)
12545
- };
12546
- },
12547
- toJSON(message) {
12548
- const obj = {};
12549
- if (message.ownerIdentityPublicKey.length !== 0) {
12550
- obj.ownerIdentityPublicKey = base64FromBytes2(message.ownerIdentityPublicKey);
12551
- }
12552
- return obj;
12553
- },
12554
- create(base) {
12555
- return QueryNodesDistributionRequest.fromPartial(base ?? {});
12556
- },
12557
- fromPartial(object) {
12558
- const message = createBaseQueryNodesDistributionRequest();
12559
- message.ownerIdentityPublicKey = object.ownerIdentityPublicKey ?? new Uint8Array(0);
12560
- return message;
12561
- }
12562
- };
12563
- function createBaseQueryNodesDistributionResponse() {
12564
- return { nodeDistribution: {} };
12565
- }
12566
- var QueryNodesDistributionResponse = {
12567
- encode(message, writer = new import_wire4.BinaryWriter()) {
12568
- Object.entries(message.nodeDistribution).forEach(([key, value]) => {
12569
- QueryNodesDistributionResponse_NodeDistributionEntry.encode({ key, value }, writer.uint32(10).fork()).join();
12570
- });
12571
- return writer;
12572
- },
12573
- decode(input, length) {
12574
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
12575
- const end = length === void 0 ? reader.len : reader.pos + length;
12576
- const message = createBaseQueryNodesDistributionResponse();
12577
- while (reader.pos < end) {
12578
- const tag = reader.uint32();
12579
- switch (tag >>> 3) {
12580
- case 1: {
12581
- if (tag !== 10) {
12582
- break;
12583
- }
12584
- const entry1 = QueryNodesDistributionResponse_NodeDistributionEntry.decode(reader, reader.uint32());
12585
- if (entry1.value !== void 0) {
12586
- message.nodeDistribution[entry1.key] = entry1.value;
12587
- }
12588
- continue;
12589
- }
12590
- }
12591
- if ((tag & 7) === 4 || tag === 0) {
12592
- break;
12593
- }
12594
- reader.skip(tag & 7);
12595
- }
12596
- return message;
12597
- },
12598
- fromJSON(object) {
12599
- return {
12600
- nodeDistribution: isObject(object.nodeDistribution) ? Object.entries(object.nodeDistribution).reduce((acc, [key, value]) => {
12601
- acc[globalThis.Number(key)] = Number(value);
12602
- return acc;
12603
- }, {}) : {}
12604
- };
12605
- },
12606
- toJSON(message) {
12607
- const obj = {};
12608
- if (message.nodeDistribution) {
12609
- const entries = Object.entries(message.nodeDistribution);
12610
- if (entries.length > 0) {
12611
- obj.nodeDistribution = {};
12612
- entries.forEach(([k, v]) => {
12613
- obj.nodeDistribution[k] = Math.round(v);
12614
- });
12615
- }
12616
- }
12617
- return obj;
12618
- },
12619
- create(base) {
12620
- return QueryNodesDistributionResponse.fromPartial(base ?? {});
12621
- },
12622
- fromPartial(object) {
12623
- const message = createBaseQueryNodesDistributionResponse();
12624
- message.nodeDistribution = Object.entries(object.nodeDistribution ?? {}).reduce(
12625
- (acc, [key, value]) => {
12626
- if (value !== void 0) {
12627
- acc[globalThis.Number(key)] = globalThis.Number(value);
12628
- }
12629
- return acc;
12630
- },
12631
- {}
12632
- );
12633
- return message;
12634
- }
12635
- };
12636
- function createBaseQueryNodesDistributionResponse_NodeDistributionEntry() {
12637
- return { key: 0, value: 0 };
12638
- }
12639
- var QueryNodesDistributionResponse_NodeDistributionEntry = {
12640
- encode(message, writer = new import_wire4.BinaryWriter()) {
12641
- if (message.key !== 0) {
12642
- writer.uint32(8).uint64(message.key);
12643
- }
12644
- if (message.value !== 0) {
12645
- writer.uint32(16).uint64(message.value);
12646
- }
12647
- return writer;
12648
- },
12649
- decode(input, length) {
12650
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
12651
- const end = length === void 0 ? reader.len : reader.pos + length;
12652
- const message = createBaseQueryNodesDistributionResponse_NodeDistributionEntry();
12653
- while (reader.pos < end) {
12654
- const tag = reader.uint32();
12655
- switch (tag >>> 3) {
12656
- case 1: {
12657
- if (tag !== 8) {
12658
- break;
12659
- }
12660
- message.key = longToNumber2(reader.uint64());
12661
- continue;
12662
- }
12663
- case 2: {
12664
- if (tag !== 16) {
12665
- break;
12666
- }
12667
- message.value = longToNumber2(reader.uint64());
12668
- continue;
12669
- }
12670
- }
12671
- if ((tag & 7) === 4 || tag === 0) {
12672
- break;
12673
- }
12674
- reader.skip(tag & 7);
12675
- }
12676
- return message;
12677
- },
12678
- fromJSON(object) {
12679
- return {
12680
- key: isSet3(object.key) ? globalThis.Number(object.key) : 0,
12681
- value: isSet3(object.value) ? globalThis.Number(object.value) : 0
12682
- };
12683
- },
12684
- toJSON(message) {
12685
- const obj = {};
12686
- if (message.key !== 0) {
12687
- obj.key = Math.round(message.key);
12688
- }
12689
- if (message.value !== 0) {
12690
- obj.value = Math.round(message.value);
12691
- }
12692
- return obj;
12693
- },
12694
- create(base) {
12695
- return QueryNodesDistributionResponse_NodeDistributionEntry.fromPartial(base ?? {});
12696
- },
12697
- fromPartial(object) {
12698
- const message = createBaseQueryNodesDistributionResponse_NodeDistributionEntry();
12699
- message.key = object.key ?? 0;
12700
- message.value = object.value ?? 0;
12701
- return message;
12702
- }
12703
- };
12704
- function createBaseQueryNodesByValueRequest() {
12705
- return { ownerIdentityPublicKey: new Uint8Array(0), value: 0, offset: 0, limit: 0 };
12706
- }
12707
- var QueryNodesByValueRequest = {
12708
- encode(message, writer = new import_wire4.BinaryWriter()) {
12709
- if (message.ownerIdentityPublicKey.length !== 0) {
12710
- writer.uint32(10).bytes(message.ownerIdentityPublicKey);
12711
- }
12712
- if (message.value !== 0) {
12713
- writer.uint32(16).int64(message.value);
12714
- }
12715
- if (message.offset !== 0) {
12716
- writer.uint32(24).int64(message.offset);
12717
- }
12718
- if (message.limit !== 0) {
12719
- writer.uint32(32).int64(message.limit);
12720
- }
12721
- return writer;
12722
- },
12723
- decode(input, length) {
12724
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
12725
- const end = length === void 0 ? reader.len : reader.pos + length;
12726
- const message = createBaseQueryNodesByValueRequest();
12727
- while (reader.pos < end) {
12728
- const tag = reader.uint32();
12729
- switch (tag >>> 3) {
12730
- case 1: {
12731
- if (tag !== 10) {
12732
- break;
12733
- }
12734
- message.ownerIdentityPublicKey = reader.bytes();
12735
- continue;
12736
- }
12737
- case 2: {
12738
- if (tag !== 16) {
12739
- break;
12740
- }
12741
- message.value = longToNumber2(reader.int64());
12742
- continue;
12743
- }
12744
- case 3: {
12745
- if (tag !== 24) {
12746
- break;
12747
- }
12748
- message.offset = longToNumber2(reader.int64());
12749
- continue;
12750
- }
12751
- case 4: {
12752
- if (tag !== 32) {
12753
- break;
12754
- }
12755
- message.limit = longToNumber2(reader.int64());
12756
- continue;
12757
- }
12758
- }
12759
- if ((tag & 7) === 4 || tag === 0) {
12760
- break;
12761
- }
12762
- reader.skip(tag & 7);
12763
- }
12764
- return message;
12765
- },
12766
- fromJSON(object) {
12767
- return {
12768
- ownerIdentityPublicKey: isSet3(object.ownerIdentityPublicKey) ? bytesFromBase642(object.ownerIdentityPublicKey) : new Uint8Array(0),
12769
- value: isSet3(object.value) ? globalThis.Number(object.value) : 0,
12770
- offset: isSet3(object.offset) ? globalThis.Number(object.offset) : 0,
12771
- limit: isSet3(object.limit) ? globalThis.Number(object.limit) : 0
12772
- };
12773
- },
12774
- toJSON(message) {
12775
- const obj = {};
12776
- if (message.ownerIdentityPublicKey.length !== 0) {
12777
- obj.ownerIdentityPublicKey = base64FromBytes2(message.ownerIdentityPublicKey);
12778
- }
12779
- if (message.value !== 0) {
12780
- obj.value = Math.round(message.value);
12781
- }
12782
- if (message.offset !== 0) {
12783
- obj.offset = Math.round(message.offset);
12784
- }
12785
- if (message.limit !== 0) {
12786
- obj.limit = Math.round(message.limit);
12787
- }
12788
- return obj;
12789
- },
12790
- create(base) {
12791
- return QueryNodesByValueRequest.fromPartial(base ?? {});
12792
- },
12793
- fromPartial(object) {
12794
- const message = createBaseQueryNodesByValueRequest();
12795
- message.ownerIdentityPublicKey = object.ownerIdentityPublicKey ?? new Uint8Array(0);
12796
- message.value = object.value ?? 0;
12797
- message.offset = object.offset ?? 0;
12798
- message.limit = object.limit ?? 0;
12799
- return message;
12800
- }
12801
- };
12802
- function createBaseQueryNodesByValueResponse() {
12803
- return { nodes: {}, offset: 0 };
12804
- }
12805
- var QueryNodesByValueResponse = {
12806
- encode(message, writer = new import_wire4.BinaryWriter()) {
12807
- Object.entries(message.nodes).forEach(([key, value]) => {
12808
- QueryNodesByValueResponse_NodesEntry.encode({ key, value }, writer.uint32(10).fork()).join();
12809
- });
12810
- if (message.offset !== 0) {
12811
- writer.uint32(16).int64(message.offset);
12812
- }
12813
- return writer;
12814
- },
12815
- decode(input, length) {
12816
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
12817
- const end = length === void 0 ? reader.len : reader.pos + length;
12818
- const message = createBaseQueryNodesByValueResponse();
12819
- while (reader.pos < end) {
12820
- const tag = reader.uint32();
12821
- switch (tag >>> 3) {
12822
- case 1: {
12823
- if (tag !== 10) {
12824
- break;
12825
- }
12826
- const entry1 = QueryNodesByValueResponse_NodesEntry.decode(reader, reader.uint32());
12827
- if (entry1.value !== void 0) {
12828
- message.nodes[entry1.key] = entry1.value;
12829
- }
12830
- continue;
12831
- }
12832
- case 2: {
12833
- if (tag !== 16) {
12834
- break;
12835
- }
12836
- message.offset = longToNumber2(reader.int64());
12837
- continue;
12838
- }
12839
- }
12840
- if ((tag & 7) === 4 || tag === 0) {
12841
- break;
12842
- }
12843
- reader.skip(tag & 7);
12844
- }
12845
- return message;
12846
- },
12847
- fromJSON(object) {
12848
- return {
12849
- nodes: isObject(object.nodes) ? Object.entries(object.nodes).reduce((acc, [key, value]) => {
12850
- acc[key] = TreeNode.fromJSON(value);
12851
- return acc;
12852
- }, {}) : {},
12853
- offset: isSet3(object.offset) ? globalThis.Number(object.offset) : 0
12854
- };
12855
- },
12856
- toJSON(message) {
12857
- const obj = {};
12858
- if (message.nodes) {
12859
- const entries = Object.entries(message.nodes);
12860
- if (entries.length > 0) {
12861
- obj.nodes = {};
12862
- entries.forEach(([k, v]) => {
12863
- obj.nodes[k] = TreeNode.toJSON(v);
12864
- });
12865
- }
12866
- }
12867
- if (message.offset !== 0) {
12868
- obj.offset = Math.round(message.offset);
12869
- }
12870
- return obj;
12871
- },
12872
- create(base) {
12873
- return QueryNodesByValueResponse.fromPartial(base ?? {});
12874
- },
12875
- fromPartial(object) {
12876
- const message = createBaseQueryNodesByValueResponse();
12877
- message.nodes = Object.entries(object.nodes ?? {}).reduce((acc, [key, value]) => {
12878
- if (value !== void 0) {
12879
- acc[key] = TreeNode.fromPartial(value);
12880
- }
12881
- return acc;
12882
- }, {});
12883
- message.offset = object.offset ?? 0;
12884
- return message;
12885
- }
12886
- };
12887
- function createBaseQueryNodesByValueResponse_NodesEntry() {
12888
- return { key: "", value: void 0 };
12889
- }
12890
- var QueryNodesByValueResponse_NodesEntry = {
12891
- encode(message, writer = new import_wire4.BinaryWriter()) {
12892
- if (message.key !== "") {
12893
- writer.uint32(10).string(message.key);
12894
- }
12895
- if (message.value !== void 0) {
12896
- TreeNode.encode(message.value, writer.uint32(18).fork()).join();
12897
- }
12898
- return writer;
12899
- },
12900
- decode(input, length) {
12901
- const reader = input instanceof import_wire4.BinaryReader ? input : new import_wire4.BinaryReader(input);
12902
- const end = length === void 0 ? reader.len : reader.pos + length;
12903
- const message = createBaseQueryNodesByValueResponse_NodesEntry();
12904
- while (reader.pos < end) {
12905
- const tag = reader.uint32();
12906
- switch (tag >>> 3) {
12907
- case 1: {
12908
- if (tag !== 10) {
12909
- break;
12910
- }
12911
- message.key = reader.string();
12912
- continue;
12913
- }
12914
- case 2: {
12915
- if (tag !== 18) {
12916
- break;
12917
- }
12918
- message.value = TreeNode.decode(reader, reader.uint32());
12919
- continue;
12920
- }
12921
- }
12922
- if ((tag & 7) === 4 || tag === 0) {
12923
- break;
12924
- }
12925
- reader.skip(tag & 7);
12926
- }
12927
- return message;
12928
- },
12929
- fromJSON(object) {
12930
- return {
12931
- key: isSet3(object.key) ? globalThis.String(object.key) : "",
12932
- value: isSet3(object.value) ? TreeNode.fromJSON(object.value) : void 0
12933
- };
12934
- },
12935
- toJSON(message) {
12936
- const obj = {};
12937
- if (message.key !== "") {
12938
- obj.key = message.key;
12939
- }
12940
- if (message.value !== void 0) {
12941
- obj.value = TreeNode.toJSON(message.value);
12942
- }
12943
- return obj;
12944
- },
12945
- create(base) {
12946
- return QueryNodesByValueResponse_NodesEntry.fromPartial(base ?? {});
12947
- },
12948
- fromPartial(object) {
12949
- const message = createBaseQueryNodesByValueResponse_NodesEntry();
12950
- message.key = object.key ?? "";
12951
- message.value = object.value !== void 0 && object.value !== null ? TreeNode.fromPartial(object.value) : void 0;
12952
- return message;
12953
- }
12954
- };
12955
11046
  function createBaseGetUtxosForAddressRequest() {
12956
11047
  return { address: "", offset: 0, limit: 0, network: 0, excludeClaimed: false };
12957
11048
  }
@@ -13731,7 +11822,7 @@ var AdaptorPublicKeyPackage = {
13731
11822
  }
13732
11823
  };
13733
11824
  function createBaseWalletSetting() {
13734
- return { ownerIdentityPublicKey: new Uint8Array(0), privateEnabled: false };
11825
+ return { ownerIdentityPublicKey: new Uint8Array(0), privateEnabled: false, masterIdentityPublicKey: void 0 };
13735
11826
  }
13736
11827
  var WalletSetting = {
13737
11828
  encode(message, writer = new import_wire4.BinaryWriter()) {
@@ -13741,6 +11832,9 @@ var WalletSetting = {
13741
11832
  if (message.privateEnabled !== false) {
13742
11833
  writer.uint32(16).bool(message.privateEnabled);
13743
11834
  }
11835
+ if (message.masterIdentityPublicKey !== void 0) {
11836
+ writer.uint32(26).bytes(message.masterIdentityPublicKey);
11837
+ }
13744
11838
  return writer;
13745
11839
  },
13746
11840
  decode(input, length) {
@@ -13764,6 +11858,13 @@ var WalletSetting = {
13764
11858
  message.privateEnabled = reader.bool();
13765
11859
  continue;
13766
11860
  }
11861
+ case 3: {
11862
+ if (tag !== 26) {
11863
+ break;
11864
+ }
11865
+ message.masterIdentityPublicKey = reader.bytes();
11866
+ continue;
11867
+ }
13767
11868
  }
13768
11869
  if ((tag & 7) === 4 || tag === 0) {
13769
11870
  break;
@@ -13775,7 +11876,8 @@ var WalletSetting = {
13775
11876
  fromJSON(object) {
13776
11877
  return {
13777
11878
  ownerIdentityPublicKey: isSet3(object.ownerIdentityPublicKey) ? bytesFromBase642(object.ownerIdentityPublicKey) : new Uint8Array(0),
13778
- privateEnabled: isSet3(object.privateEnabled) ? globalThis.Boolean(object.privateEnabled) : false
11879
+ privateEnabled: isSet3(object.privateEnabled) ? globalThis.Boolean(object.privateEnabled) : false,
11880
+ masterIdentityPublicKey: isSet3(object.masterIdentityPublicKey) ? bytesFromBase642(object.masterIdentityPublicKey) : void 0
13779
11881
  };
13780
11882
  },
13781
11883
  toJSON(message) {
@@ -13786,6 +11888,9 @@ var WalletSetting = {
13786
11888
  if (message.privateEnabled !== false) {
13787
11889
  obj.privateEnabled = message.privateEnabled;
13788
11890
  }
11891
+ if (message.masterIdentityPublicKey !== void 0) {
11892
+ obj.masterIdentityPublicKey = base64FromBytes2(message.masterIdentityPublicKey);
11893
+ }
13789
11894
  return obj;
13790
11895
  },
13791
11896
  create(base) {
@@ -13795,17 +11900,26 @@ var WalletSetting = {
13795
11900
  const message = createBaseWalletSetting();
13796
11901
  message.ownerIdentityPublicKey = object.ownerIdentityPublicKey ?? new Uint8Array(0);
13797
11902
  message.privateEnabled = object.privateEnabled ?? false;
11903
+ message.masterIdentityPublicKey = object.masterIdentityPublicKey ?? void 0;
13798
11904
  return message;
13799
11905
  }
13800
11906
  };
13801
11907
  function createBaseUpdateWalletSettingRequest() {
13802
- return { privateEnabled: void 0 };
11908
+ return { privateEnabled: void 0, masterIdentityPublicKey: void 0 };
13803
11909
  }
13804
11910
  var UpdateWalletSettingRequest = {
13805
11911
  encode(message, writer = new import_wire4.BinaryWriter()) {
13806
11912
  if (message.privateEnabled !== void 0) {
13807
11913
  writer.uint32(8).bool(message.privateEnabled);
13808
11914
  }
11915
+ switch (message.masterIdentityPublicKey?.$case) {
11916
+ case "setMasterIdentityPublicKey":
11917
+ writer.uint32(18).bytes(message.masterIdentityPublicKey.setMasterIdentityPublicKey);
11918
+ break;
11919
+ case "clearMasterIdentityPublicKey":
11920
+ writer.uint32(24).bool(message.masterIdentityPublicKey.clearMasterIdentityPublicKey);
11921
+ break;
11922
+ }
13809
11923
  return writer;
13810
11924
  },
13811
11925
  decode(input, length) {
@@ -13822,6 +11936,26 @@ var UpdateWalletSettingRequest = {
13822
11936
  message.privateEnabled = reader.bool();
13823
11937
  continue;
13824
11938
  }
11939
+ case 2: {
11940
+ if (tag !== 18) {
11941
+ break;
11942
+ }
11943
+ message.masterIdentityPublicKey = {
11944
+ $case: "setMasterIdentityPublicKey",
11945
+ setMasterIdentityPublicKey: reader.bytes()
11946
+ };
11947
+ continue;
11948
+ }
11949
+ case 3: {
11950
+ if (tag !== 24) {
11951
+ break;
11952
+ }
11953
+ message.masterIdentityPublicKey = {
11954
+ $case: "clearMasterIdentityPublicKey",
11955
+ clearMasterIdentityPublicKey: reader.bool()
11956
+ };
11957
+ continue;
11958
+ }
13825
11959
  }
13826
11960
  if ((tag & 7) === 4 || tag === 0) {
13827
11961
  break;
@@ -13831,13 +11965,27 @@ var UpdateWalletSettingRequest = {
13831
11965
  return message;
13832
11966
  },
13833
11967
  fromJSON(object) {
13834
- return { privateEnabled: isSet3(object.privateEnabled) ? globalThis.Boolean(object.privateEnabled) : void 0 };
11968
+ return {
11969
+ privateEnabled: isSet3(object.privateEnabled) ? globalThis.Boolean(object.privateEnabled) : void 0,
11970
+ masterIdentityPublicKey: isSet3(object.setMasterIdentityPublicKey) ? {
11971
+ $case: "setMasterIdentityPublicKey",
11972
+ setMasterIdentityPublicKey: bytesFromBase642(object.setMasterIdentityPublicKey)
11973
+ } : isSet3(object.clearMasterIdentityPublicKey) ? {
11974
+ $case: "clearMasterIdentityPublicKey",
11975
+ clearMasterIdentityPublicKey: globalThis.Boolean(object.clearMasterIdentityPublicKey)
11976
+ } : void 0
11977
+ };
13835
11978
  },
13836
11979
  toJSON(message) {
13837
11980
  const obj = {};
13838
11981
  if (message.privateEnabled !== void 0) {
13839
11982
  obj.privateEnabled = message.privateEnabled;
13840
11983
  }
11984
+ if (message.masterIdentityPublicKey?.$case === "setMasterIdentityPublicKey") {
11985
+ obj.setMasterIdentityPublicKey = base64FromBytes2(message.masterIdentityPublicKey.setMasterIdentityPublicKey);
11986
+ } else if (message.masterIdentityPublicKey?.$case === "clearMasterIdentityPublicKey") {
11987
+ obj.clearMasterIdentityPublicKey = message.masterIdentityPublicKey.clearMasterIdentityPublicKey;
11988
+ }
13841
11989
  return obj;
13842
11990
  },
13843
11991
  create(base) {
@@ -13846,6 +11994,26 @@ var UpdateWalletSettingRequest = {
13846
11994
  fromPartial(object) {
13847
11995
  const message = createBaseUpdateWalletSettingRequest();
13848
11996
  message.privateEnabled = object.privateEnabled ?? void 0;
11997
+ switch (object.masterIdentityPublicKey?.$case) {
11998
+ case "setMasterIdentityPublicKey": {
11999
+ if (object.masterIdentityPublicKey?.setMasterIdentityPublicKey !== void 0 && object.masterIdentityPublicKey?.setMasterIdentityPublicKey !== null) {
12000
+ message.masterIdentityPublicKey = {
12001
+ $case: "setMasterIdentityPublicKey",
12002
+ setMasterIdentityPublicKey: object.masterIdentityPublicKey.setMasterIdentityPublicKey
12003
+ };
12004
+ }
12005
+ break;
12006
+ }
12007
+ case "clearMasterIdentityPublicKey": {
12008
+ if (object.masterIdentityPublicKey?.clearMasterIdentityPublicKey !== void 0 && object.masterIdentityPublicKey?.clearMasterIdentityPublicKey !== null) {
12009
+ message.masterIdentityPublicKey = {
12010
+ $case: "clearMasterIdentityPublicKey",
12011
+ clearMasterIdentityPublicKey: object.masterIdentityPublicKey.clearMasterIdentityPublicKey
12012
+ };
12013
+ }
12014
+ break;
12015
+ }
12016
+ }
13849
12017
  return message;
13850
12018
  }
13851
12019
  };
@@ -14017,50 +12185,6 @@ var SparkServiceDefinition = {
14017
12185
  responseStream: false,
14018
12186
  options: {}
14019
12187
  },
14020
- /**
14021
- * This is deprecated, please use start_deposit_tree_creation instead.
14022
- *
14023
- * @deprecated
14024
- */
14025
- start_tree_creation: {
14026
- name: "start_tree_creation",
14027
- requestType: StartTreeCreationRequest,
14028
- requestStream: false,
14029
- responseType: StartTreeCreationResponse,
14030
- responseStream: false,
14031
- options: {}
14032
- },
14033
- /** @deprecated */
14034
- finalize_node_signatures: {
14035
- name: "finalize_node_signatures",
14036
- requestType: FinalizeNodeSignaturesRequest,
14037
- requestStream: false,
14038
- responseType: FinalizeNodeSignaturesResponse,
14039
- responseStream: false,
14040
- options: {}
14041
- },
14042
- /** @deprecated */
14043
- start_transfer: {
14044
- name: "start_transfer",
14045
- requestType: StartTransferRequest,
14046
- requestStream: false,
14047
- responseType: StartTransferResponse,
14048
- responseStream: false,
14049
- options: {}
14050
- },
14051
- /**
14052
- * This is deprecated, please use finalize_transfer_with_transfer_package instead.
14053
- *
14054
- * @deprecated
14055
- */
14056
- finalize_transfer: {
14057
- name: "finalize_transfer",
14058
- requestType: FinalizeTransferRequest,
14059
- requestStream: false,
14060
- responseType: FinalizeTransferResponse,
14061
- responseStream: false,
14062
- options: {}
14063
- },
14064
12188
  finalize_transfer_with_transfer_package: {
14065
12189
  name: "finalize_transfer_with_transfer_package",
14066
12190
  requestType: FinalizeTransferWithTransferPackageRequest,
@@ -14069,15 +12193,6 @@ var SparkServiceDefinition = {
14069
12193
  responseStream: false,
14070
12194
  options: {}
14071
12195
  },
14072
- /** @deprecated */
14073
- cancel_transfer: {
14074
- name: "cancel_transfer",
14075
- requestType: CancelTransferRequest,
14076
- requestStream: false,
14077
- responseType: CancelTransferResponse,
14078
- responseStream: false,
14079
- options: {}
14080
- },
14081
12196
  query_pending_transfers: {
14082
12197
  name: "query_pending_transfers",
14083
12198
  requestType: TransferFilter,
@@ -14102,15 +12217,6 @@ var SparkServiceDefinition = {
14102
12217
  responseStream: false,
14103
12218
  options: {}
14104
12219
  },
14105
- /** @deprecated */
14106
- claim_transfer_sign_refunds: {
14107
- name: "claim_transfer_sign_refunds",
14108
- requestType: ClaimTransferSignRefundsRequest,
14109
- requestStream: false,
14110
- responseType: ClaimTransferSignRefundsResponse,
14111
- responseStream: false,
14112
- options: {}
14113
- },
14114
12220
  store_preimage_share: {
14115
12221
  name: "store_preimage_share",
14116
12222
  requestType: StorePreimageShareRequest,
@@ -14131,24 +12237,6 @@ var SparkServiceDefinition = {
14131
12237
  responseStream: false,
14132
12238
  options: {}
14133
12239
  },
14134
- /** @deprecated */
14135
- cooperative_exit: {
14136
- name: "cooperative_exit",
14137
- requestType: CooperativeExitRequest,
14138
- requestStream: false,
14139
- responseType: CooperativeExitResponse,
14140
- responseStream: false,
14141
- options: {}
14142
- },
14143
- /** @deprecated */
14144
- initiate_preimage_swap: {
14145
- name: "initiate_preimage_swap",
14146
- requestType: InitiatePreimageSwapRequest,
14147
- requestStream: false,
14148
- responseType: InitiatePreimageSwapResponse,
14149
- responseStream: false,
14150
- options: {}
14151
- },
14152
12240
  provide_preimage: {
14153
12241
  name: "provide_preimage",
14154
12242
  requestType: ProvidePreimageRequest,
@@ -14165,63 +12253,6 @@ var SparkServiceDefinition = {
14165
12253
  responseStream: false,
14166
12254
  options: {}
14167
12255
  },
14168
- /**
14169
- * This is the exact same as start_transfer, but expresses to the SO
14170
- * this transfer is specifically for a leaf swap.
14171
- */
14172
- start_leaf_swap: {
14173
- name: "start_leaf_swap",
14174
- requestType: StartTransferRequest,
14175
- requestStream: false,
14176
- responseType: StartTransferResponse,
14177
- responseStream: false,
14178
- options: {}
14179
- },
14180
- /**
14181
- * This is deprecated, please use counter_leaf_swap instead.
14182
- *
14183
- * @deprecated
14184
- */
14185
- leaf_swap: {
14186
- name: "leaf_swap",
14187
- requestType: CounterLeafSwapRequest,
14188
- requestStream: false,
14189
- responseType: CounterLeafSwapResponse,
14190
- responseStream: false,
14191
- options: {}
14192
- },
14193
- /**
14194
- * This is the exact same as start_leaf_swap, but signs with
14195
- * an adaptor public key after a counterparty has begun the swap via start_leaf_swap.
14196
- *
14197
- * @deprecated
14198
- */
14199
- counter_leaf_swap: {
14200
- name: "counter_leaf_swap",
14201
- requestType: CounterLeafSwapRequest,
14202
- requestStream: false,
14203
- responseType: CounterLeafSwapResponse,
14204
- responseStream: false,
14205
- options: {}
14206
- },
14207
- /** @deprecated */
14208
- refresh_timelock: {
14209
- name: "refresh_timelock",
14210
- requestType: RefreshTimelockRequest,
14211
- requestStream: false,
14212
- responseType: RefreshTimelockResponse,
14213
- responseStream: false,
14214
- options: {}
14215
- },
14216
- /** @deprecated */
14217
- extend_leaf: {
14218
- name: "extend_leaf",
14219
- requestType: ExtendLeafRequest,
14220
- requestStream: false,
14221
- responseType: ExtendLeafResponse,
14222
- responseStream: false,
14223
- options: {}
14224
- },
14225
12256
  /**
14226
12257
  * Resets the timelocks for a leaf's transactions. Can be used to reset the
14227
12258
  * refund transaction timelock for a leaf (when the node transaction
@@ -14253,24 +12284,6 @@ var SparkServiceDefinition = {
14253
12284
  responseStream: false,
14254
12285
  options: {}
14255
12286
  },
14256
- /** @deprecated */
14257
- query_nodes_distribution: {
14258
- name: "query_nodes_distribution",
14259
- requestType: QueryNodesDistributionRequest,
14260
- requestStream: false,
14261
- responseType: QueryNodesDistributionResponse,
14262
- responseStream: false,
14263
- options: {}
14264
- },
14265
- /** @deprecated */
14266
- query_nodes_by_value: {
14267
- name: "query_nodes_by_value",
14268
- requestType: QueryNodesByValueRequest,
14269
- requestStream: false,
14270
- responseType: QueryNodesByValueResponse,
14271
- responseStream: false,
14272
- options: {}
14273
- },
14274
12287
  query_balance: {
14275
12288
  name: "query_balance",
14276
12289
  requestType: QueryBalanceRequest,
@@ -14325,22 +12338,6 @@ var SparkServiceDefinition = {
14325
12338
  responseStream: false,
14326
12339
  options: {}
14327
12340
  },
14328
- /**
14329
- * DEPRECATED: This unified method is being split for better clarity and type safety
14330
- *
14331
- * For swap operations: Use spark_ssp_internal.initiate_static_deposit_utxo_swap()
14332
- * For refund operations: Use initiate_static_deposit_utxo_refund()
14333
- *
14334
- * @deprecated
14335
- */
14336
- initiate_utxo_swap: {
14337
- name: "initiate_utxo_swap",
14338
- requestType: InitiateUtxoSwapRequest,
14339
- requestStream: false,
14340
- responseType: InitiateUtxoSwapResponse,
14341
- responseStream: false,
14342
- options: {}
14343
- },
14344
12341
  exit_single_node_trees: {
14345
12342
  name: "exit_single_node_trees",
14346
12343
  requestType: ExitSingleNodeTreesRequest,
@@ -14361,15 +12358,6 @@ var SparkServiceDefinition = {
14361
12358
  responseStream: false,
14362
12359
  options: {}
14363
12360
  },
14364
- /** @deprecated */
14365
- extend_leaf_v2: {
14366
- name: "extend_leaf_v2",
14367
- requestType: ExtendLeafRequest,
14368
- requestStream: false,
14369
- responseType: ExtendLeafResponse,
14370
- responseStream: false,
14371
- options: {}
14372
- },
14373
12361
  claim_transfer_sign_refunds_v2: {
14374
12362
  name: "claim_transfer_sign_refunds_v2",
14375
12363
  requestType: ClaimTransferSignRefundsRequest,
@@ -14410,15 +12398,6 @@ var SparkServiceDefinition = {
14410
12398
  responseStream: false,
14411
12399
  options: {}
14412
12400
  },
14413
- /** @deprecated */
14414
- counter_leaf_swap_v2: {
14415
- name: "counter_leaf_swap_v2",
14416
- requestType: CounterLeafSwapRequest,
14417
- requestStream: false,
14418
- responseType: CounterLeafSwapResponse,
14419
- responseStream: false,
14420
- options: {}
14421
- },
14422
12401
  start_transfer_v2: {
14423
12402
  name: "start_transfer_v2",
14424
12403
  requestType: StartTransferRequest,
@@ -14427,15 +12406,6 @@ var SparkServiceDefinition = {
14427
12406
  responseStream: false,
14428
12407
  options: {}
14429
12408
  },
14430
- /** @deprecated */
14431
- refresh_timelock_v2: {
14432
- name: "refresh_timelock_v2",
14433
- requestType: RefreshTimelockRequest,
14434
- requestStream: false,
14435
- responseType: RefreshTimelockResponse,
14436
- responseStream: false,
14437
- options: {}
14438
- },
14439
12409
  get_utxos_for_address: {
14440
12410
  name: "get_utxos_for_address",
14441
12411
  requestType: GetUtxosForAddressRequest,
@@ -14686,22 +12656,22 @@ var BASE_CONFIG = {
14686
12656
  // 5 minutes
14687
12657
  minOutputsThreshold: 50
14688
12658
  },
14689
- tokenTransactionVersion: "V2"
12659
+ tokenTransactionVersion: "V3"
14690
12660
  };
14691
12661
  var LOCAL_WALLET_CONFIG = {
14692
12662
  ...BASE_CONFIG,
14693
- threshold: 3
12663
+ threshold: getLocalSigningThreshold()
14694
12664
  };
14695
12665
  var LOCAL_WALLET_CONFIG_SCHNORR = {
14696
12666
  ...LOCAL_WALLET_CONFIG,
14697
- threshold: 3
14698
- // 3 for issuance tests.
12667
+ threshold: getLocalSigningThreshold()
12668
+ // 2 for issuance tests.
14699
12669
  };
14700
12670
  var LOCAL_WALLET_CONFIG_ECDSA = {
14701
12671
  ...LOCAL_WALLET_CONFIG,
14702
12672
  tokenSignatures: "ECDSA",
14703
- threshold: 3
14704
- // 3 for issuance tests.
12673
+ threshold: getLocalSigningThreshold()
12674
+ // 2 for issuance tests.
14705
12675
  };
14706
12676
  var REGTEST_WALLET_CONFIG = {
14707
12677
  ...BASE_CONFIG,
@@ -14757,6 +12727,7 @@ function getSigningOperators() {
14757
12727
  };
14758
12728
  }
14759
12729
  function getLocalSigningOperators() {
12730
+ const numOperators = typeof process !== "undefined" && process.env.NUM_SPARK_OPERATORS !== void 0 ? parseInt(process.env.NUM_SPARK_OPERATORS, 10) : isHermeticTest ? 3 : 5;
14760
12731
  const addresses = Array.from(
14761
12732
  { length: 5 },
14762
12733
  (_, i) => isHermeticTest ? `https://${i}.spark.minikube.local` : `https://localhost:${i + 8535}`
@@ -14768,7 +12739,7 @@ function getLocalSigningOperators() {
14768
12739
  "0352aef4d49439dedd798ac4aef1e7ebef95f569545b647a25338398c1247ffdea",
14769
12740
  "02c05c88cc8fc181b1ba30006df6a4b0597de6490e24514fbdd0266d2b9cd3d0ba"
14770
12741
  ];
14771
- return {
12742
+ const allOperators = {
14772
12743
  "0000000000000000000000000000000000000000000000000000000000000001": {
14773
12744
  id: 0,
14774
12745
  identifier: "0000000000000000000000000000000000000000000000000000000000000001",
@@ -14800,6 +12771,13 @@ function getLocalSigningOperators() {
14800
12771
  identityPublicKey: pubkeys[4]
14801
12772
  }
14802
12773
  };
12774
+ return Object.fromEntries(
12775
+ Object.entries(allOperators).slice(0, numOperators)
12776
+ );
12777
+ }
12778
+ function getLocalSigningThreshold() {
12779
+ const numOperators = Object.keys(getLocalSigningOperators()).length;
12780
+ return Math.floor((numOperators + 2) / 2);
14803
12781
  }
14804
12782
 
14805
12783
  // src/services/config.ts
@@ -15992,7 +13970,8 @@ function createBaseTokenCreateInput() {
15992
13970
  decimals: 0,
15993
13971
  maxSupply: new Uint8Array(0),
15994
13972
  isFreezable: false,
15995
- creationEntityPublicKey: void 0
13973
+ creationEntityPublicKey: void 0,
13974
+ extraMetadata: void 0
15996
13975
  };
15997
13976
  }
15998
13977
  var TokenCreateInput = {
@@ -16018,6 +13997,9 @@ var TokenCreateInput = {
16018
13997
  if (message.creationEntityPublicKey !== void 0) {
16019
13998
  writer.uint32(58).bytes(message.creationEntityPublicKey);
16020
13999
  }
14000
+ if (message.extraMetadata !== void 0) {
14001
+ writer.uint32(66).bytes(message.extraMetadata);
14002
+ }
16021
14003
  return writer;
16022
14004
  },
16023
14005
  decode(input, length) {
@@ -16076,6 +14058,13 @@ var TokenCreateInput = {
16076
14058
  message.creationEntityPublicKey = reader.bytes();
16077
14059
  continue;
16078
14060
  }
14061
+ case 8: {
14062
+ if (tag !== 66) {
14063
+ break;
14064
+ }
14065
+ message.extraMetadata = reader.bytes();
14066
+ continue;
14067
+ }
16079
14068
  }
16080
14069
  if ((tag & 7) === 4 || tag === 0) {
16081
14070
  break;
@@ -16092,7 +14081,8 @@ var TokenCreateInput = {
16092
14081
  decimals: isSet6(object.decimals) ? globalThis.Number(object.decimals) : 0,
16093
14082
  maxSupply: isSet6(object.maxSupply) ? bytesFromBase645(object.maxSupply) : new Uint8Array(0),
16094
14083
  isFreezable: isSet6(object.isFreezable) ? globalThis.Boolean(object.isFreezable) : false,
16095
- creationEntityPublicKey: isSet6(object.creationEntityPublicKey) ? bytesFromBase645(object.creationEntityPublicKey) : void 0
14084
+ creationEntityPublicKey: isSet6(object.creationEntityPublicKey) ? bytesFromBase645(object.creationEntityPublicKey) : void 0,
14085
+ extraMetadata: isSet6(object.extraMetadata) ? bytesFromBase645(object.extraMetadata) : void 0
16096
14086
  };
16097
14087
  },
16098
14088
  toJSON(message) {
@@ -16118,6 +14108,9 @@ var TokenCreateInput = {
16118
14108
  if (message.creationEntityPublicKey !== void 0) {
16119
14109
  obj.creationEntityPublicKey = base64FromBytes5(message.creationEntityPublicKey);
16120
14110
  }
14111
+ if (message.extraMetadata !== void 0) {
14112
+ obj.extraMetadata = base64FromBytes5(message.extraMetadata);
14113
+ }
16121
14114
  return obj;
16122
14115
  },
16123
14116
  create(base) {
@@ -16132,6 +14125,7 @@ var TokenCreateInput = {
16132
14125
  message.maxSupply = object.maxSupply ?? new Uint8Array(0);
16133
14126
  message.isFreezable = object.isFreezable ?? false;
16134
14127
  message.creationEntityPublicKey = object.creationEntityPublicKey ?? void 0;
14128
+ message.extraMetadata = object.extraMetadata ?? void 0;
16135
14129
  return message;
16136
14130
  }
16137
14131
  };
@@ -18008,7 +16002,8 @@ function createBaseTokenMetadata() {
18008
16002
  maxSupply: new Uint8Array(0),
18009
16003
  isFreezable: false,
18010
16004
  creationEntityPublicKey: void 0,
18011
- tokenIdentifier: new Uint8Array(0)
16005
+ tokenIdentifier: new Uint8Array(0),
16006
+ extraMetadata: void 0
18012
16007
  };
18013
16008
  }
18014
16009
  var TokenMetadata = {
@@ -18037,6 +16032,9 @@ var TokenMetadata = {
18037
16032
  if (message.tokenIdentifier.length !== 0) {
18038
16033
  writer.uint32(66).bytes(message.tokenIdentifier);
18039
16034
  }
16035
+ if (message.extraMetadata !== void 0) {
16036
+ writer.uint32(74).bytes(message.extraMetadata);
16037
+ }
18040
16038
  return writer;
18041
16039
  },
18042
16040
  decode(input, length) {
@@ -18102,6 +16100,13 @@ var TokenMetadata = {
18102
16100
  message.tokenIdentifier = reader.bytes();
18103
16101
  continue;
18104
16102
  }
16103
+ case 9: {
16104
+ if (tag !== 74) {
16105
+ break;
16106
+ }
16107
+ message.extraMetadata = reader.bytes();
16108
+ continue;
16109
+ }
18105
16110
  }
18106
16111
  if ((tag & 7) === 4 || tag === 0) {
18107
16112
  break;
@@ -18119,7 +16124,8 @@ var TokenMetadata = {
18119
16124
  maxSupply: isSet6(object.maxSupply) ? bytesFromBase645(object.maxSupply) : new Uint8Array(0),
18120
16125
  isFreezable: isSet6(object.isFreezable) ? globalThis.Boolean(object.isFreezable) : false,
18121
16126
  creationEntityPublicKey: isSet6(object.creationEntityPublicKey) ? bytesFromBase645(object.creationEntityPublicKey) : void 0,
18122
- tokenIdentifier: isSet6(object.tokenIdentifier) ? bytesFromBase645(object.tokenIdentifier) : new Uint8Array(0)
16127
+ tokenIdentifier: isSet6(object.tokenIdentifier) ? bytesFromBase645(object.tokenIdentifier) : new Uint8Array(0),
16128
+ extraMetadata: isSet6(object.extraMetadata) ? bytesFromBase645(object.extraMetadata) : void 0
18123
16129
  };
18124
16130
  },
18125
16131
  toJSON(message) {
@@ -18148,6 +16154,9 @@ var TokenMetadata = {
18148
16154
  if (message.tokenIdentifier.length !== 0) {
18149
16155
  obj.tokenIdentifier = base64FromBytes5(message.tokenIdentifier);
18150
16156
  }
16157
+ if (message.extraMetadata !== void 0) {
16158
+ obj.extraMetadata = base64FromBytes5(message.extraMetadata);
16159
+ }
18151
16160
  return obj;
18152
16161
  },
18153
16162
  create(base) {
@@ -18163,6 +16172,7 @@ var TokenMetadata = {
18163
16172
  message.isFreezable = object.isFreezable ?? false;
18164
16173
  message.creationEntityPublicKey = object.creationEntityPublicKey ?? void 0;
18165
16174
  message.tokenIdentifier = object.tokenIdentifier ?? new Uint8Array(0);
16175
+ message.extraMetadata = object.extraMetadata ?? void 0;
18166
16176
  return message;
18167
16177
  }
18168
16178
  };
@@ -19470,6 +17480,9 @@ var ConnectionManager = class _ConnectionManager {
19470
17480
  }
19471
17481
  return serverTime;
19472
17482
  }
17483
+ isTimeSynced() {
17484
+ return this.timeSync.isSynced();
17485
+ }
19473
17486
  getMonotonicTime() {
19474
17487
  return getMonotonicTime();
19475
17488
  }
@@ -19647,39 +17660,6 @@ var ConnectionManager = class _ConnectionManager {
19647
17660
  prepareMetadata(metadata) {
19648
17661
  return metadata;
19649
17662
  }
19650
- recordTimeSync(dateHeader, serverProcessingTimeMs, sendTime, receiveTime) {
19651
- this.timeSync.recordSync(
19652
- dateHeader,
19653
- serverProcessingTimeMs,
19654
- sendTime,
19655
- receiveTime
19656
- );
19657
- }
19658
- processResponseForTimeSync(result, firstResponse, sendTime) {
19659
- if (!firstResponse) return false;
19660
- const receiveTime = this.getMonotonicTime();
19661
- if (typeof result.value === "object" && result.value !== null) {
19662
- const responseObj = result.value;
19663
- if (responseObj.header && responseObj.header instanceof import_nice_grpc_common.Metadata) {
19664
- const dateHeader = responseObj.header.get(
19665
- _ConnectionManager.DATE_HEADER
19666
- )?.[0];
19667
- const processingTimeHeader = responseObj.header.get(
19668
- _ConnectionManager.PROCESSING_TIME_HEADER
19669
- )?.[0];
19670
- if (dateHeader && processingTimeHeader) {
19671
- const serverProcessingTimeMs = parseFloat(processingTimeHeader);
19672
- this.recordTimeSync(
19673
- dateHeader,
19674
- serverProcessingTimeMs,
19675
- sendTime,
19676
- receiveTime
19677
- );
19678
- }
19679
- }
19680
- }
19681
- return true;
19682
- }
19683
17663
  createAuthnMiddleware() {
19684
17664
  return async function* (call, options) {
19685
17665
  const metadata = this.prepareMetadata((0, import_nice_grpc_common.Metadata)(options.metadata));
@@ -19694,28 +17674,34 @@ var ConnectionManager = class _ConnectionManager {
19694
17674
  const metadata = this.prepareMetadata((0, import_nice_grpc_common.Metadata)(options.metadata));
19695
17675
  const authToken = await this.authenticate(address);
19696
17676
  const sendTime = this.getMonotonicTime();
17677
+ const receiveTime = { value: 0 };
19697
17678
  try {
19698
17679
  const generator = call.next(call.request, {
19699
17680
  ...options,
19700
- metadata: metadata.set("Authorization", `Bearer ${authToken}`)
17681
+ metadata: metadata.set("Authorization", `Bearer ${authToken}`),
17682
+ onHeader: (header) => {
17683
+ receiveTime.value = this.getMonotonicTime();
17684
+ const dateHeader = header.get(_ConnectionManager.DATE_HEADER);
17685
+ const processingTimeHeader = header.get(
17686
+ _ConnectionManager.PROCESSING_TIME_HEADER
17687
+ );
17688
+ if (dateHeader && processingTimeHeader) {
17689
+ const serverProcessingTimeMs = parseFloat(processingTimeHeader);
17690
+ this.timeSync.recordSync(
17691
+ dateHeader,
17692
+ serverProcessingTimeMs,
17693
+ sendTime,
17694
+ receiveTime.value
17695
+ );
17696
+ }
17697
+ }
19701
17698
  });
19702
- let firstResponse = true;
19703
17699
  let result = await generator.next();
19704
17700
  while (!result.done) {
19705
- if (firstResponse) {
19706
- firstResponse = this.processResponseForTimeSync(
19707
- result,
19708
- firstResponse,
19709
- sendTime
19710
- );
19711
- }
19712
17701
  yield result.value;
19713
17702
  result = await generator.next();
19714
17703
  }
19715
17704
  if (result.value !== void 0) {
19716
- if (firstResponse) {
19717
- this.processResponseForTimeSync(result, firstResponse, sendTime);
19718
- }
19719
17705
  return result.value;
19720
17706
  }
19721
17707
  } catch (error) {
@@ -20830,7 +18816,7 @@ var DepositService = class {
20830
18816
  });
20831
18817
  } catch (error) {
20832
18818
  throw new SparkRequestError("Failed to finalize node signatures", {
20833
- operation: "finalize_node_signatures",
18819
+ operation: "finalize_node_signatures_v2",
20834
18820
  error
20835
18821
  });
20836
18822
  }
@@ -23503,12 +21489,18 @@ var import_core7 = require("@lightsparkdev/core");
23503
21489
  var LightningSendRequestStatus = /* @__PURE__ */ ((LightningSendRequestStatus2) => {
23504
21490
  LightningSendRequestStatus2["FUTURE_VALUE"] = "FUTURE_VALUE";
23505
21491
  LightningSendRequestStatus2["CREATED"] = "CREATED";
23506
- LightningSendRequestStatus2["REQUEST_VALIDATED"] = "REQUEST_VALIDATED";
21492
+ LightningSendRequestStatus2["USER_TRANSFER_VALIDATION_FAILED"] = "USER_TRANSFER_VALIDATION_FAILED";
23507
21493
  LightningSendRequestStatus2["LIGHTNING_PAYMENT_INITIATED"] = "LIGHTNING_PAYMENT_INITIATED";
23508
21494
  LightningSendRequestStatus2["LIGHTNING_PAYMENT_FAILED"] = "LIGHTNING_PAYMENT_FAILED";
23509
21495
  LightningSendRequestStatus2["LIGHTNING_PAYMENT_SUCCEEDED"] = "LIGHTNING_PAYMENT_SUCCEEDED";
23510
21496
  LightningSendRequestStatus2["PREIMAGE_PROVIDED"] = "PREIMAGE_PROVIDED";
21497
+ LightningSendRequestStatus2["PREIMAGE_PROVIDING_FAILED"] = "PREIMAGE_PROVIDING_FAILED";
23511
21498
  LightningSendRequestStatus2["TRANSFER_COMPLETED"] = "TRANSFER_COMPLETED";
21499
+ LightningSendRequestStatus2["TRANSFER_FAILED"] = "TRANSFER_FAILED";
21500
+ LightningSendRequestStatus2["PENDING_USER_SWAP_RETURN"] = "PENDING_USER_SWAP_RETURN";
21501
+ LightningSendRequestStatus2["USER_SWAP_RETURNED"] = "USER_SWAP_RETURNED";
21502
+ LightningSendRequestStatus2["USER_SWAP_RETURN_FAILED"] = "USER_SWAP_RETURN_FAILED";
21503
+ LightningSendRequestStatus2["REQUEST_VALIDATED"] = "REQUEST_VALIDATED";
23512
21504
  return LightningSendRequestStatus2;
23513
21505
  })(LightningSendRequestStatus || {});
23514
21506
  var LightningSendRequestStatus_default = LightningSendRequestStatus;
@@ -28980,7 +26972,7 @@ function isSet7(value) {
28980
26972
  }
28981
26973
 
28982
26974
  // src/spark-wallet/proto-descriptors.ts
28983
- var SPARK_DESCRIPTORS_BASE64 = "Cv8BCh9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvEg9nb29nbGUucHJvdG9idWYiOwoJVGltZXN0YW1wEhgKB3NlY29uZHMYASABKANSB3NlY29uZHMSFAoFbmFub3MYAiABKAVSBW5hbm9zQoUBChNjb20uZ29vZ2xlLnByb3RvYnVmQg5UaW1lc3RhbXBQcm90b1ABWjJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi90aW1lc3RhbXBwYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCr4BChtnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIHCgVFbXB0eUJ9ChNjb20uZ29vZ2xlLnByb3RvYnVmQgpFbXB0eVByb3RvUAFaLmdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2VtcHR5cGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMwqIYAogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiJbChFGaWxlRGVzY3JpcHRvclNldBI4CgRmaWxlGAEgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG9SBGZpbGUqDAiA7Mr/ARCB7Mr/ASKYBQoTRmlsZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhgKB3BhY2thZ2UYAiABKAlSB3BhY2thZ2USHgoKZGVwZW5kZW5jeRgDIAMoCVIKZGVwZW5kZW5jeRIrChFwdWJsaWNfZGVwZW5kZW5jeRgKIAMoBVIQcHVibGljRGVwZW5kZW5jeRInCg93ZWFrX2RlcGVuZGVuY3kYCyADKAVSDndlYWtEZXBlbmRlbmN5EkMKDG1lc3NhZ2VfdHlwZRgEIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SC21lc3NhZ2VUeXBlEkEKCWVudW1fdHlwZRgFIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJBCgdzZXJ2aWNlGAYgAygLMicuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9SB3NlcnZpY2USQwoJZXh0ZW5zaW9uGAcgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SNgoHb3B0aW9ucxgIIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1IHb3B0aW9ucxJJChBzb3VyY2VfY29kZV9pbmZvGAkgASgLMh8uZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvUg5zb3VyY2VDb2RlSW5mbxIWCgZzeW50YXgYDCABKAlSBnN5bnRheBIyCgdlZGl0aW9uGA4gASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SB2VkaXRpb24iuQYKD0Rlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjsKBWZpZWxkGAIgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUgVmaWVsZBJDCglleHRlbnNpb24YBiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhJBCgtuZXN0ZWRfdHlwZRgDIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SCm5lc3RlZFR5cGUSQQoJZW51bV90eXBlGAQgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlElgKD2V4dGVuc2lvbl9yYW5nZRgFIAMoCzIvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2VSDmV4dGVuc2lvblJhbmdlEkQKCm9uZW9mX2RlY2wYCCADKAsyJS5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG9SCW9uZW9mRGVjbBI5CgdvcHRpb25zGAcgASgLMh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zUgdvcHRpb25zElUKDnJlc2VydmVkX3JhbmdlGAkgAygLMi4uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYCiADKAlSDHJlc2VydmVkTmFtZRp6Cg5FeHRlbnNpb25SYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQSQAoHb3B0aW9ucxgDIAEoCzImLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnNSB29wdGlvbnMaNwoNUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQizAQKFUV4dGVuc2lvblJhbmdlT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbhJZCgtkZWNsYXJhdGlvbhgCIAMoCzIyLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuRGVjbGFyYXRpb25CA4gBAlILZGVjbGFyYXRpb24SNwoIZmVhdHVyZXMYMiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSbQoMdmVyaWZpY2F0aW9uGAMgASgOMjguZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5WZXJpZmljYXRpb25TdGF0ZToKVU5WRVJJRklFREIDiAECUgx2ZXJpZmljYXRpb24alAEKC0RlY2xhcmF0aW9uEhYKBm51bWJlchgBIAEoBVIGbnVtYmVyEhsKCWZ1bGxfbmFtZRgCIAEoCVIIZnVsbE5hbWUSEgoEdHlwZRgDIAEoCVIEdHlwZRIaCghyZXNlcnZlZBgFIAEoCFIIcmVzZXJ2ZWQSGgoIcmVwZWF0ZWQYBiABKAhSCHJlcGVhdGVkSgQIBBAFIjQKEVZlcmlmaWNhdGlvblN0YXRlEg8KC0RFQ0xBUkFUSU9OEAASDgoKVU5WRVJJRklFRBABKgkI6AcQgICAgAIiwQYKFEZpZWxkRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAMgASgFUgZudW1iZXISQQoFbGFiZWwYBCABKA4yKy5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWxSBWxhYmVsEj4KBHR5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZVIEdHlwZRIbCgl0eXBlX25hbWUYBiABKAlSCHR5cGVOYW1lEhoKCGV4dGVuZGVlGAIgASgJUghleHRlbmRlZRIjCg1kZWZhdWx0X3ZhbHVlGAcgASgJUgxkZWZhdWx0VmFsdWUSHwoLb25lb2ZfaW5kZXgYCSABKAVSCm9uZW9mSW5kZXgSGwoJanNvbl9uYW1lGAogASgJUghqc29uTmFtZRI3CgdvcHRpb25zGAggASgLMh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9uc1IHb3B0aW9ucxInCg9wcm90bzNfb3B0aW9uYWwYESABKAhSDnByb3RvM09wdGlvbmFsIrYCCgRUeXBlEg8KC1RZUEVfRE9VQkxFEAESDgoKVFlQRV9GTE9BVBACEg4KClRZUEVfSU5UNjQQAxIPCgtUWVBFX1VJTlQ2NBAEEg4KClRZUEVfSU5UMzIQBRIQCgxUWVBFX0ZJWEVENjQQBhIQCgxUWVBFX0ZJWEVEMzIQBxINCglUWVBFX0JPT0wQCBIPCgtUWVBFX1NUUklORxAJEg4KClRZUEVfR1JPVVAQChIQCgxUWVBFX01FU1NBR0UQCxIOCgpUWVBFX0JZVEVTEAwSDwoLVFlQRV9VSU5UMzIQDRINCglUWVBFX0VOVU0QDhIRCg1UWVBFX1NGSVhFRDMyEA8SEQoNVFlQRV9TRklYRUQ2NBAQEg8KC1RZUEVfU0lOVDMyEBESDwoLVFlQRV9TSU5UNjQQEiJDCgVMYWJlbBISCg5MQUJFTF9PUFRJT05BTBABEhIKDkxBQkVMX1JFUEVBVEVEEAMSEgoOTEFCRUxfUkVRVUlSRUQQAiJjChRPbmVvZkRlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjcKB29wdGlvbnMYAiABKAsyHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zUgdvcHRpb25zIuMCChNFbnVtRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPwoFdmFsdWUYAiADKAsyKS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvUgV2YWx1ZRI2CgdvcHRpb25zGAMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zUgdvcHRpb25zEl0KDnJlc2VydmVkX3JhbmdlGAQgAygLMjYuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2VSDXJlc2VydmVkUmFuZ2USIwoNcmVzZXJ2ZWRfbmFtZRgFIAMoCVIMcmVzZXJ2ZWROYW1lGjsKEUVudW1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKDAQoYRW51bVZhbHVlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAIgASgFUgZudW1iZXISOwoHb3B0aW9ucxgDIAEoCzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zUgdvcHRpb25zIqcBChZTZXJ2aWNlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPgoGbWV0aG9kGAIgAygLMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1IGbWV0aG9kEjkKB29wdGlvbnMYAyABKAsyHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnNSB29wdGlvbnMiiQIKFU1ldGhvZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEh0KCmlucHV0X3R5cGUYAiABKAlSCWlucHV0VHlwZRIfCgtvdXRwdXRfdHlwZRgDIAEoCVIKb3V0cHV0VHlwZRI4CgdvcHRpb25zGAQgASgLMh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNSB29wdGlvbnMSMAoQY2xpZW50X3N0cmVhbWluZxgFIAEoCDoFZmFsc2VSD2NsaWVudFN0cmVhbWluZxIwChBzZXJ2ZXJfc3RyZWFtaW5nGAYgASgIOgVmYWxzZVIPc2VydmVyU3RyZWFtaW5nIq0JCgtGaWxlT3B0aW9ucxIhCgxqYXZhX3BhY2thZ2UYASABKAlSC2phdmFQYWNrYWdlEjAKFGphdmFfb3V0ZXJfY2xhc3NuYW1lGAggASgJUhJqYXZhT3V0ZXJDbGFzc25hbWUSNQoTamF2YV9tdWx0aXBsZV9maWxlcxgKIAEoCDoFZmFsc2VSEWphdmFNdWx0aXBsZUZpbGVzEkQKHWphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoGBQgASgIQgIYAVIZamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaBI6ChZqYXZhX3N0cmluZ19jaGVja191dGY4GBsgASgIOgVmYWxzZVITamF2YVN0cmluZ0NoZWNrVXRmOBJTCgxvcHRpbWl6ZV9mb3IYCSABKA4yKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlOgVTUEVFRFILb3B0aW1pemVGb3ISHQoKZ29fcGFja2FnZRgLIAEoCVIJZ29QYWNrYWdlEjUKE2NjX2dlbmVyaWNfc2VydmljZXMYECABKAg6BWZhbHNlUhFjY0dlbmVyaWNTZXJ2aWNlcxI5ChVqYXZhX2dlbmVyaWNfc2VydmljZXMYESABKAg6BWZhbHNlUhNqYXZhR2VuZXJpY1NlcnZpY2VzEjUKE3B5X2dlbmVyaWNfc2VydmljZXMYEiABKAg6BWZhbHNlUhFweUdlbmVyaWNTZXJ2aWNlcxIlCgpkZXByZWNhdGVkGBcgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIuChBjY19lbmFibGVfYXJlbmFzGB8gASgIOgR0cnVlUg5jY0VuYWJsZUFyZW5hcxIqChFvYmpjX2NsYXNzX3ByZWZpeBgkIAEoCVIPb2JqY0NsYXNzUHJlZml4EikKEGNzaGFycF9uYW1lc3BhY2UYJSABKAlSD2NzaGFycE5hbWVzcGFjZRIhCgxzd2lmdF9wcmVmaXgYJyABKAlSC3N3aWZ0UHJlZml4EigKEHBocF9jbGFzc19wcmVmaXgYKCABKAlSDnBocENsYXNzUHJlZml4EiMKDXBocF9uYW1lc3BhY2UYKSABKAlSDHBocE5hbWVzcGFjZRI0ChZwaHBfbWV0YWRhdGFfbmFtZXNwYWNlGCwgASgJUhRwaHBNZXRhZGF0YU5hbWVzcGFjZRIhCgxydWJ5X3BhY2thZ2UYLSABKAlSC3J1YnlQYWNrYWdlEjcKCGZlYXR1cmVzGDIgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIjoKDE9wdGltaXplTW9kZRIJCgVTUEVFRBABEg0KCUNPREVfU0laRRACEhAKDExJVEVfUlVOVElNRRADKgkI6AcQgICAgAJKBAgqECtKBAgmECdSFHBocF9nZW5lcmljX3NlcnZpY2VzIvQDCg5NZXNzYWdlT3B0aW9ucxI8ChdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdBgBIAEoCDoFZmFsc2VSFG1lc3NhZ2VTZXRXaXJlRm9ybWF0EkwKH25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IYAiABKAg6BWZhbHNlUhxub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhsKCW1hcF9lbnRyeRgHIAEoCFIIbWFwRW50cnkSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYCyABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAwgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgEEAVKBAgFEAZKBAgGEAdKBAgIEAlKBAgJEAoinQ0KDEZpZWxkT3B0aW9ucxJBCgVjdHlwZRgBIAEoDjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGU6BlNUUklOR1IFY3R5cGUSFgoGcGFja2VkGAIgASgIUgZwYWNrZWQSRwoGanN0eXBlGAYgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6CUpTX05PUk1BTFIGanN0eXBlEhkKBGxhenkYBSABKAg6BWZhbHNlUgRsYXp5Ei4KD3VudmVyaWZpZWRfbGF6eRgPIAEoCDoFZmFsc2VSDnVudmVyaWZpZWRMYXp5EiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhkKBHdlYWsYCiABKAg6BWZhbHNlUgR3ZWFrEigKDGRlYnVnX3JlZGFjdBgQIAEoCDoFZmFsc2VSC2RlYnVnUmVkYWN0EksKCXJldGVudGlvbhgRIAEoDjItLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uUmV0ZW50aW9uUglyZXRlbnRpb24SSAoHdGFyZ2V0cxgTIAMoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZVIHdGFyZ2V0cxJXChBlZGl0aW9uX2RlZmF1bHRzGBQgAygLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5FZGl0aW9uRGVmYXVsdFIPZWRpdGlvbkRlZmF1bHRzEjcKCGZlYXR1cmVzGBUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElUKD2ZlYXR1cmVfc3VwcG9ydBgWIAEoCzIsLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuRmVhdHVyZVN1cHBvcnRSDmZlYXR1cmVTdXBwb3J0ElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uGloKDkVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhIUCgV2YWx1ZRgCIAEoCVIFdmFsdWUalgIKDkZlYXR1cmVTdXBwb3J0EkcKEmVkaXRpb25faW50cm9kdWNlZBgBIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUhFlZGl0aW9uSW50cm9kdWNlZBJHChJlZGl0aW9uX2RlcHJlY2F0ZWQYAiABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIRZWRpdGlvbkRlcHJlY2F0ZWQSLwoTZGVwcmVjYXRpb25fd2FybmluZxgDIAEoCVISZGVwcmVjYXRpb25XYXJuaW5nEkEKD2VkaXRpb25fcmVtb3ZlZBgEIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5lZGl0aW9uUmVtb3ZlZCIvCgVDVHlwZRIKCgZTVFJJTkcQABIICgRDT1JEEAESEAoMU1RSSU5HX1BJRUNFEAIiNQoGSlNUeXBlEg0KCUpTX05PUk1BTBAAEg0KCUpTX1NUUklORxABEg0KCUpTX05VTUJFUhACIlUKD09wdGlvblJldGVudGlvbhIVChFSRVRFTlRJT05fVU5LTk9XThAAEhUKEVJFVEVOVElPTl9SVU5USU1FEAESFAoQUkVURU5USU9OX1NPVVJDRRACIowCChBPcHRpb25UYXJnZXRUeXBlEhcKE1RBUkdFVF9UWVBFX1VOS05PV04QABIUChBUQVJHRVRfVFlQRV9GSUxFEAESHwobVEFSR0VUX1RZUEVfRVhURU5TSU9OX1JBTkdFEAISFwoTVEFSR0VUX1RZUEVfTUVTU0FHRRADEhUKEVRBUkdFVF9UWVBFX0ZJRUxEEAQSFQoRVEFSR0VUX1RZUEVfT05FT0YQBRIUChBUQVJHRVRfVFlQRV9FTlVNEAYSGgoWVEFSR0VUX1RZUEVfRU5VTV9FTlRSWRAHEhcKE1RBUkdFVF9UWVBFX1NFUlZJQ0UQCBIWChJUQVJHRVRfVFlQRV9NRVRIT0QQCSoJCOgHEICAgIACSgQIBBAFSgQIEhATIqwBCgxPbmVvZk9wdGlvbnMSNwoIZmVhdHVyZXMYASABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLRAgoLRW51bU9wdGlvbnMSHwoLYWxsb3dfYWxpYXMYAiABKAhSCmFsbG93QWxpYXMSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYBiABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgFEAYi2AIKEEVudW1WYWx1ZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBgBIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSNwoIZmVhdHVyZXMYAiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSKAoMZGVidWdfcmVkYWN0GAMgASgIOgVmYWxzZVILZGVidWdSZWRhY3QSVQoPZmVhdHVyZV9zdXBwb3J0GAQgASgLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5GZWF0dXJlU3VwcG9ydFIOZmVhdHVyZVN1cHBvcnQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLVAQoOU2VydmljZU9wdGlvbnMSNwoIZmVhdHVyZXMYIiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKZAwoNTWV0aG9kT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJxChFpZGVtcG90ZW5jeV9sZXZlbBgiIAEoDjIvLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLklkZW1wb3RlbmN5TGV2ZWw6E0lERU1QT1RFTkNZX1VOS05PV05SEGlkZW1wb3RlbmN5TGV2ZWwSNwoIZmVhdHVyZXMYIyABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iUAoQSWRlbXBvdGVuY3lMZXZlbBIXChNJREVNUE9URU5DWV9VTktOT1dOEAASEwoPTk9fU0lERV9FRkZFQ1RTEAESDgoKSURFTVBPVEVOVBACKgkI6AcQgICAgAIimgMKE1VuaW50ZXJwcmV0ZWRPcHRpb24SQQoEbmFtZRgCIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0UgRuYW1lEikKEGlkZW50aWZpZXJfdmFsdWUYAyABKAlSD2lkZW50aWZpZXJWYWx1ZRIsChJwb3NpdGl2ZV9pbnRfdmFsdWUYBCABKARSEHBvc2l0aXZlSW50VmFsdWUSLAoSbmVnYXRpdmVfaW50X3ZhbHVlGAUgASgDUhBuZWdhdGl2ZUludFZhbHVlEiEKDGRvdWJsZV92YWx1ZRgGIAEoAVILZG91YmxlVmFsdWUSIQoMc3RyaW5nX3ZhbHVlGAcgASgMUgtzdHJpbmdWYWx1ZRInCg9hZ2dyZWdhdGVfdmFsdWUYCCABKAlSDmFnZ3JlZ2F0ZVZhbHVlGkoKCE5hbWVQYXJ0EhsKCW5hbWVfcGFydBgBIAIoCVIIbmFtZVBhcnQSIQoMaXNfZXh0ZW5zaW9uGAIgAigIUgtpc0V4dGVuc2lvbiKnCgoKRmVhdHVyZVNldBKRAQoOZmllbGRfcHJlc2VuY2UYASABKA4yKS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5GaWVsZFByZXNlbmNlQj+IAQGYAQSYAQGiAQ0SCEVYUExJQ0lUGIQHogENEghJTVBMSUNJVBjnB6IBDRIIRVhQTElDSVQY6AeyAQMI6AdSDWZpZWxkUHJlc2VuY2USbAoJZW51bV90eXBlGAIgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuRW51bVR5cGVCKYgBAZgBBpgBAaIBCxIGQ0xPU0VEGIQHogEJEgRPUEVOGOcHsgEDCOgHUghlbnVtVHlwZRKYAQoXcmVwZWF0ZWRfZmllbGRfZW5jb2RpbmcYAyABKA4yMS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5SZXBlYXRlZEZpZWxkRW5jb2RpbmdCLYgBAZgBBJgBAaIBDRIIRVhQQU5ERUQYhAeiAQsSBlBBQ0tFRBjnB7IBAwjoB1IVcmVwZWF0ZWRGaWVsZEVuY29kaW5nEn4KD3V0ZjhfdmFsaWRhdGlvbhgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LlV0ZjhWYWxpZGF0aW9uQimIAQGYAQSYAQGiAQkSBE5PTkUYhAeiAQsSBlZFUklGWRjnB7IBAwjoB1IOdXRmOFZhbGlkYXRpb24SfgoQbWVzc2FnZV9lbmNvZGluZxgFIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0Lk1lc3NhZ2VFbmNvZGluZ0ImiAEBmAEEmAEBogEUEg9MRU5HVEhfUFJFRklYRUQYhAeyAQMI6AdSD21lc3NhZ2VFbmNvZGluZxKCAQoLanNvbl9mb3JtYXQYBiABKA4yJi5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5Kc29uRm9ybWF0QjmIAQGYAQOYAQaYAQGiARcSEkxFR0FDWV9CRVNUX0VGRk9SVBiEB6IBChIFQUxMT1cY5weyAQMI6AdSCmpzb25Gb3JtYXQiXAoNRmllbGRQcmVzZW5jZRIaChZGSUVMRF9QUkVTRU5DRV9VTktOT1dOEAASDAoIRVhQTElDSVQQARIMCghJTVBMSUNJVBACEhMKD0xFR0FDWV9SRVFVSVJFRBADIjcKCEVudW1UeXBlEhUKEUVOVU1fVFlQRV9VTktOT1dOEAASCAoET1BFThABEgoKBkNMT1NFRBACIlYKFVJlcGVhdGVkRmllbGRFbmNvZGluZxIjCh9SRVBFQVRFRF9GSUVMRF9FTkNPRElOR19VTktOT1dOEAASCgoGUEFDS0VEEAESDAoIRVhQQU5ERUQQAiJJCg5VdGY4VmFsaWRhdGlvbhIbChdVVEY4X1ZBTElEQVRJT05fVU5LTk9XThAAEgoKBlZFUklGWRACEggKBE5PTkUQAyIECAEQASJTCg9NZXNzYWdlRW5jb2RpbmcSHAoYTUVTU0FHRV9FTkNPRElOR19VTktOT1dOEAASEwoPTEVOR1RIX1BSRUZJWEVEEAESDQoJREVMSU1JVEVEEAIiSAoKSnNvbkZvcm1hdBIXChNKU09OX0ZPUk1BVF9VTktOT1dOEAASCQoFQUxMT1cQARIWChJMRUdBQ1lfQkVTVF9FRkZPUlQQAioGCOgHEItOKgYIi04QkE4qBgiQThCRTkoGCOcHEOgHIu8DChJGZWF0dXJlU2V0RGVmYXVsdHMSWAoIZGVmYXVsdHMYASADKAsyPC5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldERlZmF1bHRzLkZlYXR1cmVTZXRFZGl0aW9uRGVmYXVsdFIIZGVmYXVsdHMSQQoPbWluaW11bV9lZGl0aW9uGAQgASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SDm1pbmltdW1FZGl0aW9uEkEKD21heGltdW1fZWRpdGlvbhgFIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5tYXhpbXVtRWRpdGlvbhr4AQoYRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhJOChRvdmVycmlkYWJsZV9mZWF0dXJlcxgEIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UhNvdmVycmlkYWJsZUZlYXR1cmVzEkIKDmZpeGVkX2ZlYXR1cmVzGAUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSDWZpeGVkRmVhdHVyZXNKBAgBEAJKBAgCEANSCGZlYXR1cmVzIrUCCg5Tb3VyY2VDb2RlSW5mbxJECghsb2NhdGlvbhgBIAMoCzIoLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblIIbG9jYXRpb24azgEKCExvY2F0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEhYKBHNwYW4YAiADKAVCAhABUgRzcGFuEikKEGxlYWRpbmdfY29tbWVudHMYAyABKAlSD2xlYWRpbmdDb21tZW50cxIrChF0cmFpbGluZ19jb21tZW50cxgEIAEoCVIQdHJhaWxpbmdDb21tZW50cxI6ChlsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzGAYgAygJUhdsZWFkaW5nRGV0YWNoZWRDb21tZW50cyoMCIDsyv8BEIHsyv8BItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACKqcCCgdFZGl0aW9uEhMKD0VESVRJT05fVU5LTk9XThAAEhMKDkVESVRJT05fTEVHQUNZEIQHEhMKDkVESVRJT05fUFJPVE8yEOYHEhMKDkVESVRJT05fUFJPVE8zEOcHEhEKDEVESVRJT05fMjAyMxDoBxIRCgxFRElUSU9OXzIwMjQQ6QcSFwoTRURJVElPTl8xX1RFU1RfT05MWRABEhcKE0VESVRJT05fMl9URVNUX09OTFkQAhIdChdFRElUSU9OXzk5OTk3X1RFU1RfT05MWRCdjQYSHQoXRURJVElPTl85OTk5OF9URVNUX09OTFkQno0GEh0KF0VESVRJT05fOTk5OTlfVEVTVF9PTkxZEJ+NBhITCgtFRElUSU9OX01BWBD/////B0J+ChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9yUHJvdG9zSAFaLWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rlc2NyaXB0b3JwYvgBAaICA0dQQqoCGkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCvsBCh5nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiI6CghEdXJhdGlvbhIYCgdzZWNvbmRzGAEgASgDUgdzZWNvbmRzEhQKBW5hbm9zGAIgASgFUgVuYW5vc0KDAQoTY29tLmdvb2dsZS5wcm90b2J1ZkINRHVyYXRpb25Qcm90b1ABWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9kdXJhdGlvbnBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKrzEKF3ZhbGlkYXRlL3ZhbGlkYXRlLnByb3RvEgh2YWxpZGF0ZRogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90bxofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byLICAoKRmllbGRSdWxlcxIwCgdtZXNzYWdlGBEgASgLMhYudmFsaWRhdGUuTWVzc2FnZVJ1bGVzUgdtZXNzYWdlEiwKBWZsb2F0GAEgASgLMhQudmFsaWRhdGUuRmxvYXRSdWxlc0gAUgVmbG9hdBIvCgZkb3VibGUYAiABKAsyFS52YWxpZGF0ZS5Eb3VibGVSdWxlc0gAUgZkb3VibGUSLAoFaW50MzIYAyABKAsyFC52YWxpZGF0ZS5JbnQzMlJ1bGVzSABSBWludDMyEiwKBWludDY0GAQgASgLMhQudmFsaWRhdGUuSW50NjRSdWxlc0gAUgVpbnQ2NBIvCgZ1aW50MzIYBSABKAsyFS52YWxpZGF0ZS5VSW50MzJSdWxlc0gAUgZ1aW50MzISLwoGdWludDY0GAYgASgLMhUudmFsaWRhdGUuVUludDY0UnVsZXNIAFIGdWludDY0Ei8KBnNpbnQzMhgHIAEoCzIVLnZhbGlkYXRlLlNJbnQzMlJ1bGVzSABSBnNpbnQzMhIvCgZzaW50NjQYCCABKAsyFS52YWxpZGF0ZS5TSW50NjRSdWxlc0gAUgZzaW50NjQSMgoHZml4ZWQzMhgJIAEoCzIWLnZhbGlkYXRlLkZpeGVkMzJSdWxlc0gAUgdmaXhlZDMyEjIKB2ZpeGVkNjQYCiABKAsyFi52YWxpZGF0ZS5GaXhlZDY0UnVsZXNIAFIHZml4ZWQ2NBI1CghzZml4ZWQzMhgLIAEoCzIXLnZhbGlkYXRlLlNGaXhlZDMyUnVsZXNIAFIIc2ZpeGVkMzISNQoIc2ZpeGVkNjQYDCABKAsyFy52YWxpZGF0ZS5TRml4ZWQ2NFJ1bGVzSABSCHNmaXhlZDY0EikKBGJvb2wYDSABKAsyEy52YWxpZGF0ZS5Cb29sUnVsZXNIAFIEYm9vbBIvCgZzdHJpbmcYDiABKAsyFS52YWxpZGF0ZS5TdHJpbmdSdWxlc0gAUgZzdHJpbmcSLAoFYnl0ZXMYDyABKAsyFC52YWxpZGF0ZS5CeXRlc1J1bGVzSABSBWJ5dGVzEikKBGVudW0YECABKAsyEy52YWxpZGF0ZS5FbnVtUnVsZXNIAFIEZW51bRI1CghyZXBlYXRlZBgSIAEoCzIXLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXNIAFIIcmVwZWF0ZWQSJgoDbWFwGBMgASgLMhIudmFsaWRhdGUuTWFwUnVsZXNIAFIDbWFwEiYKA2FueRgUIAEoCzISLnZhbGlkYXRlLkFueVJ1bGVzSABSA2FueRI1CghkdXJhdGlvbhgVIAEoCzIXLnZhbGlkYXRlLkR1cmF0aW9uUnVsZXNIAFIIZHVyYXRpb24SOAoJdGltZXN0YW1wGBYgASgLMhgudmFsaWRhdGUuVGltZXN0YW1wUnVsZXNIAFIJdGltZXN0YW1wQgYKBHR5cGUisAEKCkZsb2F0UnVsZXMSFAoFY29uc3QYASABKAJSBWNvbnN0Eg4KAmx0GAIgASgCUgJsdBIQCgNsdGUYAyABKAJSA2x0ZRIOCgJndBgEIAEoAlICZ3QSEAoDZ3RlGAUgASgCUgNndGUSDgoCaW4YBiADKAJSAmluEhUKBm5vdF9pbhgHIAMoAlIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKxAQoLRG91YmxlUnVsZXMSFAoFY29uc3QYASABKAFSBWNvbnN0Eg4KAmx0GAIgASgBUgJsdBIQCgNsdGUYAyABKAFSA2x0ZRIOCgJndBgEIAEoAVICZ3QSEAoDZ3RlGAUgASgBUgNndGUSDgoCaW4YBiADKAFSAmluEhUKBm5vdF9pbhgHIAMoAVIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKwAQoKSW50MzJSdWxlcxIUCgVjb25zdBgBIAEoBVIFY29uc3QSDgoCbHQYAiABKAVSAmx0EhAKA2x0ZRgDIAEoBVIDbHRlEg4KAmd0GAQgASgFUgJndBIQCgNndGUYBSABKAVSA2d0ZRIOCgJpbhgGIAMoBVICaW4SFQoGbm90X2luGAcgAygFUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrABCgpJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgDUgVjb25zdBIOCgJsdBgCIAEoA1ICbHQSEAoDbHRlGAMgASgDUgNsdGUSDgoCZ3QYBCABKANSAmd0EhAKA2d0ZRgFIAEoA1IDZ3RlEg4KAmluGAYgAygDUgJpbhIVCgZub3RfaW4YByADKANSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1VJbnQzMlJ1bGVzEhQKBWNvbnN0GAEgASgNUgVjb25zdBIOCgJsdBgCIAEoDVICbHQSEAoDbHRlGAMgASgNUgNsdGUSDgoCZ3QYBCABKA1SAmd0EhAKA2d0ZRgFIAEoDVIDZ3RlEg4KAmluGAYgAygNUgJpbhIVCgZub3RfaW4YByADKA1SBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1VJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgEUgVjb25zdBIOCgJsdBgCIAEoBFICbHQSEAoDbHRlGAMgASgEUgNsdGUSDgoCZ3QYBCABKARSAmd0EhAKA2d0ZRgFIAEoBFIDZ3RlEg4KAmluGAYgAygEUgJpbhIVCgZub3RfaW4YByADKARSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1NJbnQzMlJ1bGVzEhQKBWNvbnN0GAEgASgRUgVjb25zdBIOCgJsdBgCIAEoEVICbHQSEAoDbHRlGAMgASgRUgNsdGUSDgoCZ3QYBCABKBFSAmd0EhAKA2d0ZRgFIAEoEVIDZ3RlEg4KAmluGAYgAygRUgJpbhIVCgZub3RfaW4YByADKBFSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1NJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgSUgVjb25zdBIOCgJsdBgCIAEoElICbHQSEAoDbHRlGAMgASgSUgNsdGUSDgoCZ3QYBCABKBJSAmd0EhAKA2d0ZRgFIAEoElIDZ3RlEg4KAmluGAYgAygSUgJpbhIVCgZub3RfaW4YByADKBJSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisgEKDEZpeGVkMzJSdWxlcxIUCgVjb25zdBgBIAEoB1IFY29uc3QSDgoCbHQYAiABKAdSAmx0EhAKA2x0ZRgDIAEoB1IDbHRlEg4KAmd0GAQgASgHUgJndBIQCgNndGUYBSABKAdSA2d0ZRIOCgJpbhgGIAMoB1ICaW4SFQoGbm90X2luGAcgAygHUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrIBCgxGaXhlZDY0UnVsZXMSFAoFY29uc3QYASABKAZSBWNvbnN0Eg4KAmx0GAIgASgGUgJsdBIQCgNsdGUYAyABKAZSA2x0ZRIOCgJndBgEIAEoBlICZ3QSEAoDZ3RlGAUgASgGUgNndGUSDgoCaW4YBiADKAZSAmluEhUKBm5vdF9pbhgHIAMoBlIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKzAQoNU0ZpeGVkMzJSdWxlcxIUCgVjb25zdBgBIAEoD1IFY29uc3QSDgoCbHQYAiABKA9SAmx0EhAKA2x0ZRgDIAEoD1IDbHRlEg4KAmd0GAQgASgPUgJndBIQCgNndGUYBSABKA9SA2d0ZRIOCgJpbhgGIAMoD1ICaW4SFQoGbm90X2luGAcgAygPUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrMBCg1TRml4ZWQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgQUgVjb25zdBIOCgJsdBgCIAEoEFICbHQSEAoDbHRlGAMgASgQUgNsdGUSDgoCZ3QYBCABKBBSAmd0EhAKA2d0ZRgFIAEoEFIDZ3RlEg4KAmluGAYgAygQUgJpbhIVCgZub3RfaW4YByADKBBSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkiIQoJQm9vbFJ1bGVzEhQKBWNvbnN0GAEgASgIUgVjb25zdCLUBQoLU3RyaW5nUnVsZXMSFAoFY29uc3QYASABKAlSBWNvbnN0EhAKA2xlbhgTIAEoBFIDbGVuEhcKB21pbl9sZW4YAiABKARSBm1pbkxlbhIXCgdtYXhfbGVuGAMgASgEUgZtYXhMZW4SGwoJbGVuX2J5dGVzGBQgASgEUghsZW5CeXRlcxIbCgltaW5fYnl0ZXMYBCABKARSCG1pbkJ5dGVzEhsKCW1heF9ieXRlcxgFIAEoBFIIbWF4Qnl0ZXMSGAoHcGF0dGVybhgGIAEoCVIHcGF0dGVybhIWCgZwcmVmaXgYByABKAlSBnByZWZpeBIWCgZzdWZmaXgYCCABKAlSBnN1ZmZpeBIaCghjb250YWlucxgJIAEoCVIIY29udGFpbnMSIQoMbm90X2NvbnRhaW5zGBcgASgJUgtub3RDb250YWlucxIOCgJpbhgKIAMoCVICaW4SFQoGbm90X2luGAsgAygJUgVub3RJbhIWCgVlbWFpbBgMIAEoCEgAUgVlbWFpbBIcCghob3N0bmFtZRgNIAEoCEgAUghob3N0bmFtZRIQCgJpcBgOIAEoCEgAUgJpcBIUCgRpcHY0GA8gASgISABSBGlwdjQSFAoEaXB2NhgQIAEoCEgAUgRpcHY2EhIKA3VyaRgRIAEoCEgAUgN1cmkSGQoHdXJpX3JlZhgSIAEoCEgAUgZ1cmlSZWYSGgoHYWRkcmVzcxgVIAEoCEgAUgdhZGRyZXNzEhQKBHV1aWQYFiABKAhIAFIEdXVpZBJAChB3ZWxsX2tub3duX3JlZ2V4GBggASgOMhQudmFsaWRhdGUuS25vd25SZWdleEgAUg53ZWxsS25vd25SZWdleBIcCgZzdHJpY3QYGSABKAg6BHRydWVSBnN0cmljdBIhCgxpZ25vcmVfZW1wdHkYGiABKAhSC2lnbm9yZUVtcHR5QgwKCndlbGxfa25vd24i4gIKCkJ5dGVzUnVsZXMSFAoFY29uc3QYASABKAxSBWNvbnN0EhAKA2xlbhgNIAEoBFIDbGVuEhcKB21pbl9sZW4YAiABKARSBm1pbkxlbhIXCgdtYXhfbGVuGAMgASgEUgZtYXhMZW4SGAoHcGF0dGVybhgEIAEoCVIHcGF0dGVybhIWCgZwcmVmaXgYBSABKAxSBnByZWZpeBIWCgZzdWZmaXgYBiABKAxSBnN1ZmZpeBIaCghjb250YWlucxgHIAEoDFIIY29udGFpbnMSDgoCaW4YCCADKAxSAmluEhUKBm5vdF9pbhgJIAMoDFIFbm90SW4SEAoCaXAYCiABKAhIAFICaXASFAoEaXB2NBgLIAEoCEgAUgRpcHY0EhQKBGlwdjYYDCABKAhIAFIEaXB2NhIhCgxpZ25vcmVfZW1wdHkYDiABKAhSC2lnbm9yZUVtcHR5QgwKCndlbGxfa25vd24iawoJRW51bVJ1bGVzEhQKBWNvbnN0GAEgASgFUgVjb25zdBIhCgxkZWZpbmVkX29ubHkYAiABKAhSC2RlZmluZWRPbmx5Eg4KAmluGAMgAygFUgJpbhIVCgZub3RfaW4YBCADKAVSBW5vdEluIj4KDE1lc3NhZ2VSdWxlcxISCgRza2lwGAEgASgIUgRza2lwEhoKCHJlcXVpcmVkGAIgASgIUghyZXF1aXJlZCKwAQoNUmVwZWF0ZWRSdWxlcxIbCgltaW5faXRlbXMYASABKARSCG1pbkl0ZW1zEhsKCW1heF9pdGVtcxgCIAEoBFIIbWF4SXRlbXMSFgoGdW5pcXVlGAMgASgIUgZ1bmlxdWUSKgoFaXRlbXMYBCABKAsyFC52YWxpZGF0ZS5GaWVsZFJ1bGVzUgVpdGVtcxIhCgxpZ25vcmVfZW1wdHkYBSABKAhSC2lnbm9yZUVtcHR5ItwBCghNYXBSdWxlcxIbCgltaW5fcGFpcnMYASABKARSCG1pblBhaXJzEhsKCW1heF9wYWlycxgCIAEoBFIIbWF4UGFpcnMSGwoJbm9fc3BhcnNlGAMgASgIUghub1NwYXJzZRIoCgRrZXlzGAQgASgLMhQudmFsaWRhdGUuRmllbGRSdWxlc1IEa2V5cxIsCgZ2YWx1ZXMYBSABKAsyFC52YWxpZGF0ZS5GaWVsZFJ1bGVzUgZ2YWx1ZXMSIQoMaWdub3JlX2VtcHR5GAYgASgIUgtpZ25vcmVFbXB0eSJNCghBbnlSdWxlcxIaCghyZXF1aXJlZBgBIAEoCFIIcmVxdWlyZWQSDgoCaW4YAiADKAlSAmluEhUKBm5vdF9pbhgDIAMoCVIFbm90SW4i6QIKDUR1cmF0aW9uUnVsZXMSGgoIcmVxdWlyZWQYASABKAhSCHJlcXVpcmVkEi8KBWNvbnN0GAIgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgVjb25zdBIpCgJsdBgDIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblICbHQSKwoDbHRlGAQgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgNsdGUSKQoCZ3QYBSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25SAmd0EisKA2d0ZRgGIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblIDZ3RlEikKAmluGAcgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgJpbhIwCgZub3RfaW4YCCADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25SBW5vdEluIvMCCg5UaW1lc3RhbXBSdWxlcxIaCghyZXF1aXJlZBgBIAEoCFIIcmVxdWlyZWQSMAoFY29uc3QYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgVjb25zdBIqCgJsdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSAmx0EiwKA2x0ZRgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSA2x0ZRIqCgJndBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSAmd0EiwKA2d0ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSA2d0ZRIVCgZsdF9ub3cYByABKAhSBWx0Tm93EhUKBmd0X25vdxgIIAEoCFIFZ3ROb3cSMQoGd2l0aGluGAkgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgZ3aXRoaW4qRgoKS25vd25SZWdleBILCgdVTktOT1dOEAASFAoQSFRUUF9IRUFERVJfTkFNRRABEhUKEUhUVFBfSEVBREVSX1ZBTFVFEAI6PAoIZGlzYWJsZWQSHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYrwggASgIUghkaXNhYmxlZDo6CgdpZ25vcmVkEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGLAIIAEoCFIHaWdub3JlZDo6CghyZXF1aXJlZBIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMYrwggASgIUghyZXF1aXJlZDpKCgVydWxlcxIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYrwggASgLMhQudmFsaWRhdGUuRmllbGRSdWxlc1IFcnVsZXNCUAoaaW8uZW52b3lwcm94eS5wZ3YudmFsaWRhdGVaMmdpdGh1Yi5jb20vZW52b3lwcm94eS9wcm90b2MtZ2VuLXZhbGlkYXRlL3ZhbGlkYXRlCrcDCgxjb21tb24ucHJvdG8SBmNvbW1vbiKHAQoKUGFja2FnZU1hcBI8CghwYWNrYWdlcxgBIAMoCzIgLmNvbW1vbi5QYWNrYWdlTWFwLlBhY2thZ2VzRW50cnlSCHBhY2thZ2VzGjsKDVBhY2thZ2VzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAxSBXZhbHVlOgI4ASJFChFTaWduaW5nQ29tbWl0bWVudBIWCgZoaWRpbmcYASABKAxSBmhpZGluZxIYCgdiaW5kaW5nGAIgASgMUgdiaW5kaW5nIjgKDVNpZ25pbmdSZXN1bHQSJwoPc2lnbmF0dXJlX3NoYXJlGAEgASgMUg5zaWduYXR1cmVTaGFyZSpdCg9TaWduYXR1cmVJbnRlbnQSDAoIQ1JFQVRJT04QABIMCghUUkFOU0ZFUhABEg0KCUFHR1JFR0FURRACEg8KB1JFRlJFU0gQAxoCCAESDgoGRVhURU5EEAQaAggBQi1aK2dpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9jb21tb25iBnByb3RvMwqeuQIKC3NwYXJrLnByb3RvEgVzcGFyaxofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bxobZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvGhd2YWxpZGF0ZS92YWxpZGF0ZS5wcm90bxoMY29tbW9uLnByb3RvIkoKGFN1YnNjcmliZVRvRXZlbnRzUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAogASgMUhFpZGVudGl0eVB1YmxpY0tleSLAAQoZU3Vic2NyaWJlVG9FdmVudHNSZXNwb25zZRIyCgh0cmFuc2ZlchgBIAEoCzIULnNwYXJrLlRyYW5zZmVyRXZlbnRIAFIIdHJhbnNmZXISLwoHZGVwb3NpdBgCIAEoCzITLnNwYXJrLkRlcG9zaXRFdmVudEgAUgdkZXBvc2l0EjUKCWNvbm5lY3RlZBgDIAEoCzIVLnNwYXJrLkNvbm5lY3RlZEV2ZW50SABSCWNvbm5lY3RlZEIHCgVldmVudCIQCg5Db25uZWN0ZWRFdmVudCI8Cg1UcmFuc2ZlckV2ZW50EisKCHRyYW5zZmVyGAogASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIjkKDERlcG9zaXRFdmVudBIpCgdkZXBvc2l0GAogASgLMg8uc3BhcmsuVHJlZU5vZGVSB2RlcG9zaXQicgoLUGFnZVJlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgFUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIuCglkaXJlY3Rpb24YAyABKA4yEC5zcGFyay5EaXJlY3Rpb25SCWRpcmVjdGlvbiKoAQoMUGFnZVJlc3BvbnNlEiIKDWhhc19uZXh0X3BhZ2UYASABKAhSC2hhc05leHRQYWdlEioKEWhhc19wcmV2aW91c19wYWdlGAIgASgIUg9oYXNQcmV2aW91c1BhZ2USHwoLbmV4dF9jdXJzb3IYAyABKAlSCm5leHRDdXJzb3ISJwoPcHJldmlvdXNfY3Vyc29yGAQgASgJUg5wcmV2aW91c0N1cnNvciKAAgoTRGVwb3NpdEFkZHJlc3NQcm9vZhJgChJhZGRyZXNzX3NpZ25hdHVyZXMYASADKAsyMS5zcGFyay5EZXBvc2l0QWRkcmVzc1Byb29mLkFkZHJlc3NTaWduYXR1cmVzRW50cnlSEWFkZHJlc3NTaWduYXR1cmVzEkEKHXByb29mX29mX3Bvc3Nlc3Npb25fc2lnbmF0dXJlGAIgASgMUhpwcm9vZk9mUG9zc2Vzc2lvblNpZ25hdHVyZRpEChZBZGRyZXNzU2lnbmF0dXJlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEilQIKHUdlbmVyYXRlRGVwb3NpdEFkZHJlc3NSZXF1ZXN0EiwKEnNpZ25pbmdfcHVibGljX2tleRgBIAEoDFIQc2lnbmluZ1B1YmxpY0tleRIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhFpZGVudGl0eVB1YmxpY0tleRIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsSJgoHbGVhZl9pZBgEIAEoCUII+kIFcgOwAQFIAFIGbGVhZklkiAEBEiAKCWlzX3N0YXRpYxgFIAEoCEgBUghpc1N0YXRpY4gBAUIKCghfbGVhZl9pZEIMCgpfaXNfc3RhdGljIrUBCgdBZGRyZXNzEhgKB2FkZHJlc3MYASABKAlSB2FkZHJlc3MSIwoNdmVyaWZ5aW5nX2tleRgCIAEoDFIMdmVyaWZ5aW5nS2V5Ek4KFWRlcG9zaXRfYWRkcmVzc19wcm9vZhgDIAEoCzIaLnNwYXJrLkRlcG9zaXRBZGRyZXNzUHJvb2ZSE2RlcG9zaXRBZGRyZXNzUHJvb2YSGwoJaXNfc3RhdGljGAUgASgIUghpc1N0YXRpYyJZCh5HZW5lcmF0ZURlcG9zaXRBZGRyZXNzUmVzcG9uc2USNwoPZGVwb3NpdF9hZGRyZXNzGAEgASgLMg4uc3BhcmsuQWRkcmVzc1IOZGVwb3NpdEFkZHJlc3MiyQEKI0dlbmVyYXRlU3RhdGljRGVwb3NpdEFkZHJlc3NSZXF1ZXN0EjUKEnNpZ25pbmdfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIQc2lnbmluZ1B1YmxpY0tleRI3ChNpZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUhFpZGVudGl0eVB1YmxpY0tleRIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsiXwokR2VuZXJhdGVTdGF0aWNEZXBvc2l0QWRkcmVzc1Jlc3BvbnNlEjcKD2RlcG9zaXRfYWRkcmVzcxgBIAEoCzIOLnNwYXJrLkFkZHJlc3NSDmRlcG9zaXRBZGRyZXNzInkKBFVUWE8SFQoGcmF3X3R4GAEgASgMUgVyYXdUeBISCgR2b3V0GAIgASgNUgR2b3V0EjIKB25ldHdvcmsYAyABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yaxISCgR0eGlkGAQgASgMUgR0eGlkIjkKCk5vZGVPdXRwdXQSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEhIKBHZvdXQYAiABKA1SBHZvdXQipgEKClNpZ25pbmdKb2ISLAoSc2lnbmluZ19wdWJsaWNfa2V5GAEgASgMUhBzaWduaW5nUHVibGljS2V5EhUKBnJhd190eBgCIAEoDFIFcmF3VHgSUwoYc2lnbmluZ19ub25jZV9jb21taXRtZW50GAMgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UhZzaWduaW5nTm9uY2VDb21taXRtZW50IsoCCg9TaWduaW5nS2V5c2hhcmUSKwoRb3duZXJfaWRlbnRpZmllcnMYASADKAlSEG93bmVySWRlbnRpZmllcnMSHAoJdGhyZXNob2xkGAIgASgNUgl0aHJlc2hvbGQSHQoKcHVibGljX2tleRgDIAEoDFIJcHVibGljS2V5Ek0KDXB1YmxpY19zaGFyZXMYBCADKAsyKC5zcGFyay5TaWduaW5nS2V5c2hhcmUuUHVibGljU2hhcmVzRW50cnlSDHB1YmxpY1NoYXJlcxI9Cgx1cGRhdGVkX3RpbWUYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgt1cGRhdGVkVGltZRo/ChFQdWJsaWNTaGFyZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoDFIFdmFsdWU6AjgBIsgECg1TaWduaW5nUmVzdWx0EkUKC3B1YmxpY19rZXlzGAEgAygLMiQuc3BhcmsuU2lnbmluZ1Jlc3VsdC5QdWJsaWNLZXlzRW50cnlSCnB1YmxpY0tleXMSbQoZc2lnbmluZ19ub25jZV9jb21taXRtZW50cxgCIAMoCzIxLnNwYXJrLlNpZ25pbmdSZXN1bHQuU2lnbmluZ05vbmNlQ29tbWl0bWVudHNFbnRyeVIXc2lnbmluZ05vbmNlQ29tbWl0bWVudHMSVAoQc2lnbmF0dXJlX3NoYXJlcxgDIAMoCzIpLnNwYXJrLlNpZ25pbmdSZXN1bHQuU2lnbmF0dXJlU2hhcmVzRW50cnlSD3NpZ25hdHVyZVNoYXJlcxJBChBzaWduaW5nX2tleXNoYXJlGAQgASgLMhYuc3BhcmsuU2lnbmluZ0tleXNoYXJlUg9zaWduaW5nS2V5c2hhcmUaPQoPUHVibGljS2V5c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEaZQocU2lnbmluZ05vbmNlQ29tbWl0bWVudHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIvCgV2YWx1ZRgCIAEoCzIZLmNvbW1vbi5TaWduaW5nQ29tbWl0bWVudFIFdmFsdWU6AjgBGkIKFFNpZ25hdHVyZVNoYXJlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEikgMKEFJlbmV3TGVhZlJlcXVlc3QSFwoHbGVhZl9pZBgBIAEoCVIGbGVhZklkEmoKH3JlbmV3X25vZGVfdGltZWxvY2tfc2lnbmluZ19qb2IYAiABKAsyIi5zcGFyay5SZW5ld05vZGVUaW1lbG9ja1NpZ25pbmdKb2JIAFIbcmVuZXdOb2RlVGltZWxvY2tTaWduaW5nSm9iEnAKIXJlbmV3X3JlZnVuZF90aW1lbG9ja19zaWduaW5nX2pvYhgDIAEoCzIkLnNwYXJrLlJlbmV3UmVmdW5kVGltZWxvY2tTaWduaW5nSm9iSABSHXJlbmV3UmVmdW5kVGltZWxvY2tTaWduaW5nSm9iEncKJHJlbmV3X25vZGVfemVyb190aW1lbG9ja19zaWduaW5nX2pvYhgEIAEoCzImLnNwYXJrLlJlbmV3Tm9kZVplcm9UaW1lbG9ja1NpZ25pbmdKb2JIAFIfcmVuZXdOb2RlWmVyb1RpbWVsb2NrU2lnbmluZ0pvYkIOCgxzaWduaW5nX2pvYnMipwUKG1JlbmV3Tm9kZVRpbWVsb2NrU2lnbmluZ0pvYhJXChlzcGxpdF9ub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIVc3BsaXROb2RlVHhTaWduaW5nSm9iEmQKIHNwbGl0X25vZGVfZGlyZWN0X3R4X3NpZ25pbmdfam9iGAIgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIbc3BsaXROb2RlRGlyZWN0VHhTaWduaW5nSm9iEkwKE25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhBub2RlVHhTaWduaW5nSm9iElAKFXJlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSEnJlZnVuZFR4U2lnbmluZ0pvYhJZChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgFIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISXQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJvCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgHIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIuoDCh1SZW5ld1JlZnVuZFRpbWVsb2NrU2lnbmluZ0pvYhJMChNub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIQbm9kZVR4U2lnbmluZ0pvYhJQChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISWQoaZGlyZWN0X25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhZkaXJlY3ROb2RlVHhTaWduaW5nSm9iEl0KHGRpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBCABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhhkaXJlY3RSZWZ1bmRUeFNpZ25pbmdKb2ISbwomZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBSABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUiBkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ0pvYiKTAwofUmVuZXdOb2RlWmVyb1RpbWVsb2NrU2lnbmluZ0pvYhJMChNub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIQbm9kZVR4U2lnbmluZ0pvYhJQChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISWQoaZGlyZWN0X25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhZkaXJlY3ROb2RlVHhTaWduaW5nSm9iEm8KJmRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAUgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIgZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25pbmdKb2JKBAgEEAUi0wIKEVJlbmV3TGVhZlJlc3BvbnNlEl0KGnJlbmV3X25vZGVfdGltZWxvY2tfcmVzdWx0GAEgASgLMh4uc3BhcmsuUmVuZXdOb2RlVGltZWxvY2tSZXN1bHRIAFIXcmVuZXdOb2RlVGltZWxvY2tSZXN1bHQSYwoccmVuZXdfcmVmdW5kX3RpbWVsb2NrX3Jlc3VsdBgCIAEoCzIgLnNwYXJrLlJlbmV3UmVmdW5kVGltZWxvY2tSZXN1bHRIAFIZcmVuZXdSZWZ1bmRUaW1lbG9ja1Jlc3VsdBJqCh9yZW5ld19ub2RlX3plcm9fdGltZWxvY2tfcmVzdWx0GAMgASgLMiIuc3BhcmsuUmVuZXdOb2RlWmVyb1RpbWVsb2NrUmVzdWx0SABSG3JlbmV3Tm9kZVplcm9UaW1lbG9ja1Jlc3VsdEIOCgxyZW5ld19yZXN1bHQibgoXUmVuZXdOb2RlVGltZWxvY2tSZXN1bHQSLgoKc3BsaXRfbm9kZRgBIAEoCzIPLnNwYXJrLlRyZWVOb2RlUglzcGxpdE5vZGUSIwoEbm9kZRgCIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgRub2RlIkAKGVJlbmV3UmVmdW5kVGltZWxvY2tSZXN1bHQSIwoEbm9kZRgBIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgRub2RlInIKG1JlbmV3Tm9kZVplcm9UaW1lbG9ja1Jlc3VsdBIuCgpzcGxpdF9ub2RlGAEgASgLMg8uc3BhcmsuVHJlZU5vZGVSCXNwbGl0Tm9kZRIjCgRub2RlGAIgASgLMg8uc3BhcmsuVHJlZU5vZGVSBG5vZGUijwQKE05vZGVTaWduYXR1cmVTaGFyZXMSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEkkKFm5vZGVfdHhfc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhNub2RlVHhTaWduaW5nUmVzdWx0Ek0KGHJlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgDIAEoCzIULnNwYXJrLlNpZ25pbmdSZXN1bHRSFXJlZnVuZFR4U2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAQgASgMUgx2ZXJpZnlpbmdLZXkSVgodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhlkaXJlY3ROb2RlVHhTaWduaW5nUmVzdWx0EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYByABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCLKAgoOTm9kZVNpZ25hdHVyZXMSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEioKEW5vZGVfdHhfc2lnbmF0dXJlGAIgASgMUg9ub2RlVHhTaWduYXR1cmUSLgoTcmVmdW5kX3R4X3NpZ25hdHVyZRgDIAEoDFIRcmVmdW5kVHhTaWduYXR1cmUSNwoYZGlyZWN0X25vZGVfdHhfc2lnbmF0dXJlGAQgASgMUhVkaXJlY3ROb2RlVHhTaWduYXR1cmUSOwoaZGlyZWN0X3JlZnVuZF90eF9zaWduYXR1cmUYBSABKAxSF2RpcmVjdFJlZnVuZFR4U2lnbmF0dXJlEk0KJGRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25hdHVyZRgGIAEoDFIfZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25hdHVyZSKKBAoYU3RhcnRUcmVlQ3JlYXRpb25SZXF1ZXN0Ei4KE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSEWlkZW50aXR5UHVibGljS2V5Ei8KDW9uX2NoYWluX3V0eG8YAiABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxJAChNyb290X3R4X3NpZ25pbmdfam9iGAMgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIQcm9vdFR4U2lnbmluZ0pvYhJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYBCABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISTQoaZGlyZWN0X3Jvb3RfdHhfc2lnbmluZ19qb2IYBSABKAsyES5zcGFyay5TaWduaW5nSm9iUhZkaXJlY3RSb290VHhTaWduaW5nSm9iElEKHGRpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBiABKAsyES5zcGFyay5TaWduaW5nSm9iUhhkaXJlY3RSZWZ1bmRUeFNpZ25pbmdKb2ISYwomZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYByABKAsyES5zcGFyay5TaWduaW5nSm9iUiBkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ0pvYiKNAQoZU3RhcnRUcmVlQ3JlYXRpb25SZXNwb25zZRIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSVwoacm9vdF9ub2RlX3NpZ25hdHVyZV9zaGFyZXMYAiABKAsyGi5zcGFyay5Ob2RlU2lnbmF0dXJlU2hhcmVzUhdyb290Tm9kZVNpZ25hdHVyZVNoYXJlcyKRBAofU3RhcnREZXBvc2l0VHJlZUNyZWF0aW9uUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIvCg1vbl9jaGFpbl91dHhvGAIgASgLMgsuc3BhcmsuVVRYT1ILb25DaGFpblV0eG8SQAoTcm9vdF90eF9zaWduaW5nX2pvYhgDIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEHJvb3RUeFNpZ25pbmdKb2ISRAoVcmVmdW5kX3R4X3NpZ25pbmdfam9iGAQgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIScmVmdW5kVHhTaWduaW5nSm9iEk0KGmRpcmVjdF9yb290X3R4X3NpZ25pbmdfam9iGAUgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIWZGlyZWN0Um9vdFR4U2lnbmluZ0pvYhJRChxkaXJlY3RfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAYgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIYZGlyZWN0UmVmdW5kVHhTaWduaW5nSm9iEmMKJmRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAcgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIgZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25pbmdKb2IilAEKIFN0YXJ0RGVwb3NpdFRyZWVDcmVhdGlvblJlc3BvbnNlEhcKB3RyZWVfaWQYASABKAlSBnRyZWVJZBJXChpyb290X25vZGVfc2lnbmF0dXJlX3NoYXJlcxgCIAEoCzIaLnNwYXJrLk5vZGVTaWduYXR1cmVTaGFyZXNSF3Jvb3ROb2RlU2lnbmF0dXJlU2hhcmVzIpsBChJUb2tlbk91dHB1dFRvU3BlbmQSRgobcHJldl90b2tlbl90cmFuc2FjdGlvbl9oYXNoGAEgASgMQgf6QgR6AmggUhhwcmV2VG9rZW5UcmFuc2FjdGlvbkhhc2gSPQobcHJldl90b2tlbl90cmFuc2FjdGlvbl92b3V0GAIgASgNUhhwcmV2VG9rZW5UcmFuc2FjdGlvblZvdXQiWQoSVG9rZW5UcmFuc2ZlcklucHV0EkMKEG91dHB1dHNfdG9fc3BlbmQYASADKAsyGS5zcGFyay5Ub2tlbk91dHB1dFRvU3BlbmRSDm91dHB1dHNUb1NwZW5kIs8BCg5Ub2tlbk1pbnRJbnB1dBIzChFpc3N1ZXJfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIPaXNzdWVyUHVibGljS2V5EjoKGWlzc3Vlcl9wcm92aWRlZF90aW1lc3RhbXAYAiABKARSF2lzc3VlclByb3ZpZGVkVGltZXN0YW1wEjcKEHRva2VuX2lkZW50aWZpZXIYAyABKAxCB/pCBHoCaCBIAFIPdG9rZW5JZGVudGlmaWVyiAEBQhMKEV90b2tlbl9pZGVudGlmaWVyIvYCChBUb2tlbkNyZWF0ZUlucHV0EjMKEWlzc3Vlcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg9pc3N1ZXJQdWJsaWNLZXkSJgoKdG9rZW5fbmFtZRgCIAEoCUIH+kIEcgIYFFIJdG9rZW5OYW1lEioKDHRva2VuX3RpY2tlchgDIAEoCUIH+kIEcgIYBlILdG9rZW5UaWNrZXISJAoIZGVjaW1hbHMYBCABKA1CCPpCBSoDGP8BUghkZWNpbWFscxImCgptYXhfc3VwcGx5GAUgASgMQgf6QgR6AmgQUgltYXhTdXBwbHkSIQoMaXNfZnJlZXphYmxlGAYgASgIUgtpc0ZyZWV6YWJsZRJJChpjcmVhdGlvbl9lbnRpdHlfcHVibGljX2tleRgHIAEoDEIH+kIEegJoIUgAUhdjcmVhdGlvbkVudGl0eVB1YmxpY0tleYgBAUIdChtfY3JlYXRpb25fZW50aXR5X3B1YmxpY19rZXkixwQKC1Rva2VuT3V0cHV0Eh0KAmlkGAEgASgJQgj6QgVyA7ABAUgAUgJpZIgBARIxChBvd25lcl9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRJBChVyZXZvY2F0aW9uX2NvbW1pdG1lbnQYAyABKAxCB/pCBHoCaCFIAVIUcmV2b2NhdGlvbkNvbW1pdG1lbnSIAQESMQoSd2l0aGRyYXdfYm9uZF9zYXRzGAQgASgESAJSEHdpdGhkcmF3Qm9uZFNhdHOIAQESTAogd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWUYBSABKARIA1Idd2l0aGRyYXdSZWxhdGl2ZUJsb2NrTG9ja3RpbWWIAQESNgoQdG9rZW5fcHVibGljX2tleRgGIAEoDEIH+kIEegJoIUgEUg50b2tlblB1YmxpY0tleYgBARI3ChB0b2tlbl9pZGVudGlmaWVyGAggASgMQgf6QgR6AmggSAVSD3Rva2VuSWRlbnRpZmllcogBARIqCgx0b2tlbl9hbW91bnQYByABKAxCB/pCBHoCaBBSC3Rva2VuQW1vdW50QgUKA19pZEIYChZfcmV2b2NhdGlvbl9jb21taXRtZW50QhUKE193aXRoZHJhd19ib25kX3NhdHNCIwohX3dpdGhkcmF3X3JlbGF0aXZlX2Jsb2NrX2xvY2t0aW1lQhMKEV90b2tlbl9wdWJsaWNfa2V5QhMKEV90b2tlbl9pZGVudGlmaWVyIqUDChBUb2tlblRyYW5zYWN0aW9uEjYKCm1pbnRfaW5wdXQYASABKAsyFS5zcGFyay5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSQgoOdHJhbnNmZXJfaW5wdXQYAiABKAsyGS5zcGFyay5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBI8CgxjcmVhdGVfaW5wdXQYBSABKAsyFy5zcGFyay5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0EjcKDXRva2VuX291dHB1dHMYAyADKAsyEi5zcGFyay5Ub2tlbk91dHB1dFIMdG9rZW5PdXRwdXRzEloKI3NwYXJrX29wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXlzGAQgAygMQgz6QgmSAQYiBHoCaCFSH3NwYXJrT3BlcmF0b3JJZGVudGl0eVB1YmxpY0tleXMSMgoHbmV0d29yaxgKIAEoDjIOLnNwYXJrLk5ldHdvcmtCCPpCBYIBAiAAUgduZXR3b3JrQg4KDHRva2VuX2lucHV0cyJeChJTaWduYXR1cmVXaXRoSW5kZXgSJwoJc2lnbmF0dXJlGAEgASgMQgn6QgZ6BBBAGElSCXNpZ25hdHVyZRIfCgtpbnB1dF9pbmRleBgCIAEoDVIKaW5wdXRJbmRleCLFAQovT3BlcmF0b3JTcGVjaWZpY1Rva2VuVHJhbnNhY3Rpb25TaWduYWJsZVBheWxvYWQSSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgBIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaBJIChxvcGVyYXRvcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUhlvcGVyYXRvcklkZW50aXR5UHVibGljS2V5IrYBCh5PcGVyYXRvclNwZWNpZmljT3duZXJTaWduYXR1cmUSQgoPb3duZXJfc2lnbmF0dXJlGAEgASgLMhkuc3BhcmsuU2lnbmF0dXJlV2l0aEluZGV4Ug5vd25lclNpZ25hdHVyZRJQCgdwYXlsb2FkGAIgASgLMjYuc3BhcmsuT3BlcmF0b3JTcGVjaWZpY1Rva2VuVHJhbnNhY3Rpb25TaWduYWJsZVBheWxvYWRSB3BheWxvYWQicgoZUmV2b2NhdGlvblNlY3JldFdpdGhJbmRleBIfCgtpbnB1dF9pbmRleBgBIAEoDVIKaW5wdXRJbmRleBI0ChFyZXZvY2F0aW9uX3NlY3JldBgCIAEoDEIH+kIEegJoIFIQcmV2b2NhdGlvblNlY3JldCL4AgoTRnJlZXplVG9rZW5zUGF5bG9hZBIxChBvd25lcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRIxChB0b2tlbl9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUg50b2tlblB1YmxpY0tleRI6Chlpc3N1ZXJfcHJvdmlkZWRfdGltZXN0YW1wGAMgASgEUhdpc3N1ZXJQcm92aWRlZFRpbWVzdGFtcBJIChxvcGVyYXRvcl9pZGVudGl0eV9wdWJsaWNfa2V5GAQgASgMQgf6QgR6AmghUhlvcGVyYXRvcklkZW50aXR5UHVibGljS2V5EicKD3Nob3VsZF91bmZyZWV6ZRgFIAEoCFIOc2hvdWxkVW5mcmVlemUSNwoQdG9rZW5faWRlbnRpZmllchgGIAEoDEIH+kIEegJoIEgAUg90b2tlbklkZW50aWZpZXKIAQFCEwoRX3Rva2VuX2lkZW50aWZpZXIimwEKE0ZyZWV6ZVRva2Vuc1JlcXVlc3QSTgoVZnJlZXplX3Rva2Vuc19wYXlsb2FkGAEgASgLMhouc3BhcmsuRnJlZXplVG9rZW5zUGF5bG9hZFITZnJlZXplVG9rZW5zUGF5bG9hZBI0ChBpc3N1ZXJfc2lnbmF0dXJlGAIgASgMQgn6QgZ6BBBAGElSD2lzc3VlclNpZ25hdHVyZSKJAQoURnJlZXplVG9rZW5zUmVzcG9uc2USPQoTaW1wYWN0ZWRfb3V0cHV0X2lkcxgBIAMoCUIN+kIKkgEHIgVyA7ABAVIRaW1wYWN0ZWRPdXRwdXRJZHMSMgoVaW1wYWN0ZWRfdG9rZW5fYW1vdW50GAIgASgMUhNpbXBhY3RlZFRva2VuQW1vdW50Iv0FCghUcmVlTm9kZRIOCgJpZBgBIAEoCVICaWQSFwoHdHJlZV9pZBgCIAEoCVIGdHJlZUlkEhQKBXZhbHVlGAMgASgEUgV2YWx1ZRIpCg5wYXJlbnRfbm9kZV9pZBgEIAEoCUgAUgxwYXJlbnROb2RlSWSIAQESFwoHbm9kZV90eBgFIAEoDFIGbm9kZVR4EhsKCXJlZnVuZF90eBgGIAEoDFIIcmVmdW5kVHgSEgoEdm91dBgHIAEoDVIEdm91dBIwChR2ZXJpZnlpbmdfcHVibGljX2tleRgIIAEoDFISdmVyaWZ5aW5nUHVibGljS2V5EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYCSABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQQoQc2lnbmluZ19rZXlzaGFyZRgKIAEoCzIWLnNwYXJrLlNpZ25pbmdLZXlzaGFyZVIPc2lnbmluZ0tleXNoYXJlEhYKBnN0YXR1cxgLIAEoCVIGc3RhdHVzEigKB25ldHdvcmsYDCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEj0KDGNyZWF0ZWRfdGltZRgNIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSC2NyZWF0ZWRUaW1lEj0KDHVwZGF0ZWRfdGltZRgOIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSC3VwZGF0ZWRUaW1lEjcKGG93bmVyX3NpZ25pbmdfcHVibGljX2tleRgPIAEoDFIVb3duZXJTaWduaW5nUHVibGljS2V5EhsKCWRpcmVjdF90eBgQIAEoDFIIZGlyZWN0VHgSKAoQZGlyZWN0X3JlZnVuZF90eBgRIAEoDFIOZGlyZWN0UmVmdW5kVHgSOgoaZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHgYEiABKAxSFmRpcmVjdEZyb21DcGZwUmVmdW5kVHhCEQoPX3BhcmVudF9ub2RlX2lkIpABCh1GaW5hbGl6ZU5vZGVTaWduYXR1cmVzUmVxdWVzdBIvCgZpbnRlbnQYASABKA4yFy5jb21tb24uU2lnbmF0dXJlSW50ZW50UgZpbnRlbnQSPgoPbm9kZV9zaWduYXR1cmVzGAIgAygLMhUuc3BhcmsuTm9kZVNpZ25hdHVyZXNSDm5vZGVTaWduYXR1cmVzIkcKHkZpbmFsaXplTm9kZVNpZ25hdHVyZXNSZXNwb25zZRIlCgVub2RlcxgBIAMoCzIPLnNwYXJrLlRyZWVOb2RlUgVub2RlcyJICgtTZWNyZXRTaGFyZRIhCgxzZWNyZXRfc2hhcmUYASABKAxSC3NlY3JldFNoYXJlEhYKBnByb29mcxgCIAMoDFIGcHJvb2ZzIiUKC1NlY3JldFByb29mEhYKBnByb29mcxgBIAMoDFIGcHJvb2ZzIq8CChZMZWFmUmVmdW5kVHhTaWduaW5nSm9iEhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgDIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIr4CChZVc2VyU2lnbmVkVHhTaWduaW5nSm9iEhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBIsChJzaWduaW5nX3B1YmxpY19rZXkYAiABKAxSEHNpZ25pbmdQdWJsaWNLZXkSFQoGcmF3X3R4GAMgASgMUgVyYXdUeBJTChhzaWduaW5nX25vbmNlX2NvbW1pdG1lbnQYBCABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSFnNpZ25pbmdOb25jZUNvbW1pdG1lbnQSJQoOdXNlcl9zaWduYXR1cmUYBSABKAxSDXVzZXJTaWduYXR1cmUSSgoTc2lnbmluZ19jb21taXRtZW50cxgGIAEoCzIZLnNwYXJrLlNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzIvICChlMZWFmUmVmdW5kVHhTaWduaW5nUmVzdWx0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSIwoNdmVyaWZ5aW5nX2tleRgDIAEoDFIMdmVyaWZ5aW5nS2V5EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBCABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCL1AwoeU3RhcnRVc2VyU2lnbmVkVHJhbnNmZXJSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQwoObGVhdmVzX3RvX3NlbmQYAyADKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUgxsZWF2ZXNUb1NlbmQSPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgEIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRI7CgtleHBpcnlfdGltZRgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSCmV4cGlyeVRpbWUSUAoVZGlyZWN0X2xlYXZlc190b19zZW5kGAYgAygLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlISZGlyZWN0TGVhdmVzVG9TZW5kEmIKH2RpcmVjdF9mcm9tX2NwZnBfbGVhdmVzX3RvX3NlbmQYByADKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhpkaXJlY3RGcm9tQ3BmcExlYXZlc1RvU2VuZCKpAwoUU3RhcnRUcmFuc2ZlclJlcXVlc3QSHwoLdHJhbnNmZXJfaWQYASABKAlSCnRyYW5zZmVySWQSOQoZb3duZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDFIWb3duZXJJZGVudGl0eVB1YmxpY0tleRJDCg5sZWF2ZXNfdG9fc2VuZBgDIAMoCzIdLnNwYXJrLkxlYWZSZWZ1bmRUeFNpZ25pbmdKb2JSDGxlYXZlc1RvU2VuZBI/ChxyZWNlaXZlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAQgASgMUhlyZWNlaXZlcklkZW50aXR5UHVibGljS2V5EjsKC2V4cGlyeV90aW1lGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIKZXhwaXJ5VGltZRJBChB0cmFuc2Zlcl9wYWNrYWdlGAcgASgLMhYuc3BhcmsuVHJhbnNmZXJQYWNrYWdlUg90cmFuc2ZlclBhY2thZ2USIwoNc3BhcmtfaW52b2ljZRgKIAEoCVIMc3BhcmtJbnZvaWNlSgQIBhAHSgQICRAKIo8BChVTdGFydFRyYW5zZmVyUmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXISSQoPc2lnbmluZ19yZXN1bHRzGAIgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi0AMKD1RyYW5zZmVyUGFja2FnZRJDCg5sZWF2ZXNfdG9fc2VuZBgBIAMoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSDGxlYXZlc1RvU2VuZBJXChFrZXlfdHdlYWtfcGFja2FnZRgCIAMoCzIrLnNwYXJrLlRyYW5zZmVyUGFja2FnZS5LZXlUd2Vha1BhY2thZ2VFbnRyeVIPa2V5VHdlYWtQYWNrYWdlEiUKDnVzZXJfc2lnbmF0dXJlGAMgASgMUg11c2VyU2lnbmF0dXJlElAKFWRpcmVjdF9sZWF2ZXNfdG9fc2VuZBgEIAMoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSEmRpcmVjdExlYXZlc1RvU2VuZBJiCh9kaXJlY3RfZnJvbV9jcGZwX2xlYXZlc190b19zZW5kGAUgAygLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIaZGlyZWN0RnJvbUNwZnBMZWF2ZXNUb1NlbmQaQgoUS2V5VHdlYWtQYWNrYWdlRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAxSBXZhbHVlOgI4ASJSChFTZW5kTGVhZktleVR3ZWFrcxI9Cg5sZWF2ZXNfdG9fc2VuZBgBIAMoCzIXLnNwYXJrLlNlbmRMZWFmS2V5VHdlYWtSDGxlYXZlc1RvU2VuZCKDBAoQU2VuZExlYWZLZXlUd2VhaxIXCgdsZWFmX2lkGAEgASgJUgZsZWFmSWQSQAoSc2VjcmV0X3NoYXJlX3R3ZWFrGAIgASgLMhIuc3BhcmsuU2VjcmV0U2hhcmVSEHNlY3JldFNoYXJlVHdlYWsSXgoTcHVia2V5X3NoYXJlc190d2VhaxgDIAMoCzIuLnNwYXJrLlNlbmRMZWFmS2V5VHdlYWsuUHVia2V5U2hhcmVzVHdlYWtFbnRyeVIRcHVia2V5U2hhcmVzVHdlYWsSIwoNc2VjcmV0X2NpcGhlchgEIAEoDFIMc2VjcmV0Q2lwaGVyEhwKCXNpZ25hdHVyZRgFIAEoDFIJc2lnbmF0dXJlEikKEHJlZnVuZF9zaWduYXR1cmUYBiABKAxSD3JlZnVuZFNpZ25hdHVyZRI2ChdkaXJlY3RfcmVmdW5kX3NpZ25hdHVyZRgHIAEoDFIVZGlyZWN0UmVmdW5kU2lnbmF0dXJlEkgKIWRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3NpZ25hdHVyZRgIIAEoDFIdZGlyZWN0RnJvbUNwZnBSZWZ1bmRTaWduYXR1cmUaRAoWUHVia2V5U2hhcmVzVHdlYWtFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoDFIFdmFsdWU6AjgBIuYBChdGaW5hbGl6ZVRyYW5zZmVyUmVxdWVzdBIfCgt0cmFuc2Zlcl9pZBgBIAEoCVIKdHJhbnNmZXJJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5Ej0KDmxlYXZlc190b19zZW5kGAMgAygLMhcuc3BhcmsuU2VuZExlYWZLZXlUd2Vha1IMbGVhdmVzVG9TZW5kEjAKFHNwYXJrX3BheW1lbnRfaW50ZW50GAQgASgJUhJzcGFya1BheW1lbnRJbnRlbnQiywEKKkZpbmFsaXplVHJhbnNmZXJXaXRoVHJhbnNmZXJQYWNrYWdlUmVxdWVzdBIfCgt0cmFuc2Zlcl9pZBgBIAEoCVIKdHJhbnNmZXJJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EkEKEHRyYW5zZmVyX3BhY2thZ2UYAyABKAsyFi5zcGFyay5UcmFuc2ZlclBhY2thZ2VSD3RyYW5zZmVyUGFja2FnZSJHChhGaW5hbGl6ZVRyYW5zZmVyUmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXIiyAQKCFRyYW5zZmVyEg4KAmlkGAEgASgJUgJpZBI7ChpzZW5kZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDFIXc2VuZGVySWRlbnRpdHlQdWJsaWNLZXkSPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgDIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRItCgZzdGF0dXMYBCABKA4yFS5zcGFyay5UcmFuc2ZlclN0YXR1c1IGc3RhdHVzEh8KC3RvdGFsX3ZhbHVlGAUgASgEUgp0b3RhbFZhbHVlEjsKC2V4cGlyeV90aW1lGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIKZXhwaXJ5VGltZRIrCgZsZWF2ZXMYByADKAsyEy5zcGFyay5UcmFuc2ZlckxlYWZSBmxlYXZlcxI9CgxjcmVhdGVkX3RpbWUYCCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgtjcmVhdGVkVGltZRI9Cgx1cGRhdGVkX3RpbWUYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgt1cGRhdGVkVGltZRInCgR0eXBlGAogASgOMhMuc3BhcmsuVHJhbnNmZXJUeXBlUgR0eXBlEiMKDXNwYXJrX2ludm9pY2UYCyABKAlSDHNwYXJrSW52b2ljZRIoCgduZXR3b3JrGAwgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yayKEAwoMVHJhbnNmZXJMZWFmEiMKBGxlYWYYASABKAsyDy5zcGFyay5UcmVlTm9kZVIEbGVhZhIjCg1zZWNyZXRfY2lwaGVyGAIgASgMUgxzZWNyZXRDaXBoZXISHAoJc2lnbmF0dXJlGAMgASgMUglzaWduYXR1cmUSNAoWaW50ZXJtZWRpYXRlX3JlZnVuZF90eBgEIAEoDFIUaW50ZXJtZWRpYXRlUmVmdW5kVHgSQQodaW50ZXJtZWRpYXRlX2RpcmVjdF9yZWZ1bmRfdHgYBSABKAxSGmludGVybWVkaWF0ZURpcmVjdFJlZnVuZFR4ElMKJ2ludGVybWVkaWF0ZV9kaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eBgGIAEoDFIiaW50ZXJtZWRpYXRlRGlyZWN0RnJvbUNwZnBSZWZ1bmRUeBI+ChxwZW5kaW5nX2tleV90d2Vha19wdWJsaWNfa2V5GAcgASgMUhhwZW5kaW5nS2V5VHdlYWtQdWJsaWNLZXki8wMKDlRyYW5zZmVyRmlsdGVyEkEKHHJlY2VpdmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxIAFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRI9ChpzZW5kZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDEgAUhdzZW5kZXJJZGVudGl0eVB1YmxpY0tleRJTCiZzZW5kZXJfb3JfcmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRg8IAEoDEgAUiFzZW5kZXJPclJlY2VpdmVySWRlbnRpdHlQdWJsaWNLZXkSIQoMdHJhbnNmZXJfaWRzGAMgAygJUgt0cmFuc2ZlcklkcxIUCgVsaW1pdBgoIAEoA1IFbGltaXQSFgoGb2Zmc2V0GDIgASgDUgZvZmZzZXQSKQoFdHlwZXMYRiADKA4yEy5zcGFyay5UcmFuc2ZlclR5cGVSBXR5cGVzEigKB25ldHdvcmsYBCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEjEKCHN0YXR1c2VzGFAgAygOMhUuc3BhcmsuVHJhbnNmZXJTdGF0dXNSCHN0YXR1c2VzEiIKBW9yZGVyGAUgASgOMgwuc3BhcmsuT3JkZXJSBW9yZGVyQg0KC3BhcnRpY2lwYW50Il8KFlF1ZXJ5VHJhbnNmZXJzUmVzcG9uc2USLQoJdHJhbnNmZXJzGAEgAygLMg8uc3BhcmsuVHJhbnNmZXJSCXRyYW5zZmVycxIWCgZvZmZzZXQYAiABKANSBm9mZnNldCKVAgoRQ2xhaW1MZWFmS2V5VHdlYWsSFwoHbGVhZl9pZBgBIAEoCVIGbGVhZklkEkAKEnNlY3JldF9zaGFyZV90d2VhaxgCIAEoCzISLnNwYXJrLlNlY3JldFNoYXJlUhBzZWNyZXRTaGFyZVR3ZWFrEl8KE3B1YmtleV9zaGFyZXNfdHdlYWsYAyADKAsyLy5zcGFyay5DbGFpbUxlYWZLZXlUd2Vhay5QdWJrZXlTaGFyZXNUd2Vha0VudHJ5UhFwdWJrZXlTaGFyZXNUd2VhaxpEChZQdWJrZXlTaGFyZXNUd2Vha0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEiwQEKHUNsYWltVHJhbnNmZXJUd2Vha0tleXNSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSRAoRbGVhdmVzX3RvX3JlY2VpdmUYAyADKAsyGC5zcGFyay5DbGFpbUxlYWZLZXlUd2Vha1IPbGVhdmVzVG9SZWNlaXZlIsUBCh9DbGFpbVRyYW5zZmVyU2lnblJlZnVuZHNSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQAoMc2lnbmluZ19qb2JzGAMgAygLMh0uc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ0pvYlILc2lnbmluZ0pvYnNKBAgEEAUibQogQ2xhaW1UcmFuc2ZlclNpZ25SZWZ1bmRzUmVzcG9uc2USSQoPc2lnbmluZ19yZXN1bHRzGAEgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi9wEKGVN0b3JlUHJlaW1hZ2VTaGFyZVJlcXVlc3QSIQoMcGF5bWVudF9oYXNoGAEgASgMUgtwYXltZW50SGFzaBI5Cg5wcmVpbWFnZV9zaGFyZRgCIAEoCzISLnNwYXJrLlNlY3JldFNoYXJlUg1wcmVpbWFnZVNoYXJlEhwKCXRocmVzaG9sZBgDIAEoDVIJdGhyZXNob2xkEiUKDmludm9pY2Vfc3RyaW5nGAQgASgJUg1pbnZvaWNlU3RyaW5nEjcKGHVzZXJfaWRlbnRpdHlfcHVibGljX2tleRgFIAEoDFIVdXNlcklkZW50aXR5UHVibGljS2V5IoECChtSZXF1ZXN0ZWRTaWduaW5nQ29tbWl0bWVudHMSewoZc2lnbmluZ19ub25jZV9jb21taXRtZW50cxgBIAMoCzI/LnNwYXJrLlJlcXVlc3RlZFNpZ25pbmdDb21taXRtZW50cy5TaWduaW5nTm9uY2VDb21taXRtZW50c0VudHJ5UhdzaWduaW5nTm9uY2VDb21taXRtZW50cxplChxTaWduaW5nTm9uY2VDb21taXRtZW50c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ei8KBXZhbHVlGAIgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UgV2YWx1ZToCOAEiTwocR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVxdWVzdBIZCghub2RlX2lkcxgBIAMoCVIHbm9kZUlkcxIUCgVjb3VudBgCIAEoDVIFY291bnQidAodR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVzcG9uc2USUwoTc2lnbmluZ19jb21taXRtZW50cxgBIAMoCzIiLnNwYXJrLlJlcXVlc3RlZFNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzItoBChJTaWduaW5nQ29tbWl0bWVudHMSYgoTc2lnbmluZ19jb21taXRtZW50cxgBIAMoCzIxLnNwYXJrLlNpZ25pbmdDb21taXRtZW50cy5TaWduaW5nQ29tbWl0bWVudHNFbnRyeVISc2lnbmluZ0NvbW1pdG1lbnRzGmAKF1NpZ25pbmdDb21taXRtZW50c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ei8KBXZhbHVlGAIgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UgV2YWx1ZToCOAEixgIKEFVzZXJTaWduZWRSZWZ1bmQSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEhsKCXJlZnVuZF90eBgCIAEoDFIIcmVmdW5kVHgSJQoOdXNlcl9zaWduYXR1cmUYAyABKAxSDXVzZXJTaWduYXR1cmUSSgoTc2lnbmluZ19jb21taXRtZW50cxgEIAEoCzIZLnNwYXJrLlNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzElUKGXVzZXJfc2lnbmF0dXJlX2NvbW1pdG1lbnQYBSABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSF3VzZXJTaWduYXR1cmVDb21taXRtZW50EjIKB25ldHdvcmsYBiABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yayI7ChJJbnZvaWNlQW1vdW50UHJvb2YSJQoOYm9sdDExX2ludm9pY2UYASABKAlSDWJvbHQxMUludm9pY2UiewoNSW52b2ljZUFtb3VudBIdCgp2YWx1ZV9zYXRzGAEgASgEUgl2YWx1ZVNhdHMSSwoUaW52b2ljZV9hbW91bnRfcHJvb2YYAiABKAsyGS5zcGFyay5JbnZvaWNlQW1vdW50UHJvb2ZSEmludm9pY2VBbW91bnRQcm9vZiLWAwobSW5pdGlhdGVQcmVpbWFnZVN3YXBSZXF1ZXN0EiEKDHBheW1lbnRfaGFzaBgBIAEoDFILcGF5bWVudEhhc2gSOwoOaW52b2ljZV9hbW91bnQYAiABKAsyFC5zcGFyay5JbnZvaWNlQW1vdW50Ug1pbnZvaWNlQW1vdW50EkEKBnJlYXNvbhgDIAEoDjIpLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVxdWVzdC5SZWFzb25SBnJlYXNvbhJBCgh0cmFuc2ZlchgEIAEoCzIlLnNwYXJrLlN0YXJ0VXNlclNpZ25lZFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgFIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRIZCghmZWVfc2F0cxgGIAEoBFIHZmVlU2F0cxJGChB0cmFuc2Zlcl9yZXF1ZXN0GAcgASgLMhsuc3BhcmsuU3RhcnRUcmFuc2ZlclJlcXVlc3RSD3RyYW5zZmVyUmVxdWVzdCItCgZSZWFzb24SDwoLUkVBU09OX1NFTkQQABISCg5SRUFTT05fUkVDRUlWRRABImcKHEluaXRpYXRlUHJlaW1hZ2VTd2FwUmVzcG9uc2USGgoIcHJlaW1hZ2UYASABKAxSCHByZWltYWdlEisKCHRyYW5zZmVyGAIgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIjIKCE91dFBvaW50EhIKBHR4aWQYASABKAxSBHR4aWQSEgoEdm91dBgCIAEoDVIEdm91dCKHAQoWQ29vcGVyYXRpdmVFeGl0UmVxdWVzdBI3Cgh0cmFuc2ZlchgBIAEoCzIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ugh0cmFuc2ZlchIXCgdleGl0X2lkGAIgASgJUgZleGl0SWQSGwoJZXhpdF90eGlkGAMgASgMUghleGl0VHhpZCKRAQoXQ29vcGVyYXRpdmVFeGl0UmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXISSQoPc2lnbmluZ19yZXN1bHRzGAIgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMioAIKFkNvdW50ZXJMZWFmU3dhcFJlcXVlc3QSNwoIdHJhbnNmZXIYASABKAsyGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISFwoHc3dhcF9pZBgCIAEoCVIGc3dhcElkEiwKEmFkYXB0b3JfcHVibGljX2tleRgDIAEoDFIQYWRhcHRvclB1YmxpY0tleRI5ChlkaXJlY3RfYWRhcHRvcl9wdWJsaWNfa2V5GAQgASgMUhZkaXJlY3RBZGFwdG9yUHVibGljS2V5EksKI2RpcmVjdF9mcm9tX2NwZnBfYWRhcHRvcl9wdWJsaWNfa2V5GAUgASgMUh5kaXJlY3RGcm9tQ3BmcEFkYXB0b3JQdWJsaWNLZXkikQEKF0NvdW50ZXJMZWFmU3dhcFJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyEkkKD3NpZ25pbmdfcmVzdWx0cxgCIAMoCzIgLnNwYXJrLkxlYWZSZWZ1bmRUeFNpZ25pbmdSZXN1bHRSDnNpZ25pbmdSZXN1bHRzIqIBChZSZWZyZXNoVGltZWxvY2tSZXF1ZXN0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EjQKDHNpZ25pbmdfam9icxgDIAMoCzIRLnNwYXJrLlNpZ25pbmdKb2JSC3NpZ25pbmdKb2JzIoABChxSZWZyZXNoVGltZWxvY2tTaWduaW5nUmVzdWx0EjsKDnNpZ25pbmdfcmVzdWx0GAEgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFINc2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAIgASgMUgx2ZXJpZnlpbmdLZXkiZwoXUmVmcmVzaFRpbWVsb2NrUmVzcG9uc2USTAoPc2lnbmluZ19yZXN1bHRzGAEgAygLMiMuc3BhcmsuUmVmcmVzaFRpbWVsb2NrU2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi9gMKEUV4dGVuZExlYWZSZXF1ZXN0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EkAKE25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyES5zcGFyay5TaWduaW5nSm9iUhBub2RlVHhTaWduaW5nSm9iEkQKFXJlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEnJlZnVuZFR4U2lnbmluZ0pvYhJNChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgFIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgHIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iInsKF0V4dGVuZExlYWZTaWduaW5nUmVzdWx0EjsKDnNpZ25pbmdfcmVzdWx0GAEgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFINc2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAIgASgMUgx2ZXJpZnlpbmdLZXkimwQKEkV4dGVuZExlYWZSZXNwb25zZRIXCgdsZWFmX2lkGAEgASgJUgZsZWFmSWQSUwoWbm9kZV90eF9zaWduaW5nX3Jlc3VsdBgCIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UhNub2RlVHhTaWduaW5nUmVzdWx0ElcKGHJlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgDIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSYAodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBCABKAsyHi5zcGFyay5FeHRlbmRMZWFmU2lnbmluZ1Jlc3VsdFIZZGlyZWN0Tm9kZVR4U2lnbmluZ1Jlc3VsdBJkCh9kaXJlY3RfcmVmdW5kX3R4X3NpZ25pbmdfcmVzdWx0GAUgASgLMh4uc3BhcmsuRXh0ZW5kTGVhZlNpZ25pbmdSZXN1bHRSG2RpcmVjdFJlZnVuZFR4U2lnbmluZ1Jlc3VsdBJ2CilkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgGIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCJzChJBZGRyZXNzUmVxdWVzdE5vZGUSJgoPdXNlcl9wdWJsaWNfa2V5GAEgASgMUg11c2VyUHVibGljS2V5EjUKCGNoaWxkcmVuGAIgAygLMhkuc3BhcmsuQWRkcmVzc1JlcXVlc3ROb2RlUghjaGlsZHJlbiKDAgoZUHJlcGFyZVRyZWVBZGRyZXNzUmVxdWVzdBJBChJwYXJlbnRfbm9kZV9vdXRwdXQYASABKAsyES5zcGFyay5Ob2RlT3V0cHV0SABSEHBhcmVudE5vZGVPdXRwdXQSMQoNb25fY2hhaW5fdXR4bxgCIAEoCzILLnNwYXJrLlVUWE9IAFILb25DaGFpblV0eG8SLQoEbm9kZRgDIAEoCzIZLnNwYXJrLkFkZHJlc3NSZXF1ZXN0Tm9kZVIEbm9kZRI3Chh1c2VyX2lkZW50aXR5X3B1YmxpY19rZXkYBCABKAxSFXVzZXJJZGVudGl0eVB1YmxpY0tleUIICgZzb3VyY2UiZwoLQWRkcmVzc05vZGUSKAoHYWRkcmVzcxgBIAEoCzIOLnNwYXJrLkFkZHJlc3NSB2FkZHJlc3MSLgoIY2hpbGRyZW4YAiADKAsyEi5zcGFyay5BZGRyZXNzTm9kZVIIY2hpbGRyZW4iRAoaUHJlcGFyZVRyZWVBZGRyZXNzUmVzcG9uc2USJgoEbm9kZRgBIAEoCzISLnNwYXJrLkFkZHJlc3NOb2RlUgRub2RlIs4DCgxDcmVhdGlvbk5vZGUSQAoTbm9kZV90eF9zaWduaW5nX2pvYhgBIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEG5vZGVUeFNpZ25pbmdKb2ISRAoVcmVmdW5kX3R4X3NpZ25pbmdfam9iGAIgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIScmVmdW5kVHhTaWduaW5nSm9iEi8KCGNoaWxkcmVuGAMgAygLMhMuc3BhcmsuQ3JlYXRpb25Ob2RlUghjaGlsZHJlbhJNChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgFIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIvUBChFDcmVhdGVUcmVlUmVxdWVzdBJBChJwYXJlbnRfbm9kZV9vdXRwdXQYASABKAsyES5zcGFyay5Ob2RlT3V0cHV0SABSEHBhcmVudE5vZGVPdXRwdXQSMQoNb25fY2hhaW5fdXR4bxgCIAEoCzILLnNwYXJrLlVUWE9IAFILb25DaGFpblV0eG8SJwoEbm9kZRgDIAEoCzITLnNwYXJrLkNyZWF0aW9uTm9kZVIEbm9kZRI3Chh1c2VyX2lkZW50aXR5X3B1YmxpY19rZXkYBCABKAxSFXVzZXJJZGVudGl0eVB1YmxpY0tleUIICgZzb3VyY2UipAQKFENyZWF0aW9uUmVzcG9uc2VOb2RlEhcKB25vZGVfaWQYASABKAlSBm5vZGVJZBJJChZub2RlX3R4X3NpZ25pbmdfcmVzdWx0GAIgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFITbm9kZVR4U2lnbmluZ1Jlc3VsdBJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYAyABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSNwoIY2hpbGRyZW4YBCADKAsyGy5zcGFyay5DcmVhdGlvblJlc3BvbnNlTm9kZVIIY2hpbGRyZW4SVgodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhlkaXJlY3ROb2RlVHhTaWduaW5nUmVzdWx0EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYByABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCJFChJDcmVhdGVUcmVlUmVzcG9uc2USLwoEbm9kZRgBIAEoCzIbLnNwYXJrLkNyZWF0aW9uUmVzcG9uc2VOb2RlUgRub2RlIoQBChNTaWduaW5nT3BlcmF0b3JJbmZvEhQKBWluZGV4GAEgASgEUgVpbmRleBIeCgppZGVudGlmaWVyGAIgASgJUgppZGVudGlmaWVyEh0KCnB1YmxpY19rZXkYAyABKAxSCXB1YmxpY0tleRIYCgdhZGRyZXNzGAQgASgJUgdhZGRyZXNzIusBCh5HZXRTaWduaW5nT3BlcmF0b3JMaXN0UmVzcG9uc2USaAoRc2lnbmluZ19vcGVyYXRvcnMYASADKAsyOy5zcGFyay5HZXRTaWduaW5nT3BlcmF0b3JMaXN0UmVzcG9uc2UuU2lnbmluZ09wZXJhdG9yc0VudHJ5UhBzaWduaW5nT3BlcmF0b3JzGl8KFVNpZ25pbmdPcGVyYXRvcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIwCgV2YWx1ZRgCIAEoCzIaLnNwYXJrLlNpZ25pbmdPcGVyYXRvckluZm9SBXZhbHVlOgI4ASJyCh1RdWVyeVVzZXJTaWduZWRSZWZ1bmRzUmVxdWVzdBIhCgxwYXltZW50X2hhc2gYASABKAxSC3BheW1lbnRIYXNoEi4KE2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSEWlkZW50aXR5UHVibGljS2V5IpwBCh5RdWVyeVVzZXJTaWduZWRSZWZ1bmRzUmVzcG9uc2USRwoTdXNlcl9zaWduZWRfcmVmdW5kcxgBIAMoCzIXLnNwYXJrLlVzZXJTaWduZWRSZWZ1bmRSEXVzZXJTaWduZWRSZWZ1bmRzEisKCHRyYW5zZmVyGAMgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVySgQIAhADIqQDChtQcmVpbWFnZVJlcXVlc3RXaXRoVHJhbnNmZXISKgoMcGF5bWVudF9oYXNoGAEgASgMQgf6QgR6AmggUgtwYXltZW50SGFzaBJBChhyZWNlaXZlcl9pZGVudGl0eV9wdWJrZXkYAiABKAxCB/pCBHoCaCFSFnJlY2VpdmVySWRlbnRpdHlQdWJrZXkSNAoGc3RhdHVzGAMgASgOMhwuc3BhcmsuUHJlaW1hZ2VSZXF1ZXN0U3RhdHVzUgZzdGF0dXMSPQoMY3JlYXRlZF90aW1lGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFILY3JlYXRlZFRpbWUSMAoIdHJhbnNmZXIYBSABKAsyDy5zcGFyay5UcmFuc2ZlckgAUgh0cmFuc2ZlcogBARIfCghwcmVpbWFnZRgGIAEoDEgBUghwcmVpbWFnZYgBARI0ChZzZW5kZXJfaWRlbnRpdHlfcHVia2V5GAcgASgMUhRzZW5kZXJJZGVudGl0eVB1YmtleUILCglfdHJhbnNmZXJCCwoJX3ByZWltYWdlIsQCChBRdWVyeUh0bGNSZXF1ZXN0EiUKDnBheW1lbnRfaGFzaGVzGAEgAygMUg1wYXltZW50SGFzaGVzEjcKE2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSEWlkZW50aXR5UHVibGljS2V5EjkKBnN0YXR1cxgDIAEoDjIcLnNwYXJrLlByZWltYWdlUmVxdWVzdFN0YXR1c0gAUgZzdGF0dXOIAQESFAoFbGltaXQYBCABKANSBWxpbWl0EhYKBm9mZnNldBgFIAEoA1IGb2Zmc2V0EiEKDHRyYW5zZmVyX2lkcxgGIAMoCVILdHJhbnNmZXJJZHMSOQoKbWF0Y2hfcm9sZRgHIAEoDjIaLnNwYXJrLlByZWltYWdlUmVxdWVzdFJvbGVSCW1hdGNoUm9sZUIJCgdfc3RhdHVzInwKEVF1ZXJ5SHRsY1Jlc3BvbnNlEk8KEXByZWltYWdlX3JlcXVlc3RzGAEgAygLMiIuc3BhcmsuUHJlaW1hZ2VSZXF1ZXN0V2l0aFRyYW5zZmVyUhBwcmVpbWFnZVJlcXVlc3RzEhYKBm9mZnNldBgCIAEoA1IGb2Zmc2V0IocBChZQcm92aWRlUHJlaW1hZ2VSZXF1ZXN0EiEKDHBheW1lbnRfaGFzaBgBIAEoDFILcGF5bWVudEhhc2gSGgoIcHJlaW1hZ2UYAiABKAxSCHByZWltYWdlEi4KE2lkZW50aXR5X3B1YmxpY19rZXkYAyABKAxSEWlkZW50aXR5UHVibGljS2V5IkYKF1Byb3ZpZGVQcmVpbWFnZVJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIigKC1RyZWVOb2RlSWRzEhkKCG5vZGVfaWRzGAEgAygJUgdub2RlSWRzIrgCChFRdWVyeU5vZGVzUmVxdWVzdBI0ChVvd25lcl9pZGVudGl0eV9wdWJrZXkYASABKAxIAFITb3duZXJJZGVudGl0eVB1YmtleRIvCghub2RlX2lkcxgCIAEoCzISLnNwYXJrLlRyZWVOb2RlSWRzSABSB25vZGVJZHMSJwoPaW5jbHVkZV9wYXJlbnRzGAMgASgIUg5pbmNsdWRlUGFyZW50cxIUCgVsaW1pdBgEIAEoA1IFbGltaXQSFgoGb2Zmc2V0GAUgASgDUgZvZmZzZXQSKAoHbmV0d29yaxgGIAEoDjIOLnNwYXJrLk5ldHdvcmtSB25ldHdvcmsSMQoIc3RhdHVzZXMYByADKA4yFS5zcGFyay5UcmVlTm9kZVN0YXR1c1IIc3RhdHVzZXNCCAoGc291cmNlIrMBChJRdWVyeU5vZGVzUmVzcG9uc2USOgoFbm9kZXMYASADKAsyJC5zcGFyay5RdWVyeU5vZGVzUmVzcG9uc2UuTm9kZXNFbnRyeVIFbm9kZXMSFgoGb2Zmc2V0GAIgASgDUgZvZmZzZXQaSQoKTm9kZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIlCgV2YWx1ZRgCIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgV2YWx1ZToCOAEidQoVQ2FuY2VsVHJhbnNmZXJSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjsKGnNlbmRlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhdzZW5kZXJJZGVudGl0eVB1YmxpY0tleSJFChZDYW5jZWxUcmFuc2ZlclJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIqwBCiJRdWVyeVVudXNlZERlcG9zaXRBZGRyZXNzZXNSZXF1ZXN0Ei4KE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSEWlkZW50aXR5UHVibGljS2V5EigKB25ldHdvcmsYAiABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEhQKBWxpbWl0GAMgASgDUgVsaW1pdBIWCgZvZmZzZXQYBCABKANSBm9mZnNldCLuAQoiUXVlcnlTdGF0aWNEZXBvc2l0QWRkcmVzc2VzUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIoCgduZXR3b3JrGAIgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yaxIUCgVsaW1pdBgEIAEoA1IFbGltaXQSFgoGb2Zmc2V0GAUgASgDUgZvZmZzZXQSLAoPZGVwb3NpdF9hZGRyZXNzGAYgASgJSABSDmRlcG9zaXRBZGRyZXNziAEBQhIKEF9kZXBvc2l0X2FkZHJlc3MiygIKGURlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHQSJwoPZGVwb3NpdF9hZGRyZXNzGAEgASgJUg5kZXBvc2l0QWRkcmVzcxI1Chd1c2VyX3NpZ25pbmdfcHVibGljX2tleRgCIAEoDFIUdXNlclNpZ25pbmdQdWJsaWNLZXkSMAoUdmVyaWZ5aW5nX3B1YmxpY19rZXkYAyABKAxSEnZlcmlmeWluZ1B1YmxpY0tleRImCgdsZWFmX2lkGAQgASgJQgj6QgVyA7ABAUgAUgZsZWFmSWSIAQESTwoTcHJvb2Zfb2ZfcG9zc2Vzc2lvbhgFIAEoCzIaLnNwYXJrLkRlcG9zaXRBZGRyZXNzUHJvb2ZIAVIRcHJvb2ZPZlBvc3Nlc3Npb26IAQFCCgoIX2xlYWZfaWRCFgoUX3Byb29mX29mX3Bvc3Nlc3Npb24ijAEKI1F1ZXJ5VW51c2VkRGVwb3NpdEFkZHJlc3Nlc1Jlc3BvbnNlEk0KEWRlcG9zaXRfYWRkcmVzc2VzGAEgAygLMiAuc3BhcmsuRGVwb3NpdEFkZHJlc3NRdWVyeVJlc3VsdFIQZGVwb3NpdEFkZHJlc3NlcxIWCgZvZmZzZXQYAiABKANSBm9mZnNldCJ0CiNRdWVyeVN0YXRpY0RlcG9zaXRBZGRyZXNzZXNSZXNwb25zZRJNChFkZXBvc2l0X2FkZHJlc3NlcxgBIAMoCzIgLnNwYXJrLkRlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHRSEGRlcG9zaXRBZGRyZXNzZXMibwoTUXVlcnlCYWxhbmNlUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIoCgduZXR3b3JrGAIgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yayLFAQoUUXVlcnlCYWxhbmNlUmVzcG9uc2USGAoHYmFsYW5jZRgBIAEoBFIHYmFsYW5jZRJSCg1ub2RlX2JhbGFuY2VzGAIgAygLMi0uc3BhcmsuUXVlcnlCYWxhbmNlUmVzcG9uc2UuTm9kZUJhbGFuY2VzRW50cnlSDG5vZGVCYWxhbmNlcxo/ChFOb2RlQmFsYW5jZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoBFIFdmFsdWU6AjgBIsUBCgxTcGFya0FkZHJlc3MSLgoTaWRlbnRpdHlfcHVibGljX2tleRgBIAEoDFIRaWRlbnRpdHlQdWJsaWNLZXkSSwoUc3BhcmtfaW52b2ljZV9maWVsZHMYAiABKAsyGS5zcGFyay5TcGFya0ludm9pY2VGaWVsZHNSEnNwYXJrSW52b2ljZUZpZWxkcxIqCglzaWduYXR1cmUYAyABKAxCB/pCBHoCaEBIAFIJc2lnbmF0dXJliAEBQgwKCl9zaWduYXR1cmUinAMKElNwYXJrSW52b2ljZUZpZWxkcxIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEhcKAmlkGAIgASgMQgf6QgR6AmgQUgJpZBI9Cg50b2tlbnNfcGF5bWVudBgDIAEoCzIULnNwYXJrLlRva2Vuc1BheW1lbnRIAFINdG9rZW5zUGF5bWVudBI3CgxzYXRzX3BheW1lbnQYBCABKAsyEi5zcGFyay5TYXRzUGF5bWVudEgAUgtzYXRzUGF5bWVudBIgCgRtZW1vGAUgASgJQgf6QgRyAih4SAFSBG1lbW+IAQESOAoRc2VuZGVyX3B1YmxpY19rZXkYBiABKAxCB/pCBHoCaCFIAlIPc2VuZGVyUHVibGljS2V5iAEBEkAKC2V4cGlyeV90aW1lGAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgDUgpleHBpcnlUaW1liAEBQg4KDHBheW1lbnRfdHlwZUIHCgVfbWVtb0IUChJfc2VuZGVyX3B1YmxpY19rZXlCDgoMX2V4cGlyeV90aW1lIjUKC1NhdHNQYXltZW50EhsKBmFtb3VudBgBIAEoBEgAUgZhbW91bnSIAQFCCQoHX2Ftb3VudCKOAQoNVG9rZW5zUGF5bWVudBI3ChB0b2tlbl9pZGVudGlmaWVyGAEgASgMQgf6QgR6AmggSABSD3Rva2VuSWRlbnRpZmllcogBARIkCgZhbW91bnQYAiABKAxCB/pCBHoCGBBIAVIGYW1vdW50iAEBQhMKEV90b2tlbl9pZGVudGlmaWVyQgkKB19hbW91bnQixgEKJkluaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXF1ZXN0Ei8KDW9uX2NoYWluX3V0eG8YASABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAyABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISJQoOdXNlcl9zaWduYXR1cmUYBCABKAxSDXVzZXJTaWduYXR1cmUiwwEKJ0luaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXNwb25zZRJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYASABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSSQoPZGVwb3NpdF9hZGRyZXNzGAIgASgLMiAuc3BhcmsuRGVwb3NpdEFkZHJlc3NRdWVyeVJlc3VsdFIOZGVwb3NpdEFkZHJlc3MisAMKF0luaXRpYXRlVXR4b1N3YXBSZXF1ZXN0Ei8KDW9uX2NoYWluX3V0eG8YASABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxI9CgxyZXF1ZXN0X3R5cGUYAiABKA4yGi5zcGFyay5VdHhvU3dhcFJlcXVlc3RUeXBlUgtyZXF1ZXN0VHlwZRIuChJjcmVkaXRfYW1vdW50X3NhdHMYAyABKARIAFIQY3JlZGl0QW1vdW50U2F0cxIiCgxtYXhfZmVlX3NhdHMYBCABKARIAFIKbWF4RmVlU2F0cxIjCg1zc3Bfc2lnbmF0dXJlGAUgASgMUgxzc3BTaWduYXR1cmUSJQoOdXNlcl9zaWduYXR1cmUYBiABKAxSDXVzZXJTaWduYXR1cmUSNwoIdHJhbnNmZXIYByABKAsyGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISQgoUc3BlbmRfdHhfc2lnbmluZ19qb2IYCCABKAsyES5zcGFyay5TaWduaW5nSm9iUhFzcGVuZFR4U2lnbmluZ0pvYkIICgZhbW91bnQi3wEKGEluaXRpYXRlVXR4b1N3YXBSZXNwb25zZRJLChdzcGVuZF90eF9zaWduaW5nX3Jlc3VsdBgBIAEoCzIULnNwYXJrLlNpZ25pbmdSZXN1bHRSFHNwZW5kVHhTaWduaW5nUmVzdWx0EisKCHRyYW5zZmVyGAIgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyEkkKD2RlcG9zaXRfYWRkcmVzcxgDIAEoCzIgLnNwYXJrLkRlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHRSDmRlcG9zaXRBZGRyZXNzIosBCgtFeGl0aW5nVHJlZRIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSUQoXdXNlcl9zaWduaW5nX2NvbW1pdG1lbnQYAiABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSFXVzZXJTaWduaW5nQ29tbWl0bWVudBIQCgN2aW4YAyABKA1SA3ZpbiKcAQofRXhpdFNpbmdsZU5vZGVUcmVlU2lnbmluZ1Jlc3VsdBIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSOwoOc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0Ug1zaWduaW5nUmVzdWx0EiMKDXZlcmlmeWluZ19rZXkYAyABKAxSDHZlcmlmeWluZ0tleSJNChhCaXRjb2luVHJhbnNhY3Rpb25PdXRwdXQSFAoFdmFsdWUYASABKANSBXZhbHVlEhsKCXBrX3NjcmlwdBgCIAEoDFIIcGtTY3JpcHQi8wEKGkV4aXRTaW5nbGVOb2RlVHJlZXNSZXF1ZXN0EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSNwoNZXhpdGluZ190cmVlcxgCIAMoCzISLnNwYXJrLkV4aXRpbmdUcmVlUgxleGl0aW5nVHJlZXMSFQoGcmF3X3R4GAMgASgMUgVyYXdUeBJKChBwcmV2aW91c19vdXRwdXRzGAQgAygLMh8uc3BhcmsuQml0Y29pblRyYW5zYWN0aW9uT3V0cHV0Ug9wcmV2aW91c091dHB1dHMibgobRXhpdFNpbmdsZU5vZGVUcmVlc1Jlc3BvbnNlEk8KD3NpZ25pbmdfcmVzdWx0cxgBIAMoCzImLnNwYXJrLkV4aXRTaW5nbGVOb2RlVHJlZVNpZ25pbmdSZXN1bHRSDnNpZ25pbmdSZXN1bHRzIloKHVF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXF1ZXN0EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkizwEKHlF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXNwb25zZRJoChFub2RlX2Rpc3RyaWJ1dGlvbhgBIAMoCzI7LnNwYXJrLlF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXNwb25zZS5Ob2RlRGlzdHJpYnV0aW9uRW50cnlSEG5vZGVEaXN0cmlidXRpb24aQwoVTm9kZURpc3RyaWJ1dGlvbkVudHJ5EhAKA2tleRgBIAEoBFIDa2V5EhQKBXZhbHVlGAIgASgEUgV2YWx1ZToCOAEimQEKGFF1ZXJ5Tm9kZXNCeVZhbHVlUmVxdWVzdBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EhQKBXZhbHVlGAIgASgDUgV2YWx1ZRIWCgZvZmZzZXQYAyABKANSBm9mZnNldBIUCgVsaW1pdBgEIAEoA1IFbGltaXQiwQEKGVF1ZXJ5Tm9kZXNCeVZhbHVlUmVzcG9uc2USQQoFbm9kZXMYASADKAsyKy5zcGFyay5RdWVyeU5vZGVzQnlWYWx1ZVJlc3BvbnNlLk5vZGVzRW50cnlSBW5vZGVzEhYKBm9mZnNldBgCIAEoA1IGb2Zmc2V0GkkKCk5vZGVzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSJQoFdmFsdWUYAiABKAsyDy5zcGFyay5UcmVlTm9kZVIFdmFsdWU6AjgBIrYBChlHZXRVdHhvc0ZvckFkZHJlc3NSZXF1ZXN0EhgKB2FkZHJlc3MYASABKAlSB2FkZHJlc3MSFgoGb2Zmc2V0GAIgASgEUgZvZmZzZXQSFAoFbGltaXQYAyABKARSBWxpbWl0EigKB25ldHdvcmsYBCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEicKD2V4Y2x1ZGVfY2xhaW1lZBgFIAEoCFIOZXhjbHVkZUNsYWltZWQiVwoaR2V0VXR4b3NGb3JBZGRyZXNzUmVzcG9uc2USIQoFdXR4b3MYASADKAsyCy5zcGFyay5VVFhPUgV1dHhvcxIWCgZvZmZzZXQYAiABKARSBm9mZnNldCJjChlRdWVyeVNwYXJrSW52b2ljZXNSZXF1ZXN0EhQKBWxpbWl0GAEgASgDUgVsaW1pdBIWCgZvZmZzZXQYAiABKANSBm9mZnNldBIYCgdpbnZvaWNlGAMgAygJUgdpbnZvaWNlIncKGlF1ZXJ5U3BhcmtJbnZvaWNlc1Jlc3BvbnNlEhYKBm9mZnNldBgBIAEoA1IGb2Zmc2V0EkEKEGludm9pY2Vfc3RhdHVzZXMYAiADKAsyFi5zcGFyay5JbnZvaWNlUmVzcG9uc2VSD2ludm9pY2VTdGF0dXNlcyLlAQoPSW52b2ljZVJlc3BvbnNlEhgKB2ludm9pY2UYASABKAlSB2ludm9pY2USLAoGc3RhdHVzGAIgASgOMhQuc3BhcmsuSW52b2ljZVN0YXR1c1IGc3RhdHVzEjoKDXNhdHNfdHJhbnNmZXIYAyABKAsyEy5zcGFyay5TYXRzVHJhbnNmZXJIAFIMc2F0c1RyYW5zZmVyEj0KDnRva2VuX3RyYW5zZmVyGAQgASgLMhQuc3BhcmsuVG9rZW5UcmFuc2ZlckgAUg10b2tlblRyYW5zZmVyQg8KDXRyYW5zZmVyX3R5cGUiOAoMU2F0c1RyYW5zZmVyEigKC3RyYW5zZmVyX2lkGAEgASgMQgf6QgR6AmgQUgp0cmFuc2ZlcklkIlkKDVRva2VuVHJhbnNmZXISSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgBIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaCKtAQoiSW5pdGlhdGVTd2FwUHJpbWFyeVRyYW5zZmVyUmVxdWVzdBI3Cgh0cmFuc2ZlchgBIAEoCzIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ugh0cmFuc2ZlchJOChNhZGFwdG9yX3B1YmxpY19rZXlzGAIgASgLMh4uc3BhcmsuQWRhcHRvclB1YmxpY0tleVBhY2thZ2VSEWFkYXB0b3JQdWJsaWNLZXlzIp0BCiNJbml0aWF0ZVN3YXBQcmltYXJ5VHJhbnNmZXJSZXNwb25zZRIrCgh0cmFuc2ZlchgBIAEoCzIPLnNwYXJrLlRyYW5zZmVyUgh0cmFuc2ZlchJJCg9zaWduaW5nX3Jlc3VsdHMYAiADKAsyIC5zcGFyay5MZWFmUmVmdW5kVHhTaWduaW5nUmVzdWx0Ug5zaWduaW5nUmVzdWx0cyLPAQoXQWRhcHRvclB1YmxpY0tleVBhY2thZ2USLAoSYWRhcHRvcl9wdWJsaWNfa2V5GAEgASgMUhBhZGFwdG9yUHVibGljS2V5EjkKGWRpcmVjdF9hZGFwdG9yX3B1YmxpY19rZXkYAiABKAxSFmRpcmVjdEFkYXB0b3JQdWJsaWNLZXkSSwojZGlyZWN0X2Zyb21fY3BmcF9hZGFwdG9yX3B1YmxpY19rZXkYAyABKAxSHmRpcmVjdEZyb21DcGZwQWRhcHRvclB1YmxpY0tleSJ8Cg1XYWxsZXRTZXR0aW5nEkIKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxCB/pCBHoCaCFSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSJwoPcHJpdmF0ZV9lbmFibGVkGAIgASgIUg5wcml2YXRlRW5hYmxlZCJeChpVcGRhdGVXYWxsZXRTZXR0aW5nUmVxdWVzdBIsCg9wcml2YXRlX2VuYWJsZWQYASABKAhIAFIOcHJpdmF0ZUVuYWJsZWSIAQFCEgoQX3ByaXZhdGVfZW5hYmxlZCJaChtVcGRhdGVXYWxsZXRTZXR0aW5nUmVzcG9uc2USOwoOd2FsbGV0X3NldHRpbmcYASABKAsyFC5zcGFyay5XYWxsZXRTZXR0aW5nUg13YWxsZXRTZXR0aW5nIhsKGVF1ZXJ5V2FsbGV0U2V0dGluZ1JlcXVlc3QiWQoaUXVlcnlXYWxsZXRTZXR0aW5nUmVzcG9uc2USOwoOd2FsbGV0X3NldHRpbmcYASABKAsyFC5zcGFyay5XYWxsZXRTZXR0aW5nUg13YWxsZXRTZXR0aW5nKk0KB05ldHdvcmsSDwoLVU5TUEVDSUZJRUQQABILCgdNQUlOTkVUEAESCwoHUkVHVEVTVBACEgsKB1RFU1RORVQQAxIKCgZTSUdORVQQBCojCglEaXJlY3Rpb24SCAoETkVYVBAAEgwKCFBSRVZJT1VTEAEq/AMKDlRyYW5zZmVyU3RhdHVzEiQKIFRSQU5TRkVSX1NUQVRVU19TRU5ERVJfSU5JVElBVEVEEAASLAooVFJBTlNGRVJfU1RBVFVTX1NFTkRFUl9LRVlfVFdFQUtfUEVORElORxABEiYKIlRSQU5TRkVSX1NUQVRVU19TRU5ERVJfS0VZX1RXRUFLRUQQAhIoCiRUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfS0VZX1RXRUFLRUQQAxIqCiZUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfUkVGVU5EX1NJR05FRBAEEh0KGVRSQU5TRkVSX1NUQVRVU19DT01QTEVURUQQBRIbChdUUkFOU0ZFUl9TVEFUVVNfRVhQSVJFRBAGEhwKGFRSQU5TRkVSX1NUQVRVU19SRVRVUk5FRBAHEjAKLFRSQU5TRkVSX1NUQVRVU19TRU5ERVJfSU5JVElBVEVEX0NPT1JESU5BVE9SEAgSLQopVFJBTlNGRVJfU1RBVFVTX1JFQ0VJVkVSX0tFWV9UV0VBS19MT0NLRUQQCRIuCipUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfS0VZX1RXRUFLX0FQUExJRUQQChItCilUUkFOU0ZFUl9TVEFUVVNfQVBQTFlJTkdfU0VOREVSX0tFWV9UV0VBSxALKpoBCgxUcmFuc2ZlclR5cGUSEQoNUFJFSU1BR0VfU1dBUBAAEhQKEENPT1BFUkFUSVZFX0VYSVQQARIMCghUUkFOU0ZFUhACEg0KCVVUWE9fU1dBUBADEggKBFNXQVAQHhIQCgxDT1VOVEVSX1NXQVAQKBITCg9QUklNQVJZX1NXQVBfVjMQBBITCg9DT1VOVEVSX1NXQVBfVjMQBSomCgVPcmRlchIOCgpERVNDRU5ESU5HEAASDQoJQVNDRU5ESU5HEAEqnAEKFVByZWltYWdlUmVxdWVzdFN0YXR1cxIwCixQUkVJTUFHRV9SRVFVRVNUX1NUQVRVU19XQUlUSU5HX0ZPUl9QUkVJTUFHRRAAEisKJ1BSRUlNQUdFX1JFUVVFU1RfU1RBVFVTX1BSRUlNQUdFX1NIQVJFRBABEiQKIFBSRUlNQUdFX1JFUVVFU1RfU1RBVFVTX1JFVFVSTkVEEAIqWwoTUHJlaW1hZ2VSZXF1ZXN0Um9sZRIiCh5QUkVJTUFHRV9SRVFVRVNUX1JPTEVfUkVDRUlWRVIQABIgChxQUkVJTUFHRV9SRVFVRVNUX1JPTEVfU0VOREVSEAEqOAoTVXR4b1N3YXBSZXF1ZXN0VHlwZRIJCgVGaXhlZBAAEgoKBk1heEZlZRABEgoKBlJlZnVuZBACKk4KDUludm9pY2VTdGF0dXMSDQoJTk9UX0ZPVU5EEAASCwoHUEVORElORxABEg0KCUZJTkFMSVpFRBACEgwKCFJFVFVSTkVEEAQiBAgDEAMq4AIKDlRyZWVOb2RlU3RhdHVzEh0KGVRSRUVfTk9ERV9TVEFUVVNfQ1JFQVRJTkcQABIeChpUUkVFX05PREVfU1RBVFVTX0FWQUlMQUJMRRABEiUKIVRSRUVfTk9ERV9TVEFUVVNfRlJPWkVOX0JZX0lTU1VFUhACEiQKIFRSRUVfTk9ERV9TVEFUVVNfVFJBTlNGRVJfTE9DS0VEEAMSIQodVFJFRV9OT0RFX1NUQVRVU19TUExJVF9MT0NLRUQQBBIdChlUUkVFX05PREVfU1RBVFVTX1NQTElUVEVEEAUSHwobVFJFRV9OT0RFX1NUQVRVU19BR0dSRUdBVEVEEAYSHQoZVFJFRV9OT0RFX1NUQVRVU19PTl9DSEFJThAHEiMKH1RSRUVfTk9ERV9TVEFUVVNfQUdHUkVHQVRFX0xPQ0sQCBIbChdUUkVFX05PREVfU1RBVFVTX0VYSVRFRBAJMpMnCgxTcGFya1NlcnZpY2USaQoYZ2VuZXJhdGVfZGVwb3NpdF9hZGRyZXNzEiQuc3BhcmsuR2VuZXJhdGVEZXBvc2l0QWRkcmVzc1JlcXVlc3QaJS5zcGFyay5HZW5lcmF0ZURlcG9zaXRBZGRyZXNzUmVzcG9uc2UiABJ8Ch9nZW5lcmF0ZV9zdGF0aWNfZGVwb3NpdF9hZGRyZXNzEiouc3BhcmsuR2VuZXJhdGVTdGF0aWNEZXBvc2l0QWRkcmVzc1JlcXVlc3QaKy5zcGFyay5HZW5lcmF0ZVN0YXRpY0RlcG9zaXRBZGRyZXNzUmVzcG9uc2UiABJwChtzdGFydF9kZXBvc2l0X3RyZWVfY3JlYXRpb24SJi5zcGFyay5TdGFydERlcG9zaXRUcmVlQ3JlYXRpb25SZXF1ZXN0Gicuc3BhcmsuU3RhcnREZXBvc2l0VHJlZUNyZWF0aW9uUmVzcG9uc2UiABJdChNzdGFydF90cmVlX2NyZWF0aW9uEh8uc3BhcmsuU3RhcnRUcmVlQ3JlYXRpb25SZXF1ZXN0GiAuc3BhcmsuU3RhcnRUcmVlQ3JlYXRpb25SZXNwb25zZSIDiAIBEmwKGGZpbmFsaXplX25vZGVfc2lnbmF0dXJlcxIkLnNwYXJrLkZpbmFsaXplTm9kZVNpZ25hdHVyZXNSZXF1ZXN0GiUuc3BhcmsuRmluYWxpemVOb2RlU2lnbmF0dXJlc1Jlc3BvbnNlIgOIAgESUAoOc3RhcnRfdHJhbnNmZXISGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdBocLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXNwb25zZSIDiAIBElkKEWZpbmFsaXplX3RyYW5zZmVyEh4uc3BhcmsuRmluYWxpemVUcmFuc2ZlclJlcXVlc3QaHy5zcGFyay5GaW5hbGl6ZVRyYW5zZmVyUmVzcG9uc2UiA4gCARJ/CidmaW5hbGl6ZV90cmFuc2Zlcl93aXRoX3RyYW5zZmVyX3BhY2thZ2USMS5zcGFyay5GaW5hbGl6ZVRyYW5zZmVyV2l0aFRyYW5zZmVyUGFja2FnZVJlcXVlc3QaHy5zcGFyay5GaW5hbGl6ZVRyYW5zZmVyUmVzcG9uc2UiABJTCg9jYW5jZWxfdHJhbnNmZXISHC5zcGFyay5DYW5jZWxUcmFuc2ZlclJlcXVlc3QaHS5zcGFyay5DYW5jZWxUcmFuc2ZlclJlc3BvbnNlIgOIAgESUQoXcXVlcnlfcGVuZGluZ190cmFuc2ZlcnMSFS5zcGFyay5UcmFuc2ZlckZpbHRlchodLnNwYXJrLlF1ZXJ5VHJhbnNmZXJzUmVzcG9uc2UiABJNChNxdWVyeV9hbGxfdHJhbnNmZXJzEhUuc3BhcmsuVHJhbnNmZXJGaWx0ZXIaHS5zcGFyay5RdWVyeVRyYW5zZmVyc1Jlc3BvbnNlIgASWwoZY2xhaW1fdHJhbnNmZXJfdHdlYWtfa2V5cxIkLnNwYXJrLkNsYWltVHJhbnNmZXJUd2Vha0tleXNSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IgAScwobY2xhaW1fdHJhbnNmZXJfc2lnbl9yZWZ1bmRzEiYuc3BhcmsuQ2xhaW1UcmFuc2ZlclNpZ25SZWZ1bmRzUmVxdWVzdBonLnNwYXJrLkNsYWltVHJhbnNmZXJTaWduUmVmdW5kc1Jlc3BvbnNlIgOIAgESUgoUc3RvcmVfcHJlaW1hZ2Vfc2hhcmUSIC5zcGFyay5TdG9yZVByZWltYWdlU2hhcmVSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IgASZgoXZ2V0X3NpZ25pbmdfY29tbWl0bWVudHMSIy5zcGFyay5HZXRTaWduaW5nQ29tbWl0bWVudHNSZXF1ZXN0GiQuc3BhcmsuR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVzcG9uc2UiABJWChBjb29wZXJhdGl2ZV9leGl0Eh0uc3BhcmsuQ29vcGVyYXRpdmVFeGl0UmVxdWVzdBoeLnNwYXJrLkNvb3BlcmF0aXZlRXhpdFJlc3BvbnNlIgOIAgESZgoWaW5pdGlhdGVfcHJlaW1hZ2Vfc3dhcBIiLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVxdWVzdBojLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVzcG9uc2UiA4gCARJTChBwcm92aWRlX3ByZWltYWdlEh0uc3BhcmsuUHJvdmlkZVByZWltYWdlUmVxdWVzdBoeLnNwYXJrLlByb3ZpZGVQcmVpbWFnZVJlc3BvbnNlIgASQQoKcXVlcnlfaHRsYxIXLnNwYXJrLlF1ZXJ5SHRsY1JlcXVlc3QaGC5zcGFyay5RdWVyeUh0bGNSZXNwb25zZSIAEk4KD3N0YXJ0X2xlYWZfc3dhcBIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ghwuc3BhcmsuU3RhcnRUcmFuc2ZlclJlc3BvbnNlIgASTwoJbGVhZl9zd2FwEh0uc3BhcmsuQ291bnRlckxlYWZTd2FwUmVxdWVzdBoeLnNwYXJrLkNvdW50ZXJMZWFmU3dhcFJlc3BvbnNlIgOIAgESVwoRY291bnRlcl9sZWFmX3N3YXASHS5zcGFyay5Db3VudGVyTGVhZlN3YXBSZXF1ZXN0Gh4uc3BhcmsuQ291bnRlckxlYWZTd2FwUmVzcG9uc2UiA4gCARJWChByZWZyZXNoX3RpbWVsb2NrEh0uc3BhcmsuUmVmcmVzaFRpbWVsb2NrUmVxdWVzdBoeLnNwYXJrLlJlZnJlc2hUaW1lbG9ja1Jlc3BvbnNlIgOIAgESRwoLZXh0ZW5kX2xlYWYSGC5zcGFyay5FeHRlbmRMZWFmUmVxdWVzdBoZLnNwYXJrLkV4dGVuZExlYWZSZXNwb25zZSIDiAIBEkEKCnJlbmV3X2xlYWYSFy5zcGFyay5SZW5ld0xlYWZSZXF1ZXN0Ghguc3BhcmsuUmVuZXdMZWFmUmVzcG9uc2UiABJcChlnZXRfc2lnbmluZ19vcGVyYXRvcl9saXN0EhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5GiUuc3BhcmsuR2V0U2lnbmluZ09wZXJhdG9yTGlzdFJlc3BvbnNlIgASRAoLcXVlcnlfbm9kZXMSGC5zcGFyay5RdWVyeU5vZGVzUmVxdWVzdBoZLnNwYXJrLlF1ZXJ5Tm9kZXNSZXNwb25zZSIAEmwKGHF1ZXJ5X25vZGVzX2Rpc3RyaWJ1dGlvbhIkLnNwYXJrLlF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXF1ZXN0GiUuc3BhcmsuUXVlcnlOb2Rlc0Rpc3RyaWJ1dGlvblJlc3BvbnNlIgOIAgESXgoUcXVlcnlfbm9kZXNfYnlfdmFsdWUSHy5zcGFyay5RdWVyeU5vZGVzQnlWYWx1ZVJlcXVlc3QaIC5zcGFyay5RdWVyeU5vZGVzQnlWYWx1ZVJlc3BvbnNlIgOIAgESSgoNcXVlcnlfYmFsYW5jZRIaLnNwYXJrLlF1ZXJ5QmFsYW5jZVJlcXVlc3QaGy5zcGFyay5RdWVyeUJhbGFuY2VSZXNwb25zZSIAEmoKGXF1ZXJ5X3VzZXJfc2lnbmVkX3JlZnVuZHMSJC5zcGFyay5RdWVyeVVzZXJTaWduZWRSZWZ1bmRzUmVxdWVzdBolLnNwYXJrLlF1ZXJ5VXNlclNpZ25lZFJlZnVuZHNSZXNwb25zZSIAEnkKHnF1ZXJ5X3VudXNlZF9kZXBvc2l0X2FkZHJlc3NlcxIpLnNwYXJrLlF1ZXJ5VW51c2VkRGVwb3NpdEFkZHJlc3Nlc1JlcXVlc3QaKi5zcGFyay5RdWVyeVVudXNlZERlcG9zaXRBZGRyZXNzZXNSZXNwb25zZSIAEnkKHnF1ZXJ5X3N0YXRpY19kZXBvc2l0X2FkZHJlc3NlcxIpLnNwYXJrLlF1ZXJ5U3RhdGljRGVwb3NpdEFkZHJlc3Nlc1JlcXVlc3QaKi5zcGFyay5RdWVyeVN0YXRpY0RlcG9zaXRBZGRyZXNzZXNSZXNwb25zZSIAElwKE3N1YnNjcmliZV90b19ldmVudHMSHy5zcGFyay5TdWJzY3JpYmVUb0V2ZW50c1JlcXVlc3QaIC5zcGFyay5TdWJzY3JpYmVUb0V2ZW50c1Jlc3BvbnNlIgAwARKGAQojaW5pdGlhdGVfc3RhdGljX2RlcG9zaXRfdXR4b19yZWZ1bmQSLS5zcGFyay5Jbml0aWF0ZVN0YXRpY0RlcG9zaXRVdHhvUmVmdW5kUmVxdWVzdBouLnNwYXJrLkluaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXNwb25zZSIAEloKEmluaXRpYXRlX3V0eG9fc3dhcBIeLnNwYXJrLkluaXRpYXRlVXR4b1N3YXBSZXF1ZXN0Gh8uc3BhcmsuSW5pdGlhdGVVdHhvU3dhcFJlc3BvbnNlIgOIAgESYQoWZXhpdF9zaW5nbGVfbm9kZV90cmVlcxIhLnNwYXJrLkV4aXRTaW5nbGVOb2RlVHJlZXNSZXF1ZXN0GiIuc3BhcmsuRXhpdFNpbmdsZU5vZGVUcmVlc1Jlc3BvbnNlIgASVgoTY29vcGVyYXRpdmVfZXhpdF92MhIdLnNwYXJrLkNvb3BlcmF0aXZlRXhpdFJlcXVlc3QaHi5zcGFyay5Db29wZXJhdGl2ZUV4aXRSZXNwb25zZSIAEkoKDmV4dGVuZF9sZWFmX3YyEhguc3BhcmsuRXh0ZW5kTGVhZlJlcXVlc3QaGS5zcGFyay5FeHRlbmRMZWFmUmVzcG9uc2UiA4gCARJzCh5jbGFpbV90cmFuc2Zlcl9zaWduX3JlZnVuZHNfdjISJi5zcGFyay5DbGFpbVRyYW5zZmVyU2lnblJlZnVuZHNSZXF1ZXN0Gicuc3BhcmsuQ2xhaW1UcmFuc2ZlclNpZ25SZWZ1bmRzUmVzcG9uc2UiABJsChtmaW5hbGl6ZV9ub2RlX3NpZ25hdHVyZXNfdjISJC5zcGFyay5GaW5hbGl6ZU5vZGVTaWduYXR1cmVzUmVxdWVzdBolLnNwYXJrLkZpbmFsaXplTm9kZVNpZ25hdHVyZXNSZXNwb25zZSIAEmYKGWluaXRpYXRlX3ByZWltYWdlX3N3YXBfdjISIi5zcGFyay5Jbml0aWF0ZVByZWltYWdlU3dhcFJlcXVlc3QaIy5zcGFyay5Jbml0aWF0ZVByZWltYWdlU3dhcFJlc3BvbnNlIgASZgoZaW5pdGlhdGVfcHJlaW1hZ2Vfc3dhcF92MxIiLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVxdWVzdBojLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVzcG9uc2UiABJRChJzdGFydF9sZWFmX3N3YXBfdjISGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdBocLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXNwb25zZSIAEloKFGNvdW50ZXJfbGVhZl9zd2FwX3YyEh0uc3BhcmsuQ291bnRlckxlYWZTd2FwUmVxdWVzdBoeLnNwYXJrLkNvdW50ZXJMZWFmU3dhcFJlc3BvbnNlIgOIAgESUAoRc3RhcnRfdHJhbnNmZXJfdjISGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdBocLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXNwb25zZSIAElkKE3JlZnJlc2hfdGltZWxvY2tfdjISHS5zcGFyay5SZWZyZXNoVGltZWxvY2tSZXF1ZXN0Gh4uc3BhcmsuUmVmcmVzaFRpbWVsb2NrUmVzcG9uc2UiA4gCARJeChVnZXRfdXR4b3NfZm9yX2FkZHJlc3MSIC5zcGFyay5HZXRVdHhvc0ZvckFkZHJlc3NSZXF1ZXN0GiEuc3BhcmsuR2V0VXR4b3NGb3JBZGRyZXNzUmVzcG9uc2UiABJdChRxdWVyeV9zcGFya19pbnZvaWNlcxIgLnNwYXJrLlF1ZXJ5U3BhcmtJbnZvaWNlc1JlcXVlc3QaIS5zcGFyay5RdWVyeVNwYXJrSW52b2ljZXNSZXNwb25zZSIAEnkKHmluaXRpYXRlX3N3YXBfcHJpbWFyeV90cmFuc2ZlchIpLnNwYXJrLkluaXRpYXRlU3dhcFByaW1hcnlUcmFuc2ZlclJlcXVlc3QaKi5zcGFyay5Jbml0aWF0ZVN3YXBQcmltYXJ5VHJhbnNmZXJSZXNwb25zZSIAEmAKFXVwZGF0ZV93YWxsZXRfc2V0dGluZxIhLnNwYXJrLlVwZGF0ZVdhbGxldFNldHRpbmdSZXF1ZXN0GiIuc3BhcmsuVXBkYXRlV2FsbGV0U2V0dGluZ1Jlc3BvbnNlIgASXQoUcXVlcnlfd2FsbGV0X3NldHRpbmcSIC5zcGFyay5RdWVyeVdhbGxldFNldHRpbmdSZXF1ZXN0GiEuc3BhcmsuUXVlcnlXYWxsZXRTZXR0aW5nUmVzcG9uc2UiAEIsWipnaXRodWIuY29tL2xpZ2h0c3BhcmtkZXYvc3BhcmsvcHJvdG8vc3BhcmtiBnByb3RvMwqIVQoRc3BhcmtfdG9rZW4ucHJvdG8SC3NwYXJrX3Rva2VuGh9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvGgtzcGFyay5wcm90bxoXdmFsaWRhdGUvdmFsaWRhdGUucHJvdG8imwEKElRva2VuT3V0cHV0VG9TcGVuZBJGChtwcmV2X3Rva2VuX3RyYW5zYWN0aW9uX2hhc2gYASABKAxCB/pCBHoCaCBSGHByZXZUb2tlblRyYW5zYWN0aW9uSGFzaBI9ChtwcmV2X3Rva2VuX3RyYW5zYWN0aW9uX3ZvdXQYAiABKA1SGHByZXZUb2tlblRyYW5zYWN0aW9uVm91dCJfChJUb2tlblRyYW5zZmVySW5wdXQSSQoQb3V0cHV0c190b19zcGVuZBgBIAMoCzIfLnNwYXJrX3Rva2VuLlRva2VuT3V0cHV0VG9TcGVuZFIOb3V0cHV0c1RvU3BlbmQikwEKDlRva2VuTWludElucHV0EjMKEWlzc3Vlcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg9pc3N1ZXJQdWJsaWNLZXkSNwoQdG9rZW5faWRlbnRpZmllchgCIAEoDEIH+kIEegJoIEgAUg90b2tlbklkZW50aWZpZXKIAQFCEwoRX3Rva2VuX2lkZW50aWZpZXIi9gIKEFRva2VuQ3JlYXRlSW5wdXQSMwoRaXNzdWVyX3B1YmxpY19rZXkYASABKAxCB/pCBHoCaCFSD2lzc3VlclB1YmxpY0tleRImCgp0b2tlbl9uYW1lGAIgASgJQgf6QgRyAhgUUgl0b2tlbk5hbWUSKgoMdG9rZW5fdGlja2VyGAMgASgJQgf6QgRyAhgGUgt0b2tlblRpY2tlchIkCghkZWNpbWFscxgEIAEoDUII+kIFKgMY/wFSCGRlY2ltYWxzEiYKCm1heF9zdXBwbHkYBSABKAxCB/pCBHoCaBBSCW1heFN1cHBseRIhCgxpc19mcmVlemFibGUYBiABKAhSC2lzRnJlZXphYmxlEkkKGmNyZWF0aW9uX2VudGl0eV9wdWJsaWNfa2V5GAcgASgMQgf6QgR6AmghSABSF2NyZWF0aW9uRW50aXR5UHVibGljS2V5iAEBQh0KG19jcmVhdGlvbl9lbnRpdHlfcHVibGljX2tleSLHBAoLVG9rZW5PdXRwdXQSHQoCaWQYASABKAlCCPpCBXIDsAEBSABSAmlkiAEBEjEKEG93bmVyX3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSDm93bmVyUHVibGljS2V5EkEKFXJldm9jYXRpb25fY29tbWl0bWVudBgDIAEoDEIH+kIEegJoIUgBUhRyZXZvY2F0aW9uQ29tbWl0bWVudIgBARIxChJ3aXRoZHJhd19ib25kX3NhdHMYBCABKARIAlIQd2l0aGRyYXdCb25kU2F0c4gBARJMCiB3aXRoZHJhd19yZWxhdGl2ZV9ibG9ja19sb2NrdGltZRgFIAEoBEgDUh13aXRoZHJhd1JlbGF0aXZlQmxvY2tMb2NrdGltZYgBARI2ChB0b2tlbl9wdWJsaWNfa2V5GAYgASgMQgf6QgR6AmghSARSDnRva2VuUHVibGljS2V5iAEBEjcKEHRva2VuX2lkZW50aWZpZXIYCCABKAxCB/pCBHoCaCBIBVIPdG9rZW5JZGVudGlmaWVyiAEBEioKDHRva2VuX2Ftb3VudBgHIAEoDEIH+kIEegJoEFILdG9rZW5BbW91bnRCBQoDX2lkQhgKFl9yZXZvY2F0aW9uX2NvbW1pdG1lbnRCFQoTX3dpdGhkcmF3X2JvbmRfc2F0c0IjCiFfd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWVCEwoRX3Rva2VuX3B1YmxpY19rZXlCEwoRX3Rva2VuX2lkZW50aWZpZXIingIKElBhcnRpYWxUb2tlbk91dHB1dBIxChBvd25lcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRIsChJ3aXRoZHJhd19ib25kX3NhdHMYAiABKARSEHdpdGhkcmF3Qm9uZFNhdHMSRwogd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWUYAyABKARSHXdpdGhkcmF3UmVsYXRpdmVCbG9ja0xvY2t0aW1lEjIKEHRva2VuX2lkZW50aWZpZXIYBCABKAxCB/pCBHoCaCBSD3Rva2VuSWRlbnRpZmllchIqCgx0b2tlbl9hbW91bnQYBSABKAxCB/pCBHoCaBBSC3Rva2VuQW1vdW50IqMBChBGaW5hbFRva2VuT3V0cHV0ElEKFHBhcnRpYWxfdG9rZW5fb3V0cHV0GAEgASgLMh8uc3BhcmtfdG9rZW4uUGFydGlhbFRva2VuT3V0cHV0UhJwYXJ0aWFsVG9rZW5PdXRwdXQSPAoVcmV2b2NhdGlvbl9jb21taXRtZW50GAIgASgMQgf6QgR6AmghUhRyZXZvY2F0aW9uQ29tbWl0bWVudCKaBgoQVG9rZW5UcmFuc2FjdGlvbhIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEjwKCm1pbnRfaW5wdXQYAiABKAsyGy5zcGFya190b2tlbi5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSSAoOdHJhbnNmZXJfaW5wdXQYAyABKAsyHy5zcGFya190b2tlbi5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBJCCgxjcmVhdGVfaW5wdXQYCCABKAsyHS5zcGFya190b2tlbi5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0Ej0KDXRva2VuX291dHB1dHMYBCADKAsyGC5zcGFya190b2tlbi5Ub2tlbk91dHB1dFIMdG9rZW5PdXRwdXRzEloKI3NwYXJrX29wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXlzGAUgAygMQgz6QgmSAQYiBHoCaCFSH3NwYXJrT3BlcmF0b3JJZGVudGl0eVB1YmxpY0tleXMSOwoLZXhwaXJ5X3RpbWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgpleHBpcnlUaW1lEjIKB25ldHdvcmsYByABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yaxJUChhjbGllbnRfY3JlYXRlZF90aW1lc3RhbXAYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUhZjbGllbnRDcmVhdGVkVGltZXN0YW1wEk8KE2ludm9pY2VfYXR0YWNobWVudHMYCiADKAsyHi5zcGFya190b2tlbi5JbnZvaWNlQXR0YWNobWVudFISaW52b2ljZUF0dGFjaG1lbnRzEj8KGXZhbGlkaXR5X2R1cmF0aW9uX3NlY29uZHMYCyABKARIAVIXdmFsaWRpdHlEdXJhdGlvblNlY29uZHOIAQFCDgoMdG9rZW5faW5wdXRzQhwKGl92YWxpZGl0eV9kdXJhdGlvbl9zZWNvbmRzIpkDChhUb2tlblRyYW5zYWN0aW9uTWV0YWRhdGESWgojc3Bhcmtfb3BlcmF0b3JfaWRlbnRpdHlfcHVibGljX2tleXMYAiADKAxCDPpCCZIBBiIEegJoIVIfc3BhcmtPcGVyYXRvcklkZW50aXR5UHVibGljS2V5cxIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsSVAoYY2xpZW50X2NyZWF0ZWRfdGltZXN0YW1wGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIWY2xpZW50Q3JlYXRlZFRpbWVzdGFtcBJGChl2YWxpZGl0eV9kdXJhdGlvbl9zZWNvbmRzGAUgASgEQgr6QgcyBRisAigBUhd2YWxpZGl0eUR1cmF0aW9uU2Vjb25kcxJPChNpbnZvaWNlX2F0dGFjaG1lbnRzGAYgAygLMh4uc3BhcmtfdG9rZW4uSW52b2ljZUF0dGFjaG1lbnRSEmludm9pY2VBdHRhY2htZW50cyLJAwoXUGFydGlhbFRva2VuVHJhbnNhY3Rpb24SGAoHdmVyc2lvbhgBIAEoDVIHdmVyc2lvbhJjChp0b2tlbl90cmFuc2FjdGlvbl9tZXRhZGF0YRgCIAEoCzIlLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25NZXRhZGF0YVIYdG9rZW5UcmFuc2FjdGlvbk1ldGFkYXRhEjwKCm1pbnRfaW5wdXQYAyABKAsyGy5zcGFya190b2tlbi5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSSAoOdHJhbnNmZXJfaW5wdXQYBCABKAsyHy5zcGFya190b2tlbi5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBJCCgxjcmVhdGVfaW5wdXQYBSABKAsyHS5zcGFya190b2tlbi5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0ElMKFXBhcnRpYWxfdG9rZW5fb3V0cHV0cxgGIAMoCzIfLnNwYXJrX3Rva2VuLlBhcnRpYWxUb2tlbk91dHB1dFITcGFydGlhbFRva2VuT3V0cHV0c0IOCgx0b2tlbl9pbnB1dHMiwQMKFUZpbmFsVG9rZW5UcmFuc2FjdGlvbhIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEmMKGnRva2VuX3RyYW5zYWN0aW9uX21ldGFkYXRhGAIgASgLMiUuc3BhcmtfdG9rZW4uVG9rZW5UcmFuc2FjdGlvbk1ldGFkYXRhUhh0b2tlblRyYW5zYWN0aW9uTWV0YWRhdGESPAoKbWludF9pbnB1dBgDIAEoCzIbLnNwYXJrX3Rva2VuLlRva2VuTWludElucHV0SABSCW1pbnRJbnB1dBJICg50cmFuc2Zlcl9pbnB1dBgEIAEoCzIfLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNmZXJJbnB1dEgAUg10cmFuc2ZlcklucHV0EkIKDGNyZWF0ZV9pbnB1dBgFIAEoCzIdLnNwYXJrX3Rva2VuLlRva2VuQ3JlYXRlSW5wdXRIAFILY3JlYXRlSW5wdXQSTQoTZmluYWxfdG9rZW5fb3V0cHV0cxgGIAMoCzIdLnNwYXJrX3Rva2VuLkZpbmFsVG9rZW5PdXRwdXRSEWZpbmFsVG9rZW5PdXRwdXRzQg4KDHRva2VuX2lucHV0cyI4ChFJbnZvaWNlQXR0YWNobWVudBIjCg1zcGFya19pbnZvaWNlGAEgASgJUgxzcGFya0ludm9pY2UiXgoSU2lnbmF0dXJlV2l0aEluZGV4EicKCXNpZ25hdHVyZRgBIAEoDEIJ+kIGegQQQBhJUglzaWduYXR1cmUSHwoLaW5wdXRfaW5kZXgYAiABKA1SCmlucHV0SW5kZXgitAEKHklucHV0VHR4b1NpZ25hdHVyZXNQZXJPcGVyYXRvchJICg90dHhvX3NpZ25hdHVyZXMYASADKAsyHy5zcGFya190b2tlbi5TaWduYXR1cmVXaXRoSW5kZXhSDnR0eG9TaWduYXR1cmVzEkgKHG9wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSGW9wZXJhdG9ySWRlbnRpdHlQdWJsaWNLZXki8gIKF1N0YXJ0VHJhbnNhY3Rpb25SZXF1ZXN0EjcKE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxCB/pCBHoCaCFSEWlkZW50aXR5UHVibGljS2V5ElkKGXBhcnRpYWxfdG9rZW5fdHJhbnNhY3Rpb24YAiABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhdwYXJ0aWFsVG9rZW5UcmFuc2FjdGlvbhJ7CipwYXJ0aWFsX3Rva2VuX3RyYW5zYWN0aW9uX293bmVyX3NpZ25hdHVyZXMYAyADKAsyHy5zcGFya190b2tlbi5TaWduYXR1cmVXaXRoSW5kZXhSJnBhcnRpYWxUb2tlblRyYW5zYWN0aW9uT3duZXJTaWduYXR1cmVzEkYKGXZhbGlkaXR5X2R1cmF0aW9uX3NlY29uZHMYBCABKARCCvpCBzIFGKwCKAFSF3ZhbGlkaXR5RHVyYXRpb25TZWNvbmRzIq4BChhTdGFydFRyYW5zYWN0aW9uUmVzcG9uc2USVQoXZmluYWxfdG9rZW5fdHJhbnNhY3Rpb24YASABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SOwoNa2V5c2hhcmVfaW5mbxgCIAEoCzIWLnNwYXJrLlNpZ25pbmdLZXlzaGFyZVIMa2V5c2hhcmVJbmZvIvgCChhDb21taXRUcmFuc2FjdGlvblJlcXVlc3QSVQoXZmluYWxfdG9rZW5fdHJhbnNhY3Rpb24YASABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgCIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaBJ3CiJpbnB1dF90dHhvX3NpZ25hdHVyZXNfcGVyX29wZXJhdG9yGAMgAygLMisuc3BhcmtfdG9rZW4uSW5wdXRUdHhvU2lnbmF0dXJlc1Blck9wZXJhdG9yUh5pbnB1dFR0eG9TaWduYXR1cmVzUGVyT3BlcmF0b3ISQgoZb3duZXJfaWRlbnRpdHlfcHVibGljX2tleRgEIAEoDEIH+kIEegJoIVIWb3duZXJJZGVudGl0eVB1YmxpY0tleSK6AQoOQ29tbWl0UHJvZ3Jlc3MSUQoeY29tbWl0dGVkX29wZXJhdG9yX3B1YmxpY19rZXlzGAEgAygMQgz6QgmSAQYiBHoCaCFSG2NvbW1pdHRlZE9wZXJhdG9yUHVibGljS2V5cxJVCiB1bmNvbW1pdHRlZF9vcGVyYXRvcl9wdWJsaWNfa2V5cxgCIAMoDEIM+kIJkgEGIgR6AmghUh11bmNvbW1pdHRlZE9wZXJhdG9yUHVibGljS2V5cyKhAQoZQ29tbWl0VHJhbnNhY3Rpb25SZXNwb25zZRI+Cg1jb21taXRfc3RhdHVzGAEgASgOMhkuc3BhcmtfdG9rZW4uQ29tbWl0U3RhdHVzUgxjb21taXRTdGF0dXMSRAoPY29tbWl0X3Byb2dyZXNzGAIgASgLMhsuc3BhcmtfdG9rZW4uQ29tbWl0UHJvZ3Jlc3NSDmNvbW1pdFByb2dyZXNzIqYCChtCcm9hZGNhc3RUcmFuc2FjdGlvblJlcXVlc3QSNwoTaWRlbnRpdHlfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIRaWRlbnRpdHlQdWJsaWNLZXkSYAoZcGFydGlhbF90b2tlbl90cmFuc2FjdGlvbhgCIAEoCzIkLnNwYXJrX3Rva2VuLlBhcnRpYWxUb2tlblRyYW5zYWN0aW9uUhdwYXJ0aWFsVG9rZW5UcmFuc2FjdGlvbhJsCiJ0b2tlbl90cmFuc2FjdGlvbl9vd25lcl9zaWduYXR1cmVzGAMgAygLMh8uc3BhcmtfdG9rZW4uU2lnbmF0dXJlV2l0aEluZGV4Uh90b2tlblRyYW5zYWN0aW9uT3duZXJTaWduYXR1cmVzIoACChxCcm9hZGNhc3RUcmFuc2FjdGlvblJlc3BvbnNlEloKF2ZpbmFsX3Rva2VuX3RyYW5zYWN0aW9uGAEgASgLMiIuc3BhcmtfdG9rZW4uRmluYWxUb2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SPgoNY29tbWl0X3N0YXR1cxgCIAEoDjIZLnNwYXJrX3Rva2VuLkNvbW1pdFN0YXR1c1IMY29tbWl0U3RhdHVzEkQKD2NvbW1pdF9wcm9ncmVzcxgDIAEoCzIbLnNwYXJrX3Rva2VuLkNvbW1pdFByb2dyZXNzUg5jb21taXRQcm9ncmVzcyKSAQoZUXVlcnlUb2tlbk1ldGFkYXRhUmVxdWVzdBI5ChF0b2tlbl9pZGVudGlmaWVycxgBIAMoDEIM+kIJkgEGIgR6AmggUhB0b2tlbklkZW50aWZpZXJzEjoKEmlzc3Vlcl9wdWJsaWNfa2V5cxgCIAMoDEIM+kIJkgEGIgR6AmghUhBpc3N1ZXJQdWJsaWNLZXlzIqcDCg1Ub2tlbk1ldGFkYXRhEjMKEWlzc3Vlcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg9pc3N1ZXJQdWJsaWNLZXkSJgoKdG9rZW5fbmFtZRgCIAEoCUIH+kIEcgIYFFIJdG9rZW5OYW1lEioKDHRva2VuX3RpY2tlchgDIAEoCUIH+kIEcgIYBlILdG9rZW5UaWNrZXISJAoIZGVjaW1hbHMYBCABKA1CCPpCBSoDGP8BUghkZWNpbWFscxImCgptYXhfc3VwcGx5GAUgASgMQgf6QgR6AmgQUgltYXhTdXBwbHkSIQoMaXNfZnJlZXphYmxlGAYgASgIUgtpc0ZyZWV6YWJsZRJJChpjcmVhdGlvbl9lbnRpdHlfcHVibGljX2tleRgHIAEoDEIH+kIEegJoIUgAUhdjcmVhdGlvbkVudGl0eVB1YmxpY0tleYgBARIyChB0b2tlbl9pZGVudGlmaWVyGAggASgMQgf6QgR6AmggUg90b2tlbklkZW50aWZpZXJCHQobX2NyZWF0aW9uX2VudGl0eV9wdWJsaWNfa2V5Il8KGlF1ZXJ5VG9rZW5NZXRhZGF0YVJlc3BvbnNlEkEKDnRva2VuX21ldGFkYXRhGAEgAygLMhouc3BhcmtfdG9rZW4uVG9rZW5NZXRhZGF0YVINdG9rZW5NZXRhZGF0YSKsAgoYUXVlcnlUb2tlbk91dHB1dHNSZXF1ZXN0EjgKEW93bmVyX3B1YmxpY19rZXlzGAEgAygMQgz6QgmSAQYiBHoCaCFSD293bmVyUHVibGljS2V5cxI6ChJpc3N1ZXJfcHVibGljX2tleXMYAiADKAxCDPpCCZIBBiIEegJoIVIQaXNzdWVyUHVibGljS2V5cxI5ChF0b2tlbl9pZGVudGlmaWVycxgEIAMoDEIM+kIJkgEGIgR6AmggUhB0b2tlbklkZW50aWZpZXJzEigKB25ldHdvcmsYAyABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEjUKDHBhZ2VfcmVxdWVzdBgFIAEoCzISLnNwYXJrLlBhZ2VSZXF1ZXN0UgtwYWdlUmVxdWVzdCKtAwodUXVlcnlUb2tlblRyYW5zYWN0aW9uc1JlcXVlc3QSLAoKb3V0cHV0X2lkcxgBIAMoCUIN+kIKkgEHIgVyA7ABAVIJb3V0cHV0SWRzEjgKEW93bmVyX3B1YmxpY19rZXlzGAIgAygMQgz6QgmSAQYiBHoCaCFSD293bmVyUHVibGljS2V5cxI6ChJpc3N1ZXJfcHVibGljX2tleXMYAyADKAxCDPpCCZIBBiIEegJoIVIQaXNzdWVyUHVibGljS2V5cxI5ChF0b2tlbl9pZGVudGlmaWVycxgHIAMoDEIM+kIJkgEGIgR6AmggUhB0b2tlbklkZW50aWZpZXJzEkYKGHRva2VuX3RyYW5zYWN0aW9uX2hhc2hlcxgEIAMoDEIM+kIJkgEGIgR6AmggUhZ0b2tlblRyYW5zYWN0aW9uSGFzaGVzEiIKBW9yZGVyGAggASgOMgwuc3BhcmsuT3JkZXJSBW9yZGVyEiAKBWxpbWl0GAUgASgDQgr6QgciBRjoBygAUgVsaW1pdBIfCgZvZmZzZXQYBiABKANCB/pCBCICKABSBm9mZnNldCKmAQoeUXVlcnlUb2tlblRyYW5zYWN0aW9uc1Jlc3BvbnNlEmwKHnRva2VuX3RyYW5zYWN0aW9uc193aXRoX3N0YXR1cxgBIAMoCzInLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25XaXRoU3RhdHVzUht0b2tlblRyYW5zYWN0aW9uc1dpdGhTdGF0dXMSFgoGb2Zmc2V0GAIgASgDUgZvZmZzZXQi1gEKIU91dHB1dFdpdGhQcmV2aW91c1RyYW5zYWN0aW9uRGF0YRIwCgZvdXRwdXQYASABKAsyGC5zcGFya190b2tlbi5Ub2tlbk91dHB1dFIGb3V0cHV0EkMKGXByZXZpb3VzX3RyYW5zYWN0aW9uX2hhc2gYAiABKAxCB/pCBHoCaCBSF3ByZXZpb3VzVHJhbnNhY3Rpb25IYXNoEjoKGXByZXZpb3VzX3RyYW5zYWN0aW9uX3ZvdXQYAyABKA1SF3ByZXZpb3VzVHJhbnNhY3Rpb25Wb3V0ItoBChlRdWVyeVRva2VuT3V0cHV0c1Jlc3BvbnNlEoIBCiZvdXRwdXRzX3dpdGhfcHJldmlvdXNfdHJhbnNhY3Rpb25fZGF0YRgBIAMoCzIuLnNwYXJrX3Rva2VuLk91dHB1dFdpdGhQcmV2aW91c1RyYW5zYWN0aW9uRGF0YVIib3V0cHV0c1dpdGhQcmV2aW91c1RyYW5zYWN0aW9uRGF0YRI4Cg1wYWdlX3Jlc3BvbnNlGAIgASgLMhMuc3BhcmsuUGFnZVJlc3BvbnNlUgxwYWdlUmVzcG9uc2UiZAoYU3BlbnRUb2tlbk91dHB1dE1ldGFkYXRhEhsKCW91dHB1dF9pZBgBIAEoCVIIb3V0cHV0SWQSKwoRcmV2b2NhdGlvbl9zZWNyZXQYAiABKAxSEHJldm9jYXRpb25TZWNyZXQijgEKJFRva2VuVHJhbnNhY3Rpb25Db25maXJtYXRpb25NZXRhZGF0YRJmChxzcGVudF90b2tlbl9vdXRwdXRzX21ldGFkYXRhGAEgAygLMiUuc3BhcmtfdG9rZW4uU3BlbnRUb2tlbk91dHB1dE1ldGFkYXRhUhlzcGVudFRva2VuT3V0cHV0c01ldGFkYXRhIswCChpUb2tlblRyYW5zYWN0aW9uV2l0aFN0YXR1cxJKChF0b2tlbl90cmFuc2FjdGlvbhgBIAEoCzIdLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25SEHRva2VuVHJhbnNhY3Rpb24SOwoGc3RhdHVzGAIgASgOMiMuc3BhcmtfdG9rZW4uVG9rZW5UcmFuc2FjdGlvblN0YXR1c1IGc3RhdHVzEmYKFWNvbmZpcm1hdGlvbl9tZXRhZGF0YRgDIAEoCzIxLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25Db25maXJtYXRpb25NZXRhZGF0YVIUY29uZmlybWF0aW9uTWV0YWRhdGESPQoWdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgEIAEoDEIH+kIEegJoIFIUdG9rZW5UcmFuc2FjdGlvbkhhc2girAMKE0ZyZWV6ZVRva2Vuc1BheWxvYWQSGAoHdmVyc2lvbhgBIAEoDVIHdmVyc2lvbhIxChBvd25lcl9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRI2ChB0b2tlbl9wdWJsaWNfa2V5GAMgASgMQgf6QgR6AmghSABSDnRva2VuUHVibGljS2V5iAEBEjcKEHRva2VuX2lkZW50aWZpZXIYBCABKAxCB/pCBHoCaCBIAVIPdG9rZW5JZGVudGlmaWVyiAEBEjoKGWlzc3Vlcl9wcm92aWRlZF90aW1lc3RhbXAYBSABKARSF2lzc3VlclByb3ZpZGVkVGltZXN0YW1wEkgKHG9wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXkYBiABKAxCB/pCBHoCaCFSGW9wZXJhdG9ySWRlbnRpdHlQdWJsaWNLZXkSJwoPc2hvdWxkX3VuZnJlZXplGAcgASgIUg5zaG91bGRVbmZyZWV6ZUITChFfdG9rZW5fcHVibGljX2tleUITChFfdG9rZW5faWRlbnRpZmllciKhAQoTRnJlZXplVG9rZW5zUmVxdWVzdBJUChVmcmVlemVfdG9rZW5zX3BheWxvYWQYASABKAsyIC5zcGFya190b2tlbi5GcmVlemVUb2tlbnNQYXlsb2FkUhNmcmVlemVUb2tlbnNQYXlsb2FkEjQKEGlzc3Vlcl9zaWduYXR1cmUYAiABKAxCCfpCBnoEEEAYSVIPaXNzdWVyU2lnbmF0dXJlIokBChRGcmVlemVUb2tlbnNSZXNwb25zZRI9ChNpbXBhY3RlZF9vdXRwdXRfaWRzGAEgAygJQg36QgqSAQciBXIDsAEBUhFpbXBhY3RlZE91dHB1dElkcxIyChVpbXBhY3RlZF90b2tlbl9hbW91bnQYAiABKAxSE2ltcGFjdGVkVG9rZW5BbW91bnQqpwEKFFRva2VuVHJhbnNhY3Rpb25UeXBlEiYKIlRPS0VOX1RSQU5TQUNUSU9OX1RZUEVfVU5TUEVDSUZJRUQQABIhCh1UT0tFTl9UUkFOU0FDVElPTl9UWVBFX0NSRUFURRABEh8KG1RPS0VOX1RSQU5TQUNUSU9OX1RZUEVfTUlOVBACEiMKH1RPS0VOX1RSQU5TQUNUSU9OX1RZUEVfVFJBTlNGRVIQAypTCgxDb21taXRTdGF0dXMSFgoSQ09NTUlUX1VOU1BFQ0lGSUVEEAASFQoRQ09NTUlUX1BST0NFU1NJTkcQARIUChBDT01NSVRfRklOQUxJWkVEEAIqhgIKFlRva2VuVHJhbnNhY3Rpb25TdGF0dXMSHQoZVE9LRU5fVFJBTlNBQ1RJT05fU1RBUlRFRBAAEhwKGFRPS0VOX1RSQU5TQUNUSU9OX1NJR05FRBABEh4KGlRPS0VOX1RSQU5TQUNUSU9OX1JFVkVBTEVEEAUSHwobVE9LRU5fVFJBTlNBQ1RJT05fRklOQUxJWkVEEAISJwojVE9LRU5fVFJBTlNBQ1RJT05fU1RBUlRFRF9DQU5DRUxMRUQQAxImCiJUT0tFTl9UUkFOU0FDVElPTl9TSUdORURfQ0FOQ0VMTEVEEAQSHQoZVE9LRU5fVFJBTlNBQ1RJT05fVU5LTk9XThAKMvAFChFTcGFya1Rva2VuU2VydmljZRJiChFzdGFydF90cmFuc2FjdGlvbhIkLnNwYXJrX3Rva2VuLlN0YXJ0VHJhbnNhY3Rpb25SZXF1ZXN0GiUuc3BhcmtfdG9rZW4uU3RhcnRUcmFuc2FjdGlvblJlc3BvbnNlIgASZQoSY29tbWl0X3RyYW5zYWN0aW9uEiUuc3BhcmtfdG9rZW4uQ29tbWl0VHJhbnNhY3Rpb25SZXF1ZXN0GiYuc3BhcmtfdG9rZW4uQ29tbWl0VHJhbnNhY3Rpb25SZXNwb25zZSIAEmkKFHF1ZXJ5X3Rva2VuX21ldGFkYXRhEiYuc3BhcmtfdG9rZW4uUXVlcnlUb2tlbk1ldGFkYXRhUmVxdWVzdBonLnNwYXJrX3Rva2VuLlF1ZXJ5VG9rZW5NZXRhZGF0YVJlc3BvbnNlIgASdQoYcXVlcnlfdG9rZW5fdHJhbnNhY3Rpb25zEiouc3BhcmtfdG9rZW4uUXVlcnlUb2tlblRyYW5zYWN0aW9uc1JlcXVlc3QaKy5zcGFya190b2tlbi5RdWVyeVRva2VuVHJhbnNhY3Rpb25zUmVzcG9uc2UiABJmChNxdWVyeV90b2tlbl9vdXRwdXRzEiUuc3BhcmtfdG9rZW4uUXVlcnlUb2tlbk91dHB1dHNSZXF1ZXN0GiYuc3BhcmtfdG9rZW4uUXVlcnlUb2tlbk91dHB1dHNSZXNwb25zZSIAElYKDWZyZWV6ZV90b2tlbnMSIC5zcGFya190b2tlbi5GcmVlemVUb2tlbnNSZXF1ZXN0GiEuc3BhcmtfdG9rZW4uRnJlZXplVG9rZW5zUmVzcG9uc2UiABJuChVicm9hZGNhc3RfdHJhbnNhY3Rpb24SKC5zcGFya190b2tlbi5Ccm9hZGNhc3RUcmFuc2FjdGlvblJlcXVlc3QaKS5zcGFya190b2tlbi5Ccm9hZGNhc3RUcmFuc2FjdGlvblJlc3BvbnNlIgBCMlowZ2l0aHViLmNvbS9saWdodHNwYXJrZGV2L3NwYXJrL3Byb3RvL3NwYXJrX3Rva2VuYgZwcm90bzMKpQQKCm1vY2sucHJvdG8SBG1vY2saG2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90byJAChtDbGVhblVwUHJlaW1hZ2VTaGFyZVJlcXVlc3QSIQoMcGF5bWVudF9oYXNoGAEgASgMUgtwYXltZW50SGFzaCJNChhVcGRhdGVOb2Rlc1N0YXR1c1JlcXVlc3QSGQoIbm9kZV9pZHMYASADKAlSB25vZGVJZHMSFgoGc3RhdHVzGAIgASgJUgZzdGF0dXMiMQoSVHJpZ2dlclRhc2tSZXF1ZXN0EhsKCXRhc2tfbmFtZRgBIAEoCVIIdGFza05hbWUy+gEKC01vY2tTZXJ2aWNlElYKF2NsZWFuX3VwX3ByZWltYWdlX3NoYXJlEiEubW9jay5DbGVhblVwUHJlaW1hZ2VTaGFyZVJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiABJPChN1cGRhdGVfbm9kZXNfc3RhdHVzEh4ubW9jay5VcGRhdGVOb2Rlc1N0YXR1c1JlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiABJCCgx0cmlnZ2VyX3Rhc2sSGC5tb2NrLlRyaWdnZXJUYXNrUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSIAQitaKWdpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9tb2NrYgZwcm90bzMK6gcKEXNwYXJrX2F1dGhuLnByb3RvEgtzcGFya19hdXRobiJ4CglDaGFsbGVuZ2USGAoHdmVyc2lvbhgBIAEoBVIHdmVyc2lvbhIcCgl0aW1lc3RhbXAYAiABKANSCXRpbWVzdGFtcBIUCgVub25jZRgDIAEoDFIFbm9uY2USHQoKcHVibGljX2tleRgEIAEoDFIJcHVibGljS2V5IoUBChJQcm90ZWN0ZWRDaGFsbGVuZ2USGAoHdmVyc2lvbhgBIAEoBVIHdmVyc2lvbhI0CgljaGFsbGVuZ2UYAiABKAsyFi5zcGFya19hdXRobi5DaGFsbGVuZ2VSCWNoYWxsZW5nZRIfCgtzZXJ2ZXJfaG1hYxgDIAEoDFIKc2VydmVySG1hYyI0ChNHZXRDaGFsbGVuZ2VSZXF1ZXN0Eh0KCnB1YmxpY19rZXkYASABKAxSCXB1YmxpY0tleSJoChRHZXRDaGFsbGVuZ2VSZXNwb25zZRJQChNwcm90ZWN0ZWRfY2hhbGxlbmdlGAEgASgLMh8uc3BhcmtfYXV0aG4uUHJvdGVjdGVkQ2hhbGxlbmdlUhJwcm90ZWN0ZWRDaGFsbGVuZ2UipwEKFlZlcmlmeUNoYWxsZW5nZVJlcXVlc3QSUAoTcHJvdGVjdGVkX2NoYWxsZW5nZRgBIAEoCzIfLnNwYXJrX2F1dGhuLlByb3RlY3RlZENoYWxsZW5nZVIScHJvdGVjdGVkQ2hhbGxlbmdlEhwKCXNpZ25hdHVyZRgCIAEoDFIJc2lnbmF0dXJlEh0KCnB1YmxpY19rZXkYAyABKAxSCXB1YmxpY0tleSJxChdWZXJpZnlDaGFsbGVuZ2VSZXNwb25zZRIjCg1zZXNzaW9uX3Rva2VuGAEgASgJUgxzZXNzaW9uVG9rZW4SMQoUZXhwaXJhdGlvbl90aW1lc3RhbXAYAiABKANSE2V4cGlyYXRpb25UaW1lc3RhbXAyzAEKEVNwYXJrQXV0aG5TZXJ2aWNlElYKDWdldF9jaGFsbGVuZ2USIC5zcGFya19hdXRobi5HZXRDaGFsbGVuZ2VSZXF1ZXN0GiEuc3BhcmtfYXV0aG4uR2V0Q2hhbGxlbmdlUmVzcG9uc2UiABJfChB2ZXJpZnlfY2hhbGxlbmdlEiMuc3BhcmtfYXV0aG4uVmVyaWZ5Q2hhbGxlbmdlUmVxdWVzdBokLnNwYXJrX2F1dGhuLlZlcmlmeUNoYWxsZW5nZVJlc3BvbnNlIgBCMlowZ2l0aHViLmNvbS9saWdodHNwYXJrZGV2L3NwYXJrL3Byb3RvL3NwYXJrX2F1dGhuYgZwcm90bzM=";
26975
+ var SPARK_DESCRIPTORS_BASE64 = "Cv8BCh9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvEg9nb29nbGUucHJvdG9idWYiOwoJVGltZXN0YW1wEhgKB3NlY29uZHMYASABKANSB3NlY29uZHMSFAoFbmFub3MYAiABKAVSBW5hbm9zQoUBChNjb20uZ29vZ2xlLnByb3RvYnVmQg5UaW1lc3RhbXBQcm90b1ABWjJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi90aW1lc3RhbXBwYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc2IGcHJvdG8zCr4BChtnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIHCgVFbXB0eUJ9ChNjb20uZ29vZ2xlLnByb3RvYnVmQgpFbXB0eVByb3RvUAFaLmdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2tub3duL2VtcHR5cGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNiBnByb3RvMwqIYAogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiJbChFGaWxlRGVzY3JpcHRvclNldBI4CgRmaWxlGAEgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG9SBGZpbGUqDAiA7Mr/ARCB7Mr/ASKYBQoTRmlsZURlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEhgKB3BhY2thZ2UYAiABKAlSB3BhY2thZ2USHgoKZGVwZW5kZW5jeRgDIAMoCVIKZGVwZW5kZW5jeRIrChFwdWJsaWNfZGVwZW5kZW5jeRgKIAMoBVIQcHVibGljRGVwZW5kZW5jeRInCg93ZWFrX2RlcGVuZGVuY3kYCyADKAVSDndlYWtEZXBlbmRlbmN5EkMKDG1lc3NhZ2VfdHlwZRgEIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SC21lc3NhZ2VUeXBlEkEKCWVudW1fdHlwZRgFIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJBCgdzZXJ2aWNlGAYgAygLMicuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9SB3NlcnZpY2USQwoJZXh0ZW5zaW9uGAcgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SNgoHb3B0aW9ucxgIIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1IHb3B0aW9ucxJJChBzb3VyY2VfY29kZV9pbmZvGAkgASgLMh8uZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvUg5zb3VyY2VDb2RlSW5mbxIWCgZzeW50YXgYDCABKAlSBnN5bnRheBIyCgdlZGl0aW9uGA4gASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SB2VkaXRpb24iuQYKD0Rlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjsKBWZpZWxkGAIgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUgVmaWVsZBJDCglleHRlbnNpb24YBiADKAsyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9SCWV4dGVuc2lvbhJBCgtuZXN0ZWRfdHlwZRgDIAMoCzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9SCm5lc3RlZFR5cGUSQQoJZW51bV90eXBlGAQgAygLMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9SCGVudW1UeXBlElgKD2V4dGVuc2lvbl9yYW5nZRgFIAMoCzIvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2VSDmV4dGVuc2lvblJhbmdlEkQKCm9uZW9mX2RlY2wYCCADKAsyJS5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG9SCW9uZW9mRGVjbBI5CgdvcHRpb25zGAcgASgLMh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zUgdvcHRpb25zElUKDnJlc2VydmVkX3JhbmdlGAkgAygLMi4uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlUg1yZXNlcnZlZFJhbmdlEiMKDXJlc2VydmVkX25hbWUYCiADKAlSDHJlc2VydmVkTmFtZRp6Cg5FeHRlbnNpb25SYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQSQAoHb3B0aW9ucxgDIAEoCzImLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnNSB29wdGlvbnMaNwoNUmVzZXJ2ZWRSYW5nZRIUCgVzdGFydBgBIAEoBVIFc3RhcnQSEAoDZW5kGAIgASgFUgNlbmQizAQKFUV4dGVuc2lvblJhbmdlT3B0aW9ucxJYChR1bmludGVycHJldGVkX29wdGlvbhjnByADKAsyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblITdW5pbnRlcnByZXRlZE9wdGlvbhJZCgtkZWNsYXJhdGlvbhgCIAMoCzIyLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuRGVjbGFyYXRpb25CA4gBAlILZGVjbGFyYXRpb24SNwoIZmVhdHVyZXMYMiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSbQoMdmVyaWZpY2F0aW9uGAMgASgOMjguZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5WZXJpZmljYXRpb25TdGF0ZToKVU5WRVJJRklFREIDiAECUgx2ZXJpZmljYXRpb24alAEKC0RlY2xhcmF0aW9uEhYKBm51bWJlchgBIAEoBVIGbnVtYmVyEhsKCWZ1bGxfbmFtZRgCIAEoCVIIZnVsbE5hbWUSEgoEdHlwZRgDIAEoCVIEdHlwZRIaCghyZXNlcnZlZBgFIAEoCFIIcmVzZXJ2ZWQSGgoIcmVwZWF0ZWQYBiABKAhSCHJlcGVhdGVkSgQIBBAFIjQKEVZlcmlmaWNhdGlvblN0YXRlEg8KC0RFQ0xBUkFUSU9OEAASDgoKVU5WRVJJRklFRBABKgkI6AcQgICAgAIiwQYKFEZpZWxkRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAMgASgFUgZudW1iZXISQQoFbGFiZWwYBCABKA4yKy5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWxSBWxhYmVsEj4KBHR5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZVIEdHlwZRIbCgl0eXBlX25hbWUYBiABKAlSCHR5cGVOYW1lEhoKCGV4dGVuZGVlGAIgASgJUghleHRlbmRlZRIjCg1kZWZhdWx0X3ZhbHVlGAcgASgJUgxkZWZhdWx0VmFsdWUSHwoLb25lb2ZfaW5kZXgYCSABKAVSCm9uZW9mSW5kZXgSGwoJanNvbl9uYW1lGAogASgJUghqc29uTmFtZRI3CgdvcHRpb25zGAggASgLMh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9uc1IHb3B0aW9ucxInCg9wcm90bzNfb3B0aW9uYWwYESABKAhSDnByb3RvM09wdGlvbmFsIrYCCgRUeXBlEg8KC1RZUEVfRE9VQkxFEAESDgoKVFlQRV9GTE9BVBACEg4KClRZUEVfSU5UNjQQAxIPCgtUWVBFX1VJTlQ2NBAEEg4KClRZUEVfSU5UMzIQBRIQCgxUWVBFX0ZJWEVENjQQBhIQCgxUWVBFX0ZJWEVEMzIQBxINCglUWVBFX0JPT0wQCBIPCgtUWVBFX1NUUklORxAJEg4KClRZUEVfR1JPVVAQChIQCgxUWVBFX01FU1NBR0UQCxIOCgpUWVBFX0JZVEVTEAwSDwoLVFlQRV9VSU5UMzIQDRINCglUWVBFX0VOVU0QDhIRCg1UWVBFX1NGSVhFRDMyEA8SEQoNVFlQRV9TRklYRUQ2NBAQEg8KC1RZUEVfU0lOVDMyEBESDwoLVFlQRV9TSU5UNjQQEiJDCgVMYWJlbBISCg5MQUJFTF9PUFRJT05BTBABEhIKDkxBQkVMX1JFUEVBVEVEEAMSEgoOTEFCRUxfUkVRVUlSRUQQAiJjChRPbmVvZkRlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEjcKB29wdGlvbnMYAiABKAsyHS5nb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zUgdvcHRpb25zIuMCChNFbnVtRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPwoFdmFsdWUYAiADKAsyKS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvUgV2YWx1ZRI2CgdvcHRpb25zGAMgASgLMhwuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zUgdvcHRpb25zEl0KDnJlc2VydmVkX3JhbmdlGAQgAygLMjYuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8uRW51bVJlc2VydmVkUmFuZ2VSDXJlc2VydmVkUmFuZ2USIwoNcmVzZXJ2ZWRfbmFtZRgFIAMoCVIMcmVzZXJ2ZWROYW1lGjsKEUVudW1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKDAQoYRW51bVZhbHVlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAIgASgFUgZudW1iZXISOwoHb3B0aW9ucxgDIAEoCzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zUgdvcHRpb25zIqcBChZTZXJ2aWNlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPgoGbWV0aG9kGAIgAygLMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1IGbWV0aG9kEjkKB29wdGlvbnMYAyABKAsyHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnNSB29wdGlvbnMiiQIKFU1ldGhvZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEh0KCmlucHV0X3R5cGUYAiABKAlSCWlucHV0VHlwZRIfCgtvdXRwdXRfdHlwZRgDIAEoCVIKb3V0cHV0VHlwZRI4CgdvcHRpb25zGAQgASgLMh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNSB29wdGlvbnMSMAoQY2xpZW50X3N0cmVhbWluZxgFIAEoCDoFZmFsc2VSD2NsaWVudFN0cmVhbWluZxIwChBzZXJ2ZXJfc3RyZWFtaW5nGAYgASgIOgVmYWxzZVIPc2VydmVyU3RyZWFtaW5nIq0JCgtGaWxlT3B0aW9ucxIhCgxqYXZhX3BhY2thZ2UYASABKAlSC2phdmFQYWNrYWdlEjAKFGphdmFfb3V0ZXJfY2xhc3NuYW1lGAggASgJUhJqYXZhT3V0ZXJDbGFzc25hbWUSNQoTamF2YV9tdWx0aXBsZV9maWxlcxgKIAEoCDoFZmFsc2VSEWphdmFNdWx0aXBsZUZpbGVzEkQKHWphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoGBQgASgIQgIYAVIZamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaBI6ChZqYXZhX3N0cmluZ19jaGVja191dGY4GBsgASgIOgVmYWxzZVITamF2YVN0cmluZ0NoZWNrVXRmOBJTCgxvcHRpbWl6ZV9mb3IYCSABKA4yKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlOgVTUEVFRFILb3B0aW1pemVGb3ISHQoKZ29fcGFja2FnZRgLIAEoCVIJZ29QYWNrYWdlEjUKE2NjX2dlbmVyaWNfc2VydmljZXMYECABKAg6BWZhbHNlUhFjY0dlbmVyaWNTZXJ2aWNlcxI5ChVqYXZhX2dlbmVyaWNfc2VydmljZXMYESABKAg6BWZhbHNlUhNqYXZhR2VuZXJpY1NlcnZpY2VzEjUKE3B5X2dlbmVyaWNfc2VydmljZXMYEiABKAg6BWZhbHNlUhFweUdlbmVyaWNTZXJ2aWNlcxIlCgpkZXByZWNhdGVkGBcgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIuChBjY19lbmFibGVfYXJlbmFzGB8gASgIOgR0cnVlUg5jY0VuYWJsZUFyZW5hcxIqChFvYmpjX2NsYXNzX3ByZWZpeBgkIAEoCVIPb2JqY0NsYXNzUHJlZml4EikKEGNzaGFycF9uYW1lc3BhY2UYJSABKAlSD2NzaGFycE5hbWVzcGFjZRIhCgxzd2lmdF9wcmVmaXgYJyABKAlSC3N3aWZ0UHJlZml4EigKEHBocF9jbGFzc19wcmVmaXgYKCABKAlSDnBocENsYXNzUHJlZml4EiMKDXBocF9uYW1lc3BhY2UYKSABKAlSDHBocE5hbWVzcGFjZRI0ChZwaHBfbWV0YWRhdGFfbmFtZXNwYWNlGCwgASgJUhRwaHBNZXRhZGF0YU5hbWVzcGFjZRIhCgxydWJ5X3BhY2thZ2UYLSABKAlSC3J1YnlQYWNrYWdlEjcKCGZlYXR1cmVzGDIgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIjoKDE9wdGltaXplTW9kZRIJCgVTUEVFRBABEg0KCUNPREVfU0laRRACEhAKDExJVEVfUlVOVElNRRADKgkI6AcQgICAgAJKBAgqECtKBAgmECdSFHBocF9nZW5lcmljX3NlcnZpY2VzIvQDCg5NZXNzYWdlT3B0aW9ucxI8ChdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdBgBIAEoCDoFZmFsc2VSFG1lc3NhZ2VTZXRXaXJlRm9ybWF0EkwKH25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IYAiABKAg6BWZhbHNlUhxub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhsKCW1hcF9lbnRyeRgHIAEoCFIIbWFwRW50cnkSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYCyABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAwgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgEEAVKBAgFEAZKBAgGEAdKBAgIEAlKBAgJEAoinQ0KDEZpZWxkT3B0aW9ucxJBCgVjdHlwZRgBIAEoDjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGU6BlNUUklOR1IFY3R5cGUSFgoGcGFja2VkGAIgASgIUgZwYWNrZWQSRwoGanN0eXBlGAYgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6CUpTX05PUk1BTFIGanN0eXBlEhkKBGxhenkYBSABKAg6BWZhbHNlUgRsYXp5Ei4KD3VudmVyaWZpZWRfbGF6eRgPIAEoCDoFZmFsc2VSDnVudmVyaWZpZWRMYXp5EiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhkKBHdlYWsYCiABKAg6BWZhbHNlUgR3ZWFrEigKDGRlYnVnX3JlZGFjdBgQIAEoCDoFZmFsc2VSC2RlYnVnUmVkYWN0EksKCXJldGVudGlvbhgRIAEoDjItLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uUmV0ZW50aW9uUglyZXRlbnRpb24SSAoHdGFyZ2V0cxgTIAMoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZVIHdGFyZ2V0cxJXChBlZGl0aW9uX2RlZmF1bHRzGBQgAygLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5FZGl0aW9uRGVmYXVsdFIPZWRpdGlvbkRlZmF1bHRzEjcKCGZlYXR1cmVzGBUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElUKD2ZlYXR1cmVfc3VwcG9ydBgWIAEoCzIsLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuRmVhdHVyZVN1cHBvcnRSDmZlYXR1cmVTdXBwb3J0ElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uGloKDkVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhIUCgV2YWx1ZRgCIAEoCVIFdmFsdWUalgIKDkZlYXR1cmVTdXBwb3J0EkcKEmVkaXRpb25faW50cm9kdWNlZBgBIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUhFlZGl0aW9uSW50cm9kdWNlZBJHChJlZGl0aW9uX2RlcHJlY2F0ZWQYAiABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIRZWRpdGlvbkRlcHJlY2F0ZWQSLwoTZGVwcmVjYXRpb25fd2FybmluZxgDIAEoCVISZGVwcmVjYXRpb25XYXJuaW5nEkEKD2VkaXRpb25fcmVtb3ZlZBgEIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5lZGl0aW9uUmVtb3ZlZCIvCgVDVHlwZRIKCgZTVFJJTkcQABIICgRDT1JEEAESEAoMU1RSSU5HX1BJRUNFEAIiNQoGSlNUeXBlEg0KCUpTX05PUk1BTBAAEg0KCUpTX1NUUklORxABEg0KCUpTX05VTUJFUhACIlUKD09wdGlvblJldGVudGlvbhIVChFSRVRFTlRJT05fVU5LTk9XThAAEhUKEVJFVEVOVElPTl9SVU5USU1FEAESFAoQUkVURU5USU9OX1NPVVJDRRACIowCChBPcHRpb25UYXJnZXRUeXBlEhcKE1RBUkdFVF9UWVBFX1VOS05PV04QABIUChBUQVJHRVRfVFlQRV9GSUxFEAESHwobVEFSR0VUX1RZUEVfRVhURU5TSU9OX1JBTkdFEAISFwoTVEFSR0VUX1RZUEVfTUVTU0FHRRADEhUKEVRBUkdFVF9UWVBFX0ZJRUxEEAQSFQoRVEFSR0VUX1RZUEVfT05FT0YQBRIUChBUQVJHRVRfVFlQRV9FTlVNEAYSGgoWVEFSR0VUX1RZUEVfRU5VTV9FTlRSWRAHEhcKE1RBUkdFVF9UWVBFX1NFUlZJQ0UQCBIWChJUQVJHRVRfVFlQRV9NRVRIT0QQCSoJCOgHEICAgIACSgQIBBAFSgQIEhATIqwBCgxPbmVvZk9wdGlvbnMSNwoIZmVhdHVyZXMYASABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLRAgoLRW51bU9wdGlvbnMSHwoLYWxsb3dfYWxpYXMYAiABKAhSCmFsbG93QWxpYXMSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYBiABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgFEAYi2AIKEEVudW1WYWx1ZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBgBIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSNwoIZmVhdHVyZXMYAiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSKAoMZGVidWdfcmVkYWN0GAMgASgIOgVmYWxzZVILZGVidWdSZWRhY3QSVQoPZmVhdHVyZV9zdXBwb3J0GAQgASgLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5GZWF0dXJlU3VwcG9ydFIOZmVhdHVyZVN1cHBvcnQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLVAQoOU2VydmljZU9wdGlvbnMSNwoIZmVhdHVyZXMYIiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKZAwoNTWV0aG9kT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJxChFpZGVtcG90ZW5jeV9sZXZlbBgiIAEoDjIvLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLklkZW1wb3RlbmN5TGV2ZWw6E0lERU1QT1RFTkNZX1VOS05PV05SEGlkZW1wb3RlbmN5TGV2ZWwSNwoIZmVhdHVyZXMYIyABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iUAoQSWRlbXBvdGVuY3lMZXZlbBIXChNJREVNUE9URU5DWV9VTktOT1dOEAASEwoPTk9fU0lERV9FRkZFQ1RTEAESDgoKSURFTVBPVEVOVBACKgkI6AcQgICAgAIimgMKE1VuaW50ZXJwcmV0ZWRPcHRpb24SQQoEbmFtZRgCIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0UgRuYW1lEikKEGlkZW50aWZpZXJfdmFsdWUYAyABKAlSD2lkZW50aWZpZXJWYWx1ZRIsChJwb3NpdGl2ZV9pbnRfdmFsdWUYBCABKARSEHBvc2l0aXZlSW50VmFsdWUSLAoSbmVnYXRpdmVfaW50X3ZhbHVlGAUgASgDUhBuZWdhdGl2ZUludFZhbHVlEiEKDGRvdWJsZV92YWx1ZRgGIAEoAVILZG91YmxlVmFsdWUSIQoMc3RyaW5nX3ZhbHVlGAcgASgMUgtzdHJpbmdWYWx1ZRInCg9hZ2dyZWdhdGVfdmFsdWUYCCABKAlSDmFnZ3JlZ2F0ZVZhbHVlGkoKCE5hbWVQYXJ0EhsKCW5hbWVfcGFydBgBIAIoCVIIbmFtZVBhcnQSIQoMaXNfZXh0ZW5zaW9uGAIgAigIUgtpc0V4dGVuc2lvbiKnCgoKRmVhdHVyZVNldBKRAQoOZmllbGRfcHJlc2VuY2UYASABKA4yKS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5GaWVsZFByZXNlbmNlQj+IAQGYAQSYAQGiAQ0SCEVYUExJQ0lUGIQHogENEghJTVBMSUNJVBjnB6IBDRIIRVhQTElDSVQY6AeyAQMI6AdSDWZpZWxkUHJlc2VuY2USbAoJZW51bV90eXBlGAIgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuRW51bVR5cGVCKYgBAZgBBpgBAaIBCxIGQ0xPU0VEGIQHogEJEgRPUEVOGOcHsgEDCOgHUghlbnVtVHlwZRKYAQoXcmVwZWF0ZWRfZmllbGRfZW5jb2RpbmcYAyABKA4yMS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5SZXBlYXRlZEZpZWxkRW5jb2RpbmdCLYgBAZgBBJgBAaIBDRIIRVhQQU5ERUQYhAeiAQsSBlBBQ0tFRBjnB7IBAwjoB1IVcmVwZWF0ZWRGaWVsZEVuY29kaW5nEn4KD3V0ZjhfdmFsaWRhdGlvbhgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LlV0ZjhWYWxpZGF0aW9uQimIAQGYAQSYAQGiAQkSBE5PTkUYhAeiAQsSBlZFUklGWRjnB7IBAwjoB1IOdXRmOFZhbGlkYXRpb24SfgoQbWVzc2FnZV9lbmNvZGluZxgFIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0Lk1lc3NhZ2VFbmNvZGluZ0ImiAEBmAEEmAEBogEUEg9MRU5HVEhfUFJFRklYRUQYhAeyAQMI6AdSD21lc3NhZ2VFbmNvZGluZxKCAQoLanNvbl9mb3JtYXQYBiABKA4yJi5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5Kc29uRm9ybWF0QjmIAQGYAQOYAQaYAQGiARcSEkxFR0FDWV9CRVNUX0VGRk9SVBiEB6IBChIFQUxMT1cY5weyAQMI6AdSCmpzb25Gb3JtYXQiXAoNRmllbGRQcmVzZW5jZRIaChZGSUVMRF9QUkVTRU5DRV9VTktOT1dOEAASDAoIRVhQTElDSVQQARIMCghJTVBMSUNJVBACEhMKD0xFR0FDWV9SRVFVSVJFRBADIjcKCEVudW1UeXBlEhUKEUVOVU1fVFlQRV9VTktOT1dOEAASCAoET1BFThABEgoKBkNMT1NFRBACIlYKFVJlcGVhdGVkRmllbGRFbmNvZGluZxIjCh9SRVBFQVRFRF9GSUVMRF9FTkNPRElOR19VTktOT1dOEAASCgoGUEFDS0VEEAESDAoIRVhQQU5ERUQQAiJJCg5VdGY4VmFsaWRhdGlvbhIbChdVVEY4X1ZBTElEQVRJT05fVU5LTk9XThAAEgoKBlZFUklGWRACEggKBE5PTkUQAyIECAEQASJTCg9NZXNzYWdlRW5jb2RpbmcSHAoYTUVTU0FHRV9FTkNPRElOR19VTktOT1dOEAASEwoPTEVOR1RIX1BSRUZJWEVEEAESDQoJREVMSU1JVEVEEAIiSAoKSnNvbkZvcm1hdBIXChNKU09OX0ZPUk1BVF9VTktOT1dOEAASCQoFQUxMT1cQARIWChJMRUdBQ1lfQkVTVF9FRkZPUlQQAioGCOgHEItOKgYIi04QkE4qBgiQThCRTkoGCOcHEOgHIu8DChJGZWF0dXJlU2V0RGVmYXVsdHMSWAoIZGVmYXVsdHMYASADKAsyPC5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldERlZmF1bHRzLkZlYXR1cmVTZXRFZGl0aW9uRGVmYXVsdFIIZGVmYXVsdHMSQQoPbWluaW11bV9lZGl0aW9uGAQgASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SDm1pbmltdW1FZGl0aW9uEkEKD21heGltdW1fZWRpdGlvbhgFIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5tYXhpbXVtRWRpdGlvbhr4AQoYRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhJOChRvdmVycmlkYWJsZV9mZWF0dXJlcxgEIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UhNvdmVycmlkYWJsZUZlYXR1cmVzEkIKDmZpeGVkX2ZlYXR1cmVzGAUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSDWZpeGVkRmVhdHVyZXNKBAgBEAJKBAgCEANSCGZlYXR1cmVzIrUCCg5Tb3VyY2VDb2RlSW5mbxJECghsb2NhdGlvbhgBIAMoCzIoLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblIIbG9jYXRpb24azgEKCExvY2F0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEhYKBHNwYW4YAiADKAVCAhABUgRzcGFuEikKEGxlYWRpbmdfY29tbWVudHMYAyABKAlSD2xlYWRpbmdDb21tZW50cxIrChF0cmFpbGluZ19jb21tZW50cxgEIAEoCVIQdHJhaWxpbmdDb21tZW50cxI6ChlsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzGAYgAygJUhdsZWFkaW5nRGV0YWNoZWRDb21tZW50cyoMCIDsyv8BEIHsyv8BItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACKqcCCgdFZGl0aW9uEhMKD0VESVRJT05fVU5LTk9XThAAEhMKDkVESVRJT05fTEVHQUNZEIQHEhMKDkVESVRJT05fUFJPVE8yEOYHEhMKDkVESVRJT05fUFJPVE8zEOcHEhEKDEVESVRJT05fMjAyMxDoBxIRCgxFRElUSU9OXzIwMjQQ6QcSFwoTRURJVElPTl8xX1RFU1RfT05MWRABEhcKE0VESVRJT05fMl9URVNUX09OTFkQAhIdChdFRElUSU9OXzk5OTk3X1RFU1RfT05MWRCdjQYSHQoXRURJVElPTl85OTk5OF9URVNUX09OTFkQno0GEh0KF0VESVRJT05fOTk5OTlfVEVTVF9PTkxZEJ+NBhITCgtFRElUSU9OX01BWBD/////B0J+ChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9yUHJvdG9zSAFaLWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rlc2NyaXB0b3JwYvgBAaICA0dQQqoCGkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCvsBCh5nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiI6CghEdXJhdGlvbhIYCgdzZWNvbmRzGAEgASgDUgdzZWNvbmRzEhQKBW5hbm9zGAIgASgFUgVuYW5vc0KDAQoTY29tLmdvb2dsZS5wcm90b2J1ZkINRHVyYXRpb25Qcm90b1ABWjFnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9kdXJhdGlvbnBi+AEBogIDR1BCqgIeR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzYgZwcm90bzMKrzEKF3ZhbGlkYXRlL3ZhbGlkYXRlLnByb3RvEgh2YWxpZGF0ZRogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8aHmdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90bxofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byLICAoKRmllbGRSdWxlcxIwCgdtZXNzYWdlGBEgASgLMhYudmFsaWRhdGUuTWVzc2FnZVJ1bGVzUgdtZXNzYWdlEiwKBWZsb2F0GAEgASgLMhQudmFsaWRhdGUuRmxvYXRSdWxlc0gAUgVmbG9hdBIvCgZkb3VibGUYAiABKAsyFS52YWxpZGF0ZS5Eb3VibGVSdWxlc0gAUgZkb3VibGUSLAoFaW50MzIYAyABKAsyFC52YWxpZGF0ZS5JbnQzMlJ1bGVzSABSBWludDMyEiwKBWludDY0GAQgASgLMhQudmFsaWRhdGUuSW50NjRSdWxlc0gAUgVpbnQ2NBIvCgZ1aW50MzIYBSABKAsyFS52YWxpZGF0ZS5VSW50MzJSdWxlc0gAUgZ1aW50MzISLwoGdWludDY0GAYgASgLMhUudmFsaWRhdGUuVUludDY0UnVsZXNIAFIGdWludDY0Ei8KBnNpbnQzMhgHIAEoCzIVLnZhbGlkYXRlLlNJbnQzMlJ1bGVzSABSBnNpbnQzMhIvCgZzaW50NjQYCCABKAsyFS52YWxpZGF0ZS5TSW50NjRSdWxlc0gAUgZzaW50NjQSMgoHZml4ZWQzMhgJIAEoCzIWLnZhbGlkYXRlLkZpeGVkMzJSdWxlc0gAUgdmaXhlZDMyEjIKB2ZpeGVkNjQYCiABKAsyFi52YWxpZGF0ZS5GaXhlZDY0UnVsZXNIAFIHZml4ZWQ2NBI1CghzZml4ZWQzMhgLIAEoCzIXLnZhbGlkYXRlLlNGaXhlZDMyUnVsZXNIAFIIc2ZpeGVkMzISNQoIc2ZpeGVkNjQYDCABKAsyFy52YWxpZGF0ZS5TRml4ZWQ2NFJ1bGVzSABSCHNmaXhlZDY0EikKBGJvb2wYDSABKAsyEy52YWxpZGF0ZS5Cb29sUnVsZXNIAFIEYm9vbBIvCgZzdHJpbmcYDiABKAsyFS52YWxpZGF0ZS5TdHJpbmdSdWxlc0gAUgZzdHJpbmcSLAoFYnl0ZXMYDyABKAsyFC52YWxpZGF0ZS5CeXRlc1J1bGVzSABSBWJ5dGVzEikKBGVudW0YECABKAsyEy52YWxpZGF0ZS5FbnVtUnVsZXNIAFIEZW51bRI1CghyZXBlYXRlZBgSIAEoCzIXLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXNIAFIIcmVwZWF0ZWQSJgoDbWFwGBMgASgLMhIudmFsaWRhdGUuTWFwUnVsZXNIAFIDbWFwEiYKA2FueRgUIAEoCzISLnZhbGlkYXRlLkFueVJ1bGVzSABSA2FueRI1CghkdXJhdGlvbhgVIAEoCzIXLnZhbGlkYXRlLkR1cmF0aW9uUnVsZXNIAFIIZHVyYXRpb24SOAoJdGltZXN0YW1wGBYgASgLMhgudmFsaWRhdGUuVGltZXN0YW1wUnVsZXNIAFIJdGltZXN0YW1wQgYKBHR5cGUisAEKCkZsb2F0UnVsZXMSFAoFY29uc3QYASABKAJSBWNvbnN0Eg4KAmx0GAIgASgCUgJsdBIQCgNsdGUYAyABKAJSA2x0ZRIOCgJndBgEIAEoAlICZ3QSEAoDZ3RlGAUgASgCUgNndGUSDgoCaW4YBiADKAJSAmluEhUKBm5vdF9pbhgHIAMoAlIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKxAQoLRG91YmxlUnVsZXMSFAoFY29uc3QYASABKAFSBWNvbnN0Eg4KAmx0GAIgASgBUgJsdBIQCgNsdGUYAyABKAFSA2x0ZRIOCgJndBgEIAEoAVICZ3QSEAoDZ3RlGAUgASgBUgNndGUSDgoCaW4YBiADKAFSAmluEhUKBm5vdF9pbhgHIAMoAVIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKwAQoKSW50MzJSdWxlcxIUCgVjb25zdBgBIAEoBVIFY29uc3QSDgoCbHQYAiABKAVSAmx0EhAKA2x0ZRgDIAEoBVIDbHRlEg4KAmd0GAQgASgFUgJndBIQCgNndGUYBSABKAVSA2d0ZRIOCgJpbhgGIAMoBVICaW4SFQoGbm90X2luGAcgAygFUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrABCgpJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgDUgVjb25zdBIOCgJsdBgCIAEoA1ICbHQSEAoDbHRlGAMgASgDUgNsdGUSDgoCZ3QYBCABKANSAmd0EhAKA2d0ZRgFIAEoA1IDZ3RlEg4KAmluGAYgAygDUgJpbhIVCgZub3RfaW4YByADKANSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1VJbnQzMlJ1bGVzEhQKBWNvbnN0GAEgASgNUgVjb25zdBIOCgJsdBgCIAEoDVICbHQSEAoDbHRlGAMgASgNUgNsdGUSDgoCZ3QYBCABKA1SAmd0EhAKA2d0ZRgFIAEoDVIDZ3RlEg4KAmluGAYgAygNUgJpbhIVCgZub3RfaW4YByADKA1SBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1VJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgEUgVjb25zdBIOCgJsdBgCIAEoBFICbHQSEAoDbHRlGAMgASgEUgNsdGUSDgoCZ3QYBCABKARSAmd0EhAKA2d0ZRgFIAEoBFIDZ3RlEg4KAmluGAYgAygEUgJpbhIVCgZub3RfaW4YByADKARSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1NJbnQzMlJ1bGVzEhQKBWNvbnN0GAEgASgRUgVjb25zdBIOCgJsdBgCIAEoEVICbHQSEAoDbHRlGAMgASgRUgNsdGUSDgoCZ3QYBCABKBFSAmd0EhAKA2d0ZRgFIAEoEVIDZ3RlEg4KAmluGAYgAygRUgJpbhIVCgZub3RfaW4YByADKBFSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisQEKC1NJbnQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgSUgVjb25zdBIOCgJsdBgCIAEoElICbHQSEAoDbHRlGAMgASgSUgNsdGUSDgoCZ3QYBCABKBJSAmd0EhAKA2d0ZRgFIAEoElIDZ3RlEg4KAmluGAYgAygSUgJpbhIVCgZub3RfaW4YByADKBJSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkisgEKDEZpeGVkMzJSdWxlcxIUCgVjb25zdBgBIAEoB1IFY29uc3QSDgoCbHQYAiABKAdSAmx0EhAKA2x0ZRgDIAEoB1IDbHRlEg4KAmd0GAQgASgHUgJndBIQCgNndGUYBSABKAdSA2d0ZRIOCgJpbhgGIAMoB1ICaW4SFQoGbm90X2luGAcgAygHUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrIBCgxGaXhlZDY0UnVsZXMSFAoFY29uc3QYASABKAZSBWNvbnN0Eg4KAmx0GAIgASgGUgJsdBIQCgNsdGUYAyABKAZSA2x0ZRIOCgJndBgEIAEoBlICZ3QSEAoDZ3RlGAUgASgGUgNndGUSDgoCaW4YBiADKAZSAmluEhUKBm5vdF9pbhgHIAMoBlIFbm90SW4SIQoMaWdub3JlX2VtcHR5GAggASgIUgtpZ25vcmVFbXB0eSKzAQoNU0ZpeGVkMzJSdWxlcxIUCgVjb25zdBgBIAEoD1IFY29uc3QSDgoCbHQYAiABKA9SAmx0EhAKA2x0ZRgDIAEoD1IDbHRlEg4KAmd0GAQgASgPUgJndBIQCgNndGUYBSABKA9SA2d0ZRIOCgJpbhgGIAMoD1ICaW4SFQoGbm90X2luGAcgAygPUgVub3RJbhIhCgxpZ25vcmVfZW1wdHkYCCABKAhSC2lnbm9yZUVtcHR5IrMBCg1TRml4ZWQ2NFJ1bGVzEhQKBWNvbnN0GAEgASgQUgVjb25zdBIOCgJsdBgCIAEoEFICbHQSEAoDbHRlGAMgASgQUgNsdGUSDgoCZ3QYBCABKBBSAmd0EhAKA2d0ZRgFIAEoEFIDZ3RlEg4KAmluGAYgAygQUgJpbhIVCgZub3RfaW4YByADKBBSBW5vdEluEiEKDGlnbm9yZV9lbXB0eRgIIAEoCFILaWdub3JlRW1wdHkiIQoJQm9vbFJ1bGVzEhQKBWNvbnN0GAEgASgIUgVjb25zdCLUBQoLU3RyaW5nUnVsZXMSFAoFY29uc3QYASABKAlSBWNvbnN0EhAKA2xlbhgTIAEoBFIDbGVuEhcKB21pbl9sZW4YAiABKARSBm1pbkxlbhIXCgdtYXhfbGVuGAMgASgEUgZtYXhMZW4SGwoJbGVuX2J5dGVzGBQgASgEUghsZW5CeXRlcxIbCgltaW5fYnl0ZXMYBCABKARSCG1pbkJ5dGVzEhsKCW1heF9ieXRlcxgFIAEoBFIIbWF4Qnl0ZXMSGAoHcGF0dGVybhgGIAEoCVIHcGF0dGVybhIWCgZwcmVmaXgYByABKAlSBnByZWZpeBIWCgZzdWZmaXgYCCABKAlSBnN1ZmZpeBIaCghjb250YWlucxgJIAEoCVIIY29udGFpbnMSIQoMbm90X2NvbnRhaW5zGBcgASgJUgtub3RDb250YWlucxIOCgJpbhgKIAMoCVICaW4SFQoGbm90X2luGAsgAygJUgVub3RJbhIWCgVlbWFpbBgMIAEoCEgAUgVlbWFpbBIcCghob3N0bmFtZRgNIAEoCEgAUghob3N0bmFtZRIQCgJpcBgOIAEoCEgAUgJpcBIUCgRpcHY0GA8gASgISABSBGlwdjQSFAoEaXB2NhgQIAEoCEgAUgRpcHY2EhIKA3VyaRgRIAEoCEgAUgN1cmkSGQoHdXJpX3JlZhgSIAEoCEgAUgZ1cmlSZWYSGgoHYWRkcmVzcxgVIAEoCEgAUgdhZGRyZXNzEhQKBHV1aWQYFiABKAhIAFIEdXVpZBJAChB3ZWxsX2tub3duX3JlZ2V4GBggASgOMhQudmFsaWRhdGUuS25vd25SZWdleEgAUg53ZWxsS25vd25SZWdleBIcCgZzdHJpY3QYGSABKAg6BHRydWVSBnN0cmljdBIhCgxpZ25vcmVfZW1wdHkYGiABKAhSC2lnbm9yZUVtcHR5QgwKCndlbGxfa25vd24i4gIKCkJ5dGVzUnVsZXMSFAoFY29uc3QYASABKAxSBWNvbnN0EhAKA2xlbhgNIAEoBFIDbGVuEhcKB21pbl9sZW4YAiABKARSBm1pbkxlbhIXCgdtYXhfbGVuGAMgASgEUgZtYXhMZW4SGAoHcGF0dGVybhgEIAEoCVIHcGF0dGVybhIWCgZwcmVmaXgYBSABKAxSBnByZWZpeBIWCgZzdWZmaXgYBiABKAxSBnN1ZmZpeBIaCghjb250YWlucxgHIAEoDFIIY29udGFpbnMSDgoCaW4YCCADKAxSAmluEhUKBm5vdF9pbhgJIAMoDFIFbm90SW4SEAoCaXAYCiABKAhIAFICaXASFAoEaXB2NBgLIAEoCEgAUgRpcHY0EhQKBGlwdjYYDCABKAhIAFIEaXB2NhIhCgxpZ25vcmVfZW1wdHkYDiABKAhSC2lnbm9yZUVtcHR5QgwKCndlbGxfa25vd24iawoJRW51bVJ1bGVzEhQKBWNvbnN0GAEgASgFUgVjb25zdBIhCgxkZWZpbmVkX29ubHkYAiABKAhSC2RlZmluZWRPbmx5Eg4KAmluGAMgAygFUgJpbhIVCgZub3RfaW4YBCADKAVSBW5vdEluIj4KDE1lc3NhZ2VSdWxlcxISCgRza2lwGAEgASgIUgRza2lwEhoKCHJlcXVpcmVkGAIgASgIUghyZXF1aXJlZCKwAQoNUmVwZWF0ZWRSdWxlcxIbCgltaW5faXRlbXMYASABKARSCG1pbkl0ZW1zEhsKCW1heF9pdGVtcxgCIAEoBFIIbWF4SXRlbXMSFgoGdW5pcXVlGAMgASgIUgZ1bmlxdWUSKgoFaXRlbXMYBCABKAsyFC52YWxpZGF0ZS5GaWVsZFJ1bGVzUgVpdGVtcxIhCgxpZ25vcmVfZW1wdHkYBSABKAhSC2lnbm9yZUVtcHR5ItwBCghNYXBSdWxlcxIbCgltaW5fcGFpcnMYASABKARSCG1pblBhaXJzEhsKCW1heF9wYWlycxgCIAEoBFIIbWF4UGFpcnMSGwoJbm9fc3BhcnNlGAMgASgIUghub1NwYXJzZRIoCgRrZXlzGAQgASgLMhQudmFsaWRhdGUuRmllbGRSdWxlc1IEa2V5cxIsCgZ2YWx1ZXMYBSABKAsyFC52YWxpZGF0ZS5GaWVsZFJ1bGVzUgZ2YWx1ZXMSIQoMaWdub3JlX2VtcHR5GAYgASgIUgtpZ25vcmVFbXB0eSJNCghBbnlSdWxlcxIaCghyZXF1aXJlZBgBIAEoCFIIcmVxdWlyZWQSDgoCaW4YAiADKAlSAmluEhUKBm5vdF9pbhgDIAMoCVIFbm90SW4i6QIKDUR1cmF0aW9uUnVsZXMSGgoIcmVxdWlyZWQYASABKAhSCHJlcXVpcmVkEi8KBWNvbnN0GAIgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgVjb25zdBIpCgJsdBgDIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblICbHQSKwoDbHRlGAQgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgNsdGUSKQoCZ3QYBSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25SAmd0EisKA2d0ZRgGIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblIDZ3RlEikKAmluGAcgAygLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgJpbhIwCgZub3RfaW4YCCADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25SBW5vdEluIvMCCg5UaW1lc3RhbXBSdWxlcxIaCghyZXF1aXJlZBgBIAEoCFIIcmVxdWlyZWQSMAoFY29uc3QYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgVjb25zdBIqCgJsdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSAmx0EiwKA2x0ZRgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSA2x0ZRIqCgJndBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSAmd0EiwKA2d0ZRgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSA2d0ZRIVCgZsdF9ub3cYByABKAhSBWx0Tm93EhUKBmd0X25vdxgIIAEoCFIFZ3ROb3cSMQoGd2l0aGluGAkgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUgZ3aXRoaW4qRgoKS25vd25SZWdleBILCgdVTktOT1dOEAASFAoQSFRUUF9IRUFERVJfTkFNRRABEhUKEUhUVFBfSEVBREVSX1ZBTFVFEAI6PAoIZGlzYWJsZWQSHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYrwggASgIUghkaXNhYmxlZDo6CgdpZ25vcmVkEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGLAIIAEoCFIHaWdub3JlZDo6CghyZXF1aXJlZBIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMYrwggASgIUghyZXF1aXJlZDpKCgVydWxlcxIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYrwggASgLMhQudmFsaWRhdGUuRmllbGRSdWxlc1IFcnVsZXNCUAoaaW8uZW52b3lwcm94eS5wZ3YudmFsaWRhdGVaMmdpdGh1Yi5jb20vZW52b3lwcm94eS9wcm90b2MtZ2VuLXZhbGlkYXRlL3ZhbGlkYXRlCrcDCgxjb21tb24ucHJvdG8SBmNvbW1vbiKHAQoKUGFja2FnZU1hcBI8CghwYWNrYWdlcxgBIAMoCzIgLmNvbW1vbi5QYWNrYWdlTWFwLlBhY2thZ2VzRW50cnlSCHBhY2thZ2VzGjsKDVBhY2thZ2VzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAxSBXZhbHVlOgI4ASJFChFTaWduaW5nQ29tbWl0bWVudBIWCgZoaWRpbmcYASABKAxSBmhpZGluZxIYCgdiaW5kaW5nGAIgASgMUgdiaW5kaW5nIjgKDVNpZ25pbmdSZXN1bHQSJwoPc2lnbmF0dXJlX3NoYXJlGAEgASgMUg5zaWduYXR1cmVTaGFyZSpdCg9TaWduYXR1cmVJbnRlbnQSDAoIQ1JFQVRJT04QABIMCghUUkFOU0ZFUhABEg0KCUFHR1JFR0FURRACEg8KB1JFRlJFU0gQAxoCCAESDgoGRVhURU5EEAQaAggBQi1aK2dpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9jb21tb25iBnByb3RvMwq/rgIKC3NwYXJrLnByb3RvEgVzcGFyaxofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bxobZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvGhd2YWxpZGF0ZS92YWxpZGF0ZS5wcm90bxoMY29tbW9uLnByb3RvIkoKGFN1YnNjcmliZVRvRXZlbnRzUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAogASgMUhFpZGVudGl0eVB1YmxpY0tleSLAAQoZU3Vic2NyaWJlVG9FdmVudHNSZXNwb25zZRIyCgh0cmFuc2ZlchgBIAEoCzIULnNwYXJrLlRyYW5zZmVyRXZlbnRIAFIIdHJhbnNmZXISLwoHZGVwb3NpdBgCIAEoCzITLnNwYXJrLkRlcG9zaXRFdmVudEgAUgdkZXBvc2l0EjUKCWNvbm5lY3RlZBgDIAEoCzIVLnNwYXJrLkNvbm5lY3RlZEV2ZW50SABSCWNvbm5lY3RlZEIHCgVldmVudCIQCg5Db25uZWN0ZWRFdmVudCI8Cg1UcmFuc2ZlckV2ZW50EisKCHRyYW5zZmVyGAogASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIjkKDERlcG9zaXRFdmVudBIpCgdkZXBvc2l0GAogASgLMg8uc3BhcmsuVHJlZU5vZGVSB2RlcG9zaXQicgoLUGFnZVJlcXVlc3QSGwoJcGFnZV9zaXplGAEgASgFUghwYWdlU2l6ZRIWCgZjdXJzb3IYAiABKAlSBmN1cnNvchIuCglkaXJlY3Rpb24YAyABKA4yEC5zcGFyay5EaXJlY3Rpb25SCWRpcmVjdGlvbiKoAQoMUGFnZVJlc3BvbnNlEiIKDWhhc19uZXh0X3BhZ2UYASABKAhSC2hhc05leHRQYWdlEioKEWhhc19wcmV2aW91c19wYWdlGAIgASgIUg9oYXNQcmV2aW91c1BhZ2USHwoLbmV4dF9jdXJzb3IYAyABKAlSCm5leHRDdXJzb3ISJwoPcHJldmlvdXNfY3Vyc29yGAQgASgJUg5wcmV2aW91c0N1cnNvciKAAgoTRGVwb3NpdEFkZHJlc3NQcm9vZhJgChJhZGRyZXNzX3NpZ25hdHVyZXMYASADKAsyMS5zcGFyay5EZXBvc2l0QWRkcmVzc1Byb29mLkFkZHJlc3NTaWduYXR1cmVzRW50cnlSEWFkZHJlc3NTaWduYXR1cmVzEkEKHXByb29mX29mX3Bvc3Nlc3Npb25fc2lnbmF0dXJlGAIgASgMUhpwcm9vZk9mUG9zc2Vzc2lvblNpZ25hdHVyZRpEChZBZGRyZXNzU2lnbmF0dXJlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEilQIKHUdlbmVyYXRlRGVwb3NpdEFkZHJlc3NSZXF1ZXN0EiwKEnNpZ25pbmdfcHVibGljX2tleRgBIAEoDFIQc2lnbmluZ1B1YmxpY0tleRIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhFpZGVudGl0eVB1YmxpY0tleRIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsSJgoHbGVhZl9pZBgEIAEoCUII+kIFcgOwAQFIAFIGbGVhZklkiAEBEiAKCWlzX3N0YXRpYxgFIAEoCEgBUghpc1N0YXRpY4gBAUIKCghfbGVhZl9pZEIMCgpfaXNfc3RhdGljIrUBCgdBZGRyZXNzEhgKB2FkZHJlc3MYASABKAlSB2FkZHJlc3MSIwoNdmVyaWZ5aW5nX2tleRgCIAEoDFIMdmVyaWZ5aW5nS2V5Ek4KFWRlcG9zaXRfYWRkcmVzc19wcm9vZhgDIAEoCzIaLnNwYXJrLkRlcG9zaXRBZGRyZXNzUHJvb2ZSE2RlcG9zaXRBZGRyZXNzUHJvb2YSGwoJaXNfc3RhdGljGAUgASgIUghpc1N0YXRpYyJZCh5HZW5lcmF0ZURlcG9zaXRBZGRyZXNzUmVzcG9uc2USNwoPZGVwb3NpdF9hZGRyZXNzGAEgASgLMg4uc3BhcmsuQWRkcmVzc1IOZGVwb3NpdEFkZHJlc3MiyQEKI0dlbmVyYXRlU3RhdGljRGVwb3NpdEFkZHJlc3NSZXF1ZXN0EjUKEnNpZ25pbmdfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIQc2lnbmluZ1B1YmxpY0tleRI3ChNpZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUhFpZGVudGl0eVB1YmxpY0tleRIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsiXwokR2VuZXJhdGVTdGF0aWNEZXBvc2l0QWRkcmVzc1Jlc3BvbnNlEjcKD2RlcG9zaXRfYWRkcmVzcxgBIAEoCzIOLnNwYXJrLkFkZHJlc3NSDmRlcG9zaXRBZGRyZXNzInkKBFVUWE8SFQoGcmF3X3R4GAEgASgMUgVyYXdUeBISCgR2b3V0GAIgASgNUgR2b3V0EjIKB25ldHdvcmsYAyABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yaxISCgR0eGlkGAQgASgMUgR0eGlkIjkKCk5vZGVPdXRwdXQSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEhIKBHZvdXQYAiABKA1SBHZvdXQipgEKClNpZ25pbmdKb2ISLAoSc2lnbmluZ19wdWJsaWNfa2V5GAEgASgMUhBzaWduaW5nUHVibGljS2V5EhUKBnJhd190eBgCIAEoDFIFcmF3VHgSUwoYc2lnbmluZ19ub25jZV9jb21taXRtZW50GAMgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UhZzaWduaW5nTm9uY2VDb21taXRtZW50IsoCCg9TaWduaW5nS2V5c2hhcmUSKwoRb3duZXJfaWRlbnRpZmllcnMYASADKAlSEG93bmVySWRlbnRpZmllcnMSHAoJdGhyZXNob2xkGAIgASgNUgl0aHJlc2hvbGQSHQoKcHVibGljX2tleRgDIAEoDFIJcHVibGljS2V5Ek0KDXB1YmxpY19zaGFyZXMYBCADKAsyKC5zcGFyay5TaWduaW5nS2V5c2hhcmUuUHVibGljU2hhcmVzRW50cnlSDHB1YmxpY1NoYXJlcxI9Cgx1cGRhdGVkX3RpbWUYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgt1cGRhdGVkVGltZRo/ChFQdWJsaWNTaGFyZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoDFIFdmFsdWU6AjgBIsgECg1TaWduaW5nUmVzdWx0EkUKC3B1YmxpY19rZXlzGAEgAygLMiQuc3BhcmsuU2lnbmluZ1Jlc3VsdC5QdWJsaWNLZXlzRW50cnlSCnB1YmxpY0tleXMSbQoZc2lnbmluZ19ub25jZV9jb21taXRtZW50cxgCIAMoCzIxLnNwYXJrLlNpZ25pbmdSZXN1bHQuU2lnbmluZ05vbmNlQ29tbWl0bWVudHNFbnRyeVIXc2lnbmluZ05vbmNlQ29tbWl0bWVudHMSVAoQc2lnbmF0dXJlX3NoYXJlcxgDIAMoCzIpLnNwYXJrLlNpZ25pbmdSZXN1bHQuU2lnbmF0dXJlU2hhcmVzRW50cnlSD3NpZ25hdHVyZVNoYXJlcxJBChBzaWduaW5nX2tleXNoYXJlGAQgASgLMhYuc3BhcmsuU2lnbmluZ0tleXNoYXJlUg9zaWduaW5nS2V5c2hhcmUaPQoPUHVibGljS2V5c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEaZQocU2lnbmluZ05vbmNlQ29tbWl0bWVudHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIvCgV2YWx1ZRgCIAEoCzIZLmNvbW1vbi5TaWduaW5nQ29tbWl0bWVudFIFdmFsdWU6AjgBGkIKFFNpZ25hdHVyZVNoYXJlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEikgMKEFJlbmV3TGVhZlJlcXVlc3QSFwoHbGVhZl9pZBgBIAEoCVIGbGVhZklkEmoKH3JlbmV3X25vZGVfdGltZWxvY2tfc2lnbmluZ19qb2IYAiABKAsyIi5zcGFyay5SZW5ld05vZGVUaW1lbG9ja1NpZ25pbmdKb2JIAFIbcmVuZXdOb2RlVGltZWxvY2tTaWduaW5nSm9iEnAKIXJlbmV3X3JlZnVuZF90aW1lbG9ja19zaWduaW5nX2pvYhgDIAEoCzIkLnNwYXJrLlJlbmV3UmVmdW5kVGltZWxvY2tTaWduaW5nSm9iSABSHXJlbmV3UmVmdW5kVGltZWxvY2tTaWduaW5nSm9iEncKJHJlbmV3X25vZGVfemVyb190aW1lbG9ja19zaWduaW5nX2pvYhgEIAEoCzImLnNwYXJrLlJlbmV3Tm9kZVplcm9UaW1lbG9ja1NpZ25pbmdKb2JIAFIfcmVuZXdOb2RlWmVyb1RpbWVsb2NrU2lnbmluZ0pvYkIOCgxzaWduaW5nX2pvYnMipwUKG1JlbmV3Tm9kZVRpbWVsb2NrU2lnbmluZ0pvYhJXChlzcGxpdF9ub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIVc3BsaXROb2RlVHhTaWduaW5nSm9iEmQKIHNwbGl0X25vZGVfZGlyZWN0X3R4X3NpZ25pbmdfam9iGAIgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIbc3BsaXROb2RlRGlyZWN0VHhTaWduaW5nSm9iEkwKE25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhBub2RlVHhTaWduaW5nSm9iElAKFXJlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSEnJlZnVuZFR4U2lnbmluZ0pvYhJZChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgFIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISXQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJvCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgHIAEoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIuoDCh1SZW5ld1JlZnVuZFRpbWVsb2NrU2lnbmluZ0pvYhJMChNub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIQbm9kZVR4U2lnbmluZ0pvYhJQChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISWQoaZGlyZWN0X25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhZkaXJlY3ROb2RlVHhTaWduaW5nSm9iEl0KHGRpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBCABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhhkaXJlY3RSZWZ1bmRUeFNpZ25pbmdKb2ISbwomZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBSABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUiBkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ0pvYiKTAwofUmVuZXdOb2RlWmVyb1RpbWVsb2NrU2lnbmluZ0pvYhJMChNub2RlX3R4X3NpZ25pbmdfam9iGAEgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIQbm9kZVR4U2lnbmluZ0pvYhJQChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISWQoaZGlyZWN0X25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhZkaXJlY3ROb2RlVHhTaWduaW5nSm9iEm8KJmRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAUgASgLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIgZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25pbmdKb2JKBAgEEAUi0wIKEVJlbmV3TGVhZlJlc3BvbnNlEl0KGnJlbmV3X25vZGVfdGltZWxvY2tfcmVzdWx0GAEgASgLMh4uc3BhcmsuUmVuZXdOb2RlVGltZWxvY2tSZXN1bHRIAFIXcmVuZXdOb2RlVGltZWxvY2tSZXN1bHQSYwoccmVuZXdfcmVmdW5kX3RpbWVsb2NrX3Jlc3VsdBgCIAEoCzIgLnNwYXJrLlJlbmV3UmVmdW5kVGltZWxvY2tSZXN1bHRIAFIZcmVuZXdSZWZ1bmRUaW1lbG9ja1Jlc3VsdBJqCh9yZW5ld19ub2RlX3plcm9fdGltZWxvY2tfcmVzdWx0GAMgASgLMiIuc3BhcmsuUmVuZXdOb2RlWmVyb1RpbWVsb2NrUmVzdWx0SABSG3JlbmV3Tm9kZVplcm9UaW1lbG9ja1Jlc3VsdEIOCgxyZW5ld19yZXN1bHQibgoXUmVuZXdOb2RlVGltZWxvY2tSZXN1bHQSLgoKc3BsaXRfbm9kZRgBIAEoCzIPLnNwYXJrLlRyZWVOb2RlUglzcGxpdE5vZGUSIwoEbm9kZRgCIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgRub2RlIkAKGVJlbmV3UmVmdW5kVGltZWxvY2tSZXN1bHQSIwoEbm9kZRgBIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgRub2RlInIKG1JlbmV3Tm9kZVplcm9UaW1lbG9ja1Jlc3VsdBIuCgpzcGxpdF9ub2RlGAEgASgLMg8uc3BhcmsuVHJlZU5vZGVSCXNwbGl0Tm9kZRIjCgRub2RlGAIgASgLMg8uc3BhcmsuVHJlZU5vZGVSBG5vZGUijwQKE05vZGVTaWduYXR1cmVTaGFyZXMSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEkkKFm5vZGVfdHhfc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhNub2RlVHhTaWduaW5nUmVzdWx0Ek0KGHJlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgDIAEoCzIULnNwYXJrLlNpZ25pbmdSZXN1bHRSFXJlZnVuZFR4U2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAQgASgMUgx2ZXJpZnlpbmdLZXkSVgodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhlkaXJlY3ROb2RlVHhTaWduaW5nUmVzdWx0EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYByABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCLKAgoOTm9kZVNpZ25hdHVyZXMSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEioKEW5vZGVfdHhfc2lnbmF0dXJlGAIgASgMUg9ub2RlVHhTaWduYXR1cmUSLgoTcmVmdW5kX3R4X3NpZ25hdHVyZRgDIAEoDFIRcmVmdW5kVHhTaWduYXR1cmUSNwoYZGlyZWN0X25vZGVfdHhfc2lnbmF0dXJlGAQgASgMUhVkaXJlY3ROb2RlVHhTaWduYXR1cmUSOwoaZGlyZWN0X3JlZnVuZF90eF9zaWduYXR1cmUYBSABKAxSF2RpcmVjdFJlZnVuZFR4U2lnbmF0dXJlEk0KJGRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25hdHVyZRgGIAEoDFIfZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25hdHVyZSKKBAoYU3RhcnRUcmVlQ3JlYXRpb25SZXF1ZXN0Ei4KE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSEWlkZW50aXR5UHVibGljS2V5Ei8KDW9uX2NoYWluX3V0eG8YAiABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxJAChNyb290X3R4X3NpZ25pbmdfam9iGAMgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIQcm9vdFR4U2lnbmluZ0pvYhJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYBCABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISTQoaZGlyZWN0X3Jvb3RfdHhfc2lnbmluZ19qb2IYBSABKAsyES5zcGFyay5TaWduaW5nSm9iUhZkaXJlY3RSb290VHhTaWduaW5nSm9iElEKHGRpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYBiABKAsyES5zcGFyay5TaWduaW5nSm9iUhhkaXJlY3RSZWZ1bmRUeFNpZ25pbmdKb2ISYwomZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19qb2IYByABKAsyES5zcGFyay5TaWduaW5nSm9iUiBkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ0pvYiKNAQoZU3RhcnRUcmVlQ3JlYXRpb25SZXNwb25zZRIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSVwoacm9vdF9ub2RlX3NpZ25hdHVyZV9zaGFyZXMYAiABKAsyGi5zcGFyay5Ob2RlU2lnbmF0dXJlU2hhcmVzUhdyb290Tm9kZVNpZ25hdHVyZVNoYXJlcyKRBAofU3RhcnREZXBvc2l0VHJlZUNyZWF0aW9uUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIvCg1vbl9jaGFpbl91dHhvGAIgASgLMgsuc3BhcmsuVVRYT1ILb25DaGFpblV0eG8SQAoTcm9vdF90eF9zaWduaW5nX2pvYhgDIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEHJvb3RUeFNpZ25pbmdKb2ISRAoVcmVmdW5kX3R4X3NpZ25pbmdfam9iGAQgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIScmVmdW5kVHhTaWduaW5nSm9iEk0KGmRpcmVjdF9yb290X3R4X3NpZ25pbmdfam9iGAUgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIWZGlyZWN0Um9vdFR4U2lnbmluZ0pvYhJRChxkaXJlY3RfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAYgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIYZGlyZWN0UmVmdW5kVHhTaWduaW5nSm9iEmMKJmRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3R4X3NpZ25pbmdfam9iGAcgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIgZGlyZWN0RnJvbUNwZnBSZWZ1bmRUeFNpZ25pbmdKb2IilAEKIFN0YXJ0RGVwb3NpdFRyZWVDcmVhdGlvblJlc3BvbnNlEhcKB3RyZWVfaWQYASABKAlSBnRyZWVJZBJXChpyb290X25vZGVfc2lnbmF0dXJlX3NoYXJlcxgCIAEoCzIaLnNwYXJrLk5vZGVTaWduYXR1cmVTaGFyZXNSF3Jvb3ROb2RlU2lnbmF0dXJlU2hhcmVzIpsBChJUb2tlbk91dHB1dFRvU3BlbmQSRgobcHJldl90b2tlbl90cmFuc2FjdGlvbl9oYXNoGAEgASgMQgf6QgR6AmggUhhwcmV2VG9rZW5UcmFuc2FjdGlvbkhhc2gSPQobcHJldl90b2tlbl90cmFuc2FjdGlvbl92b3V0GAIgASgNUhhwcmV2VG9rZW5UcmFuc2FjdGlvblZvdXQiWQoSVG9rZW5UcmFuc2ZlcklucHV0EkMKEG91dHB1dHNfdG9fc3BlbmQYASADKAsyGS5zcGFyay5Ub2tlbk91dHB1dFRvU3BlbmRSDm91dHB1dHNUb1NwZW5kIs8BCg5Ub2tlbk1pbnRJbnB1dBIzChFpc3N1ZXJfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIPaXNzdWVyUHVibGljS2V5EjoKGWlzc3Vlcl9wcm92aWRlZF90aW1lc3RhbXAYAiABKARSF2lzc3VlclByb3ZpZGVkVGltZXN0YW1wEjcKEHRva2VuX2lkZW50aWZpZXIYAyABKAxCB/pCBHoCaCBIAFIPdG9rZW5JZGVudGlmaWVyiAEBQhMKEV90b2tlbl9pZGVudGlmaWVyIvYCChBUb2tlbkNyZWF0ZUlucHV0EjMKEWlzc3Vlcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg9pc3N1ZXJQdWJsaWNLZXkSJgoKdG9rZW5fbmFtZRgCIAEoCUIH+kIEcgIYFFIJdG9rZW5OYW1lEioKDHRva2VuX3RpY2tlchgDIAEoCUIH+kIEcgIYBlILdG9rZW5UaWNrZXISJAoIZGVjaW1hbHMYBCABKA1CCPpCBSoDGP8BUghkZWNpbWFscxImCgptYXhfc3VwcGx5GAUgASgMQgf6QgR6AmgQUgltYXhTdXBwbHkSIQoMaXNfZnJlZXphYmxlGAYgASgIUgtpc0ZyZWV6YWJsZRJJChpjcmVhdGlvbl9lbnRpdHlfcHVibGljX2tleRgHIAEoDEIH+kIEegJoIUgAUhdjcmVhdGlvbkVudGl0eVB1YmxpY0tleYgBAUIdChtfY3JlYXRpb25fZW50aXR5X3B1YmxpY19rZXkixwQKC1Rva2VuT3V0cHV0Eh0KAmlkGAEgASgJQgj6QgVyA7ABAUgAUgJpZIgBARIxChBvd25lcl9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRJBChVyZXZvY2F0aW9uX2NvbW1pdG1lbnQYAyABKAxCB/pCBHoCaCFIAVIUcmV2b2NhdGlvbkNvbW1pdG1lbnSIAQESMQoSd2l0aGRyYXdfYm9uZF9zYXRzGAQgASgESAJSEHdpdGhkcmF3Qm9uZFNhdHOIAQESTAogd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWUYBSABKARIA1Idd2l0aGRyYXdSZWxhdGl2ZUJsb2NrTG9ja3RpbWWIAQESNgoQdG9rZW5fcHVibGljX2tleRgGIAEoDEIH+kIEegJoIUgEUg50b2tlblB1YmxpY0tleYgBARI3ChB0b2tlbl9pZGVudGlmaWVyGAggASgMQgf6QgR6AmggSAVSD3Rva2VuSWRlbnRpZmllcogBARIqCgx0b2tlbl9hbW91bnQYByABKAxCB/pCBHoCaBBSC3Rva2VuQW1vdW50QgUKA19pZEIYChZfcmV2b2NhdGlvbl9jb21taXRtZW50QhUKE193aXRoZHJhd19ib25kX3NhdHNCIwohX3dpdGhkcmF3X3JlbGF0aXZlX2Jsb2NrX2xvY2t0aW1lQhMKEV90b2tlbl9wdWJsaWNfa2V5QhMKEV90b2tlbl9pZGVudGlmaWVyIqUDChBUb2tlblRyYW5zYWN0aW9uEjYKCm1pbnRfaW5wdXQYASABKAsyFS5zcGFyay5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSQgoOdHJhbnNmZXJfaW5wdXQYAiABKAsyGS5zcGFyay5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBI8CgxjcmVhdGVfaW5wdXQYBSABKAsyFy5zcGFyay5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0EjcKDXRva2VuX291dHB1dHMYAyADKAsyEi5zcGFyay5Ub2tlbk91dHB1dFIMdG9rZW5PdXRwdXRzEloKI3NwYXJrX29wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXlzGAQgAygMQgz6QgmSAQYiBHoCaCFSH3NwYXJrT3BlcmF0b3JJZGVudGl0eVB1YmxpY0tleXMSMgoHbmV0d29yaxgKIAEoDjIOLnNwYXJrLk5ldHdvcmtCCPpCBYIBAiAAUgduZXR3b3JrQg4KDHRva2VuX2lucHV0cyJeChJTaWduYXR1cmVXaXRoSW5kZXgSJwoJc2lnbmF0dXJlGAEgASgMQgn6QgZ6BBBAGElSCXNpZ25hdHVyZRIfCgtpbnB1dF9pbmRleBgCIAEoDVIKaW5wdXRJbmRleCLFAQovT3BlcmF0b3JTcGVjaWZpY1Rva2VuVHJhbnNhY3Rpb25TaWduYWJsZVBheWxvYWQSSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgBIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaBJIChxvcGVyYXRvcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUhlvcGVyYXRvcklkZW50aXR5UHVibGljS2V5IrYBCh5PcGVyYXRvclNwZWNpZmljT3duZXJTaWduYXR1cmUSQgoPb3duZXJfc2lnbmF0dXJlGAEgASgLMhkuc3BhcmsuU2lnbmF0dXJlV2l0aEluZGV4Ug5vd25lclNpZ25hdHVyZRJQCgdwYXlsb2FkGAIgASgLMjYuc3BhcmsuT3BlcmF0b3JTcGVjaWZpY1Rva2VuVHJhbnNhY3Rpb25TaWduYWJsZVBheWxvYWRSB3BheWxvYWQicgoZUmV2b2NhdGlvblNlY3JldFdpdGhJbmRleBIfCgtpbnB1dF9pbmRleBgBIAEoDVIKaW5wdXRJbmRleBI0ChFyZXZvY2F0aW9uX3NlY3JldBgCIAEoDEIH+kIEegJoIFIQcmV2b2NhdGlvblNlY3JldCL4AgoTRnJlZXplVG9rZW5zUGF5bG9hZBIxChBvd25lcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRIxChB0b2tlbl9wdWJsaWNfa2V5GAIgASgMQgf6QgR6AmghUg50b2tlblB1YmxpY0tleRI6Chlpc3N1ZXJfcHJvdmlkZWRfdGltZXN0YW1wGAMgASgEUhdpc3N1ZXJQcm92aWRlZFRpbWVzdGFtcBJIChxvcGVyYXRvcl9pZGVudGl0eV9wdWJsaWNfa2V5GAQgASgMQgf6QgR6AmghUhlvcGVyYXRvcklkZW50aXR5UHVibGljS2V5EicKD3Nob3VsZF91bmZyZWV6ZRgFIAEoCFIOc2hvdWxkVW5mcmVlemUSNwoQdG9rZW5faWRlbnRpZmllchgGIAEoDEIH+kIEegJoIEgAUg90b2tlbklkZW50aWZpZXKIAQFCEwoRX3Rva2VuX2lkZW50aWZpZXIimwEKE0ZyZWV6ZVRva2Vuc1JlcXVlc3QSTgoVZnJlZXplX3Rva2Vuc19wYXlsb2FkGAEgASgLMhouc3BhcmsuRnJlZXplVG9rZW5zUGF5bG9hZFITZnJlZXplVG9rZW5zUGF5bG9hZBI0ChBpc3N1ZXJfc2lnbmF0dXJlGAIgASgMQgn6QgZ6BBBAGElSD2lzc3VlclNpZ25hdHVyZSKJAQoURnJlZXplVG9rZW5zUmVzcG9uc2USPQoTaW1wYWN0ZWRfb3V0cHV0X2lkcxgBIAMoCUIN+kIKkgEHIgVyA7ABAVIRaW1wYWN0ZWRPdXRwdXRJZHMSMgoVaW1wYWN0ZWRfdG9rZW5fYW1vdW50GAIgASgMUhNpbXBhY3RlZFRva2VuQW1vdW50Iv0FCghUcmVlTm9kZRIOCgJpZBgBIAEoCVICaWQSFwoHdHJlZV9pZBgCIAEoCVIGdHJlZUlkEhQKBXZhbHVlGAMgASgEUgV2YWx1ZRIpCg5wYXJlbnRfbm9kZV9pZBgEIAEoCUgAUgxwYXJlbnROb2RlSWSIAQESFwoHbm9kZV90eBgFIAEoDFIGbm9kZVR4EhsKCXJlZnVuZF90eBgGIAEoDFIIcmVmdW5kVHgSEgoEdm91dBgHIAEoDVIEdm91dBIwChR2ZXJpZnlpbmdfcHVibGljX2tleRgIIAEoDFISdmVyaWZ5aW5nUHVibGljS2V5EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYCSABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQQoQc2lnbmluZ19rZXlzaGFyZRgKIAEoCzIWLnNwYXJrLlNpZ25pbmdLZXlzaGFyZVIPc2lnbmluZ0tleXNoYXJlEhYKBnN0YXR1cxgLIAEoCVIGc3RhdHVzEigKB25ldHdvcmsYDCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEj0KDGNyZWF0ZWRfdGltZRgNIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSC2NyZWF0ZWRUaW1lEj0KDHVwZGF0ZWRfdGltZRgOIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSC3VwZGF0ZWRUaW1lEjcKGG93bmVyX3NpZ25pbmdfcHVibGljX2tleRgPIAEoDFIVb3duZXJTaWduaW5nUHVibGljS2V5EhsKCWRpcmVjdF90eBgQIAEoDFIIZGlyZWN0VHgSKAoQZGlyZWN0X3JlZnVuZF90eBgRIAEoDFIOZGlyZWN0UmVmdW5kVHgSOgoaZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHgYEiABKAxSFmRpcmVjdEZyb21DcGZwUmVmdW5kVHhCEQoPX3BhcmVudF9ub2RlX2lkIpABCh1GaW5hbGl6ZU5vZGVTaWduYXR1cmVzUmVxdWVzdBIvCgZpbnRlbnQYASABKA4yFy5jb21tb24uU2lnbmF0dXJlSW50ZW50UgZpbnRlbnQSPgoPbm9kZV9zaWduYXR1cmVzGAIgAygLMhUuc3BhcmsuTm9kZVNpZ25hdHVyZXNSDm5vZGVTaWduYXR1cmVzIkcKHkZpbmFsaXplTm9kZVNpZ25hdHVyZXNSZXNwb25zZRIlCgVub2RlcxgBIAMoCzIPLnNwYXJrLlRyZWVOb2RlUgVub2RlcyJICgtTZWNyZXRTaGFyZRIhCgxzZWNyZXRfc2hhcmUYASABKAxSC3NlY3JldFNoYXJlEhYKBnByb29mcxgCIAMoDFIGcHJvb2ZzIiUKC1NlY3JldFByb29mEhYKBnByb29mcxgBIAMoDFIGcHJvb2ZzIq8CChZMZWFmUmVmdW5kVHhTaWduaW5nSm9iEhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAiABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgDIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIr4CChZVc2VyU2lnbmVkVHhTaWduaW5nSm9iEhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBIsChJzaWduaW5nX3B1YmxpY19rZXkYAiABKAxSEHNpZ25pbmdQdWJsaWNLZXkSFQoGcmF3X3R4GAMgASgMUgVyYXdUeBJTChhzaWduaW5nX25vbmNlX2NvbW1pdG1lbnQYBCABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSFnNpZ25pbmdOb25jZUNvbW1pdG1lbnQSJQoOdXNlcl9zaWduYXR1cmUYBSABKAxSDXVzZXJTaWduYXR1cmUSSgoTc2lnbmluZ19jb21taXRtZW50cxgGIAEoCzIZLnNwYXJrLlNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzIvICChlMZWFmUmVmdW5kVHhTaWduaW5nUmVzdWx0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSIwoNdmVyaWZ5aW5nX2tleRgDIAEoDFIMdmVyaWZ5aW5nS2V5EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBCABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCL1AwoeU3RhcnRVc2VyU2lnbmVkVHJhbnNmZXJSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQwoObGVhdmVzX3RvX3NlbmQYAyADKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUgxsZWF2ZXNUb1NlbmQSPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgEIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRI7CgtleHBpcnlfdGltZRgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSCmV4cGlyeVRpbWUSUAoVZGlyZWN0X2xlYXZlc190b19zZW5kGAYgAygLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlISZGlyZWN0TGVhdmVzVG9TZW5kEmIKH2RpcmVjdF9mcm9tX2NwZnBfbGVhdmVzX3RvX3NlbmQYByADKAsyHS5zcGFyay5Vc2VyU2lnbmVkVHhTaWduaW5nSm9iUhpkaXJlY3RGcm9tQ3BmcExlYXZlc1RvU2VuZCKpAwoUU3RhcnRUcmFuc2ZlclJlcXVlc3QSHwoLdHJhbnNmZXJfaWQYASABKAlSCnRyYW5zZmVySWQSOQoZb3duZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDFIWb3duZXJJZGVudGl0eVB1YmxpY0tleRJDCg5sZWF2ZXNfdG9fc2VuZBgDIAMoCzIdLnNwYXJrLkxlYWZSZWZ1bmRUeFNpZ25pbmdKb2JSDGxlYXZlc1RvU2VuZBI/ChxyZWNlaXZlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAQgASgMUhlyZWNlaXZlcklkZW50aXR5UHVibGljS2V5EjsKC2V4cGlyeV90aW1lGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIKZXhwaXJ5VGltZRJBChB0cmFuc2Zlcl9wYWNrYWdlGAcgASgLMhYuc3BhcmsuVHJhbnNmZXJQYWNrYWdlUg90cmFuc2ZlclBhY2thZ2USIwoNc3BhcmtfaW52b2ljZRgKIAEoCVIMc3BhcmtJbnZvaWNlSgQIBhAHSgQICRAKIo8BChVTdGFydFRyYW5zZmVyUmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXISSQoPc2lnbmluZ19yZXN1bHRzGAIgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi0AMKD1RyYW5zZmVyUGFja2FnZRJDCg5sZWF2ZXNfdG9fc2VuZBgBIAMoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSDGxlYXZlc1RvU2VuZBJXChFrZXlfdHdlYWtfcGFja2FnZRgCIAMoCzIrLnNwYXJrLlRyYW5zZmVyUGFja2FnZS5LZXlUd2Vha1BhY2thZ2VFbnRyeVIPa2V5VHdlYWtQYWNrYWdlEiUKDnVzZXJfc2lnbmF0dXJlGAMgASgMUg11c2VyU2lnbmF0dXJlElAKFWRpcmVjdF9sZWF2ZXNfdG9fc2VuZBgEIAMoCzIdLnNwYXJrLlVzZXJTaWduZWRUeFNpZ25pbmdKb2JSEmRpcmVjdExlYXZlc1RvU2VuZBJiCh9kaXJlY3RfZnJvbV9jcGZwX2xlYXZlc190b19zZW5kGAUgAygLMh0uc3BhcmsuVXNlclNpZ25lZFR4U2lnbmluZ0pvYlIaZGlyZWN0RnJvbUNwZnBMZWF2ZXNUb1NlbmQaQgoUS2V5VHdlYWtQYWNrYWdlRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAxSBXZhbHVlOgI4ASJSChFTZW5kTGVhZktleVR3ZWFrcxI9Cg5sZWF2ZXNfdG9fc2VuZBgBIAMoCzIXLnNwYXJrLlNlbmRMZWFmS2V5VHdlYWtSDGxlYXZlc1RvU2VuZCKDBAoQU2VuZExlYWZLZXlUd2VhaxIXCgdsZWFmX2lkGAEgASgJUgZsZWFmSWQSQAoSc2VjcmV0X3NoYXJlX3R3ZWFrGAIgASgLMhIuc3BhcmsuU2VjcmV0U2hhcmVSEHNlY3JldFNoYXJlVHdlYWsSXgoTcHVia2V5X3NoYXJlc190d2VhaxgDIAMoCzIuLnNwYXJrLlNlbmRMZWFmS2V5VHdlYWsuUHVia2V5U2hhcmVzVHdlYWtFbnRyeVIRcHVia2V5U2hhcmVzVHdlYWsSIwoNc2VjcmV0X2NpcGhlchgEIAEoDFIMc2VjcmV0Q2lwaGVyEhwKCXNpZ25hdHVyZRgFIAEoDFIJc2lnbmF0dXJlEikKEHJlZnVuZF9zaWduYXR1cmUYBiABKAxSD3JlZnVuZFNpZ25hdHVyZRI2ChdkaXJlY3RfcmVmdW5kX3NpZ25hdHVyZRgHIAEoDFIVZGlyZWN0UmVmdW5kU2lnbmF0dXJlEkgKIWRpcmVjdF9mcm9tX2NwZnBfcmVmdW5kX3NpZ25hdHVyZRgIIAEoDFIdZGlyZWN0RnJvbUNwZnBSZWZ1bmRTaWduYXR1cmUaRAoWUHVia2V5U2hhcmVzVHdlYWtFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoDFIFdmFsdWU6AjgBIuYBChdGaW5hbGl6ZVRyYW5zZmVyUmVxdWVzdBIfCgt0cmFuc2Zlcl9pZBgBIAEoCVIKdHJhbnNmZXJJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5Ej0KDmxlYXZlc190b19zZW5kGAMgAygLMhcuc3BhcmsuU2VuZExlYWZLZXlUd2Vha1IMbGVhdmVzVG9TZW5kEjAKFHNwYXJrX3BheW1lbnRfaW50ZW50GAQgASgJUhJzcGFya1BheW1lbnRJbnRlbnQiywEKKkZpbmFsaXplVHJhbnNmZXJXaXRoVHJhbnNmZXJQYWNrYWdlUmVxdWVzdBIfCgt0cmFuc2Zlcl9pZBgBIAEoCVIKdHJhbnNmZXJJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EkEKEHRyYW5zZmVyX3BhY2thZ2UYAyABKAsyFi5zcGFyay5UcmFuc2ZlclBhY2thZ2VSD3RyYW5zZmVyUGFja2FnZSJHChhGaW5hbGl6ZVRyYW5zZmVyUmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXIiyAQKCFRyYW5zZmVyEg4KAmlkGAEgASgJUgJpZBI7ChpzZW5kZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDFIXc2VuZGVySWRlbnRpdHlQdWJsaWNLZXkSPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgDIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRItCgZzdGF0dXMYBCABKA4yFS5zcGFyay5UcmFuc2ZlclN0YXR1c1IGc3RhdHVzEh8KC3RvdGFsX3ZhbHVlGAUgASgEUgp0b3RhbFZhbHVlEjsKC2V4cGlyeV90aW1lGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIKZXhwaXJ5VGltZRIrCgZsZWF2ZXMYByADKAsyEy5zcGFyay5UcmFuc2ZlckxlYWZSBmxlYXZlcxI9CgxjcmVhdGVkX3RpbWUYCCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgtjcmVhdGVkVGltZRI9Cgx1cGRhdGVkX3RpbWUYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgt1cGRhdGVkVGltZRInCgR0eXBlGAogASgOMhMuc3BhcmsuVHJhbnNmZXJUeXBlUgR0eXBlEiMKDXNwYXJrX2ludm9pY2UYCyABKAlSDHNwYXJrSW52b2ljZRIoCgduZXR3b3JrGAwgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yayKEAwoMVHJhbnNmZXJMZWFmEiMKBGxlYWYYASABKAsyDy5zcGFyay5UcmVlTm9kZVIEbGVhZhIjCg1zZWNyZXRfY2lwaGVyGAIgASgMUgxzZWNyZXRDaXBoZXISHAoJc2lnbmF0dXJlGAMgASgMUglzaWduYXR1cmUSNAoWaW50ZXJtZWRpYXRlX3JlZnVuZF90eBgEIAEoDFIUaW50ZXJtZWRpYXRlUmVmdW5kVHgSQQodaW50ZXJtZWRpYXRlX2RpcmVjdF9yZWZ1bmRfdHgYBSABKAxSGmludGVybWVkaWF0ZURpcmVjdFJlZnVuZFR4ElMKJ2ludGVybWVkaWF0ZV9kaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eBgGIAEoDFIiaW50ZXJtZWRpYXRlRGlyZWN0RnJvbUNwZnBSZWZ1bmRUeBI+ChxwZW5kaW5nX2tleV90d2Vha19wdWJsaWNfa2V5GAcgASgMUhhwZW5kaW5nS2V5VHdlYWtQdWJsaWNLZXki8wMKDlRyYW5zZmVyRmlsdGVyEkEKHHJlY2VpdmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxIAFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRI9ChpzZW5kZXJfaWRlbnRpdHlfcHVibGljX2tleRgCIAEoDEgAUhdzZW5kZXJJZGVudGl0eVB1YmxpY0tleRJTCiZzZW5kZXJfb3JfcmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRg8IAEoDEgAUiFzZW5kZXJPclJlY2VpdmVySWRlbnRpdHlQdWJsaWNLZXkSIQoMdHJhbnNmZXJfaWRzGAMgAygJUgt0cmFuc2ZlcklkcxIUCgVsaW1pdBgoIAEoA1IFbGltaXQSFgoGb2Zmc2V0GDIgASgDUgZvZmZzZXQSKQoFdHlwZXMYRiADKA4yEy5zcGFyay5UcmFuc2ZlclR5cGVSBXR5cGVzEigKB25ldHdvcmsYBCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEjEKCHN0YXR1c2VzGFAgAygOMhUuc3BhcmsuVHJhbnNmZXJTdGF0dXNSCHN0YXR1c2VzEiIKBW9yZGVyGAUgASgOMgwuc3BhcmsuT3JkZXJSBW9yZGVyQg0KC3BhcnRpY2lwYW50Il8KFlF1ZXJ5VHJhbnNmZXJzUmVzcG9uc2USLQoJdHJhbnNmZXJzGAEgAygLMg8uc3BhcmsuVHJhbnNmZXJSCXRyYW5zZmVycxIWCgZvZmZzZXQYAiABKANSBm9mZnNldCKVAgoRQ2xhaW1MZWFmS2V5VHdlYWsSFwoHbGVhZl9pZBgBIAEoCVIGbGVhZklkEkAKEnNlY3JldF9zaGFyZV90d2VhaxgCIAEoCzISLnNwYXJrLlNlY3JldFNoYXJlUhBzZWNyZXRTaGFyZVR3ZWFrEl8KE3B1YmtleV9zaGFyZXNfdHdlYWsYAyADKAsyLy5zcGFyay5DbGFpbUxlYWZLZXlUd2Vhay5QdWJrZXlTaGFyZXNUd2Vha0VudHJ5UhFwdWJrZXlTaGFyZXNUd2VhaxpEChZQdWJrZXlTaGFyZXNUd2Vha0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgMUgV2YWx1ZToCOAEiwQEKHUNsYWltVHJhbnNmZXJUd2Vha0tleXNSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSRAoRbGVhdmVzX3RvX3JlY2VpdmUYAyADKAsyGC5zcGFyay5DbGFpbUxlYWZLZXlUd2Vha1IPbGVhdmVzVG9SZWNlaXZlIsUBCh9DbGFpbVRyYW5zZmVyU2lnblJlZnVuZHNSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSQAoMc2lnbmluZ19qb2JzGAMgAygLMh0uc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ0pvYlILc2lnbmluZ0pvYnNKBAgEEAUibQogQ2xhaW1UcmFuc2ZlclNpZ25SZWZ1bmRzUmVzcG9uc2USSQoPc2lnbmluZ19yZXN1bHRzGAEgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi9wEKGVN0b3JlUHJlaW1hZ2VTaGFyZVJlcXVlc3QSIQoMcGF5bWVudF9oYXNoGAEgASgMUgtwYXltZW50SGFzaBI5Cg5wcmVpbWFnZV9zaGFyZRgCIAEoCzISLnNwYXJrLlNlY3JldFNoYXJlUg1wcmVpbWFnZVNoYXJlEhwKCXRocmVzaG9sZBgDIAEoDVIJdGhyZXNob2xkEiUKDmludm9pY2Vfc3RyaW5nGAQgASgJUg1pbnZvaWNlU3RyaW5nEjcKGHVzZXJfaWRlbnRpdHlfcHVibGljX2tleRgFIAEoDFIVdXNlcklkZW50aXR5UHVibGljS2V5IoECChtSZXF1ZXN0ZWRTaWduaW5nQ29tbWl0bWVudHMSewoZc2lnbmluZ19ub25jZV9jb21taXRtZW50cxgBIAMoCzI/LnNwYXJrLlJlcXVlc3RlZFNpZ25pbmdDb21taXRtZW50cy5TaWduaW5nTm9uY2VDb21taXRtZW50c0VudHJ5UhdzaWduaW5nTm9uY2VDb21taXRtZW50cxplChxTaWduaW5nTm9uY2VDb21taXRtZW50c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ei8KBXZhbHVlGAIgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UgV2YWx1ZToCOAEiTwocR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVxdWVzdBIZCghub2RlX2lkcxgBIAMoCVIHbm9kZUlkcxIUCgVjb3VudBgCIAEoDVIFY291bnQidAodR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVzcG9uc2USUwoTc2lnbmluZ19jb21taXRtZW50cxgBIAMoCzIiLnNwYXJrLlJlcXVlc3RlZFNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzItoBChJTaWduaW5nQ29tbWl0bWVudHMSYgoTc2lnbmluZ19jb21taXRtZW50cxgBIAMoCzIxLnNwYXJrLlNpZ25pbmdDb21taXRtZW50cy5TaWduaW5nQ29tbWl0bWVudHNFbnRyeVISc2lnbmluZ0NvbW1pdG1lbnRzGmAKF1NpZ25pbmdDb21taXRtZW50c0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ei8KBXZhbHVlGAIgASgLMhkuY29tbW9uLlNpZ25pbmdDb21taXRtZW50UgV2YWx1ZToCOAEixgIKEFVzZXJTaWduZWRSZWZ1bmQSFwoHbm9kZV9pZBgBIAEoCVIGbm9kZUlkEhsKCXJlZnVuZF90eBgCIAEoDFIIcmVmdW5kVHgSJQoOdXNlcl9zaWduYXR1cmUYAyABKAxSDXVzZXJTaWduYXR1cmUSSgoTc2lnbmluZ19jb21taXRtZW50cxgEIAEoCzIZLnNwYXJrLlNpZ25pbmdDb21taXRtZW50c1ISc2lnbmluZ0NvbW1pdG1lbnRzElUKGXVzZXJfc2lnbmF0dXJlX2NvbW1pdG1lbnQYBSABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSF3VzZXJTaWduYXR1cmVDb21taXRtZW50EjIKB25ldHdvcmsYBiABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yayI7ChJJbnZvaWNlQW1vdW50UHJvb2YSJQoOYm9sdDExX2ludm9pY2UYASABKAlSDWJvbHQxMUludm9pY2UiewoNSW52b2ljZUFtb3VudBIdCgp2YWx1ZV9zYXRzGAEgASgEUgl2YWx1ZVNhdHMSSwoUaW52b2ljZV9hbW91bnRfcHJvb2YYAiABKAsyGS5zcGFyay5JbnZvaWNlQW1vdW50UHJvb2ZSEmludm9pY2VBbW91bnRQcm9vZiLWAwobSW5pdGlhdGVQcmVpbWFnZVN3YXBSZXF1ZXN0EiEKDHBheW1lbnRfaGFzaBgBIAEoDFILcGF5bWVudEhhc2gSOwoOaW52b2ljZV9hbW91bnQYAiABKAsyFC5zcGFyay5JbnZvaWNlQW1vdW50Ug1pbnZvaWNlQW1vdW50EkEKBnJlYXNvbhgDIAEoDjIpLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVxdWVzdC5SZWFzb25SBnJlYXNvbhJBCgh0cmFuc2ZlchgEIAEoCzIlLnNwYXJrLlN0YXJ0VXNlclNpZ25lZFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISPwoccmVjZWl2ZXJfaWRlbnRpdHlfcHVibGljX2tleRgFIAEoDFIZcmVjZWl2ZXJJZGVudGl0eVB1YmxpY0tleRIZCghmZWVfc2F0cxgGIAEoBFIHZmVlU2F0cxJGChB0cmFuc2Zlcl9yZXF1ZXN0GAcgASgLMhsuc3BhcmsuU3RhcnRUcmFuc2ZlclJlcXVlc3RSD3RyYW5zZmVyUmVxdWVzdCItCgZSZWFzb24SDwoLUkVBU09OX1NFTkQQABISCg5SRUFTT05fUkVDRUlWRRABImcKHEluaXRpYXRlUHJlaW1hZ2VTd2FwUmVzcG9uc2USGgoIcHJlaW1hZ2UYASABKAxSCHByZWltYWdlEisKCHRyYW5zZmVyGAIgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIjIKCE91dFBvaW50EhIKBHR4aWQYASABKAxSBHR4aWQSEgoEdm91dBgCIAEoDVIEdm91dCKHAQoWQ29vcGVyYXRpdmVFeGl0UmVxdWVzdBI3Cgh0cmFuc2ZlchgBIAEoCzIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ugh0cmFuc2ZlchIXCgdleGl0X2lkGAIgASgJUgZleGl0SWQSGwoJZXhpdF90eGlkGAMgASgMUghleGl0VHhpZCKRAQoXQ29vcGVyYXRpdmVFeGl0UmVzcG9uc2USKwoIdHJhbnNmZXIYASABKAsyDy5zcGFyay5UcmFuc2ZlclIIdHJhbnNmZXISSQoPc2lnbmluZ19yZXN1bHRzGAIgAygLMiAuc3BhcmsuTGVhZlJlZnVuZFR4U2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMioAIKFkNvdW50ZXJMZWFmU3dhcFJlcXVlc3QSNwoIdHJhbnNmZXIYASABKAsyGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISFwoHc3dhcF9pZBgCIAEoCVIGc3dhcElkEiwKEmFkYXB0b3JfcHVibGljX2tleRgDIAEoDFIQYWRhcHRvclB1YmxpY0tleRI5ChlkaXJlY3RfYWRhcHRvcl9wdWJsaWNfa2V5GAQgASgMUhZkaXJlY3RBZGFwdG9yUHVibGljS2V5EksKI2RpcmVjdF9mcm9tX2NwZnBfYWRhcHRvcl9wdWJsaWNfa2V5GAUgASgMUh5kaXJlY3RGcm9tQ3BmcEFkYXB0b3JQdWJsaWNLZXkikQEKF0NvdW50ZXJMZWFmU3dhcFJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyEkkKD3NpZ25pbmdfcmVzdWx0cxgCIAMoCzIgLnNwYXJrLkxlYWZSZWZ1bmRUeFNpZ25pbmdSZXN1bHRSDnNpZ25pbmdSZXN1bHRzIqIBChZSZWZyZXNoVGltZWxvY2tSZXF1ZXN0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EjQKDHNpZ25pbmdfam9icxgDIAMoCzIRLnNwYXJrLlNpZ25pbmdKb2JSC3NpZ25pbmdKb2JzIoABChxSZWZyZXNoVGltZWxvY2tTaWduaW5nUmVzdWx0EjsKDnNpZ25pbmdfcmVzdWx0GAEgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFINc2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAIgASgMUgx2ZXJpZnlpbmdLZXkiZwoXUmVmcmVzaFRpbWVsb2NrUmVzcG9uc2USTAoPc2lnbmluZ19yZXN1bHRzGAEgAygLMiMuc3BhcmsuUmVmcmVzaFRpbWVsb2NrU2lnbmluZ1Jlc3VsdFIOc2lnbmluZ1Jlc3VsdHMi9gMKEUV4dGVuZExlYWZSZXF1ZXN0EhcKB2xlYWZfaWQYASABKAlSBmxlYWZJZBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EkAKE25vZGVfdHhfc2lnbmluZ19qb2IYAyABKAsyES5zcGFyay5TaWduaW5nSm9iUhBub2RlVHhTaWduaW5nSm9iEkQKFXJlZnVuZF90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEnJlZnVuZFR4U2lnbmluZ0pvYhJNChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgFIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgHIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iInsKF0V4dGVuZExlYWZTaWduaW5nUmVzdWx0EjsKDnNpZ25pbmdfcmVzdWx0GAEgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFINc2lnbmluZ1Jlc3VsdBIjCg12ZXJpZnlpbmdfa2V5GAIgASgMUgx2ZXJpZnlpbmdLZXkimwQKEkV4dGVuZExlYWZSZXNwb25zZRIXCgdsZWFmX2lkGAEgASgJUgZsZWFmSWQSUwoWbm9kZV90eF9zaWduaW5nX3Jlc3VsdBgCIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UhNub2RlVHhTaWduaW5nUmVzdWx0ElcKGHJlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgDIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSYAodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBCABKAsyHi5zcGFyay5FeHRlbmRMZWFmU2lnbmluZ1Jlc3VsdFIZZGlyZWN0Tm9kZVR4U2lnbmluZ1Jlc3VsdBJkCh9kaXJlY3RfcmVmdW5kX3R4X3NpZ25pbmdfcmVzdWx0GAUgASgLMh4uc3BhcmsuRXh0ZW5kTGVhZlNpZ25pbmdSZXN1bHRSG2RpcmVjdFJlZnVuZFR4U2lnbmluZ1Jlc3VsdBJ2CilkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX3Jlc3VsdBgGIAEoCzIeLnNwYXJrLkV4dGVuZExlYWZTaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCJzChJBZGRyZXNzUmVxdWVzdE5vZGUSJgoPdXNlcl9wdWJsaWNfa2V5GAEgASgMUg11c2VyUHVibGljS2V5EjUKCGNoaWxkcmVuGAIgAygLMhkuc3BhcmsuQWRkcmVzc1JlcXVlc3ROb2RlUghjaGlsZHJlbiKDAgoZUHJlcGFyZVRyZWVBZGRyZXNzUmVxdWVzdBJBChJwYXJlbnRfbm9kZV9vdXRwdXQYASABKAsyES5zcGFyay5Ob2RlT3V0cHV0SABSEHBhcmVudE5vZGVPdXRwdXQSMQoNb25fY2hhaW5fdXR4bxgCIAEoCzILLnNwYXJrLlVUWE9IAFILb25DaGFpblV0eG8SLQoEbm9kZRgDIAEoCzIZLnNwYXJrLkFkZHJlc3NSZXF1ZXN0Tm9kZVIEbm9kZRI3Chh1c2VyX2lkZW50aXR5X3B1YmxpY19rZXkYBCABKAxSFXVzZXJJZGVudGl0eVB1YmxpY0tleUIICgZzb3VyY2UiZwoLQWRkcmVzc05vZGUSKAoHYWRkcmVzcxgBIAEoCzIOLnNwYXJrLkFkZHJlc3NSB2FkZHJlc3MSLgoIY2hpbGRyZW4YAiADKAsyEi5zcGFyay5BZGRyZXNzTm9kZVIIY2hpbGRyZW4iRAoaUHJlcGFyZVRyZWVBZGRyZXNzUmVzcG9uc2USJgoEbm9kZRgBIAEoCzISLnNwYXJrLkFkZHJlc3NOb2RlUgRub2RlIs4DCgxDcmVhdGlvbk5vZGUSQAoTbm9kZV90eF9zaWduaW5nX2pvYhgBIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSEG5vZGVUeFNpZ25pbmdKb2ISRAoVcmVmdW5kX3R4X3NpZ25pbmdfam9iGAIgASgLMhEuc3BhcmsuU2lnbmluZ0pvYlIScmVmdW5kVHhTaWduaW5nSm9iEi8KCGNoaWxkcmVuGAMgAygLMhMuc3BhcmsuQ3JlYXRpb25Ob2RlUghjaGlsZHJlbhJNChpkaXJlY3Rfbm9kZV90eF9zaWduaW5nX2pvYhgEIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSFmRpcmVjdE5vZGVUeFNpZ25pbmdKb2ISUQocZGlyZWN0X3JlZnVuZF90eF9zaWduaW5nX2pvYhgFIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSGGRpcmVjdFJlZnVuZFR4U2lnbmluZ0pvYhJjCiZkaXJlY3RfZnJvbV9jcGZwX3JlZnVuZF90eF9zaWduaW5nX2pvYhgGIAEoCzIRLnNwYXJrLlNpZ25pbmdKb2JSIGRpcmVjdEZyb21DcGZwUmVmdW5kVHhTaWduaW5nSm9iIvUBChFDcmVhdGVUcmVlUmVxdWVzdBJBChJwYXJlbnRfbm9kZV9vdXRwdXQYASABKAsyES5zcGFyay5Ob2RlT3V0cHV0SABSEHBhcmVudE5vZGVPdXRwdXQSMQoNb25fY2hhaW5fdXR4bxgCIAEoCzILLnNwYXJrLlVUWE9IAFILb25DaGFpblV0eG8SJwoEbm9kZRgDIAEoCzITLnNwYXJrLkNyZWF0aW9uTm9kZVIEbm9kZRI3Chh1c2VyX2lkZW50aXR5X3B1YmxpY19rZXkYBCABKAxSFXVzZXJJZGVudGl0eVB1YmxpY0tleUIICgZzb3VyY2UipAQKFENyZWF0aW9uUmVzcG9uc2VOb2RlEhcKB25vZGVfaWQYASABKAlSBm5vZGVJZBJJChZub2RlX3R4X3NpZ25pbmdfcmVzdWx0GAIgASgLMhQuc3BhcmsuU2lnbmluZ1Jlc3VsdFITbm9kZVR4U2lnbmluZ1Jlc3VsdBJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYAyABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSNwoIY2hpbGRyZW4YBCADKAsyGy5zcGFyay5DcmVhdGlvblJlc3BvbnNlTm9kZVIIY2hpbGRyZW4SVgodZGlyZWN0X25vZGVfdHhfc2lnbmluZ19yZXN1bHQYBSABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhlkaXJlY3ROb2RlVHhTaWduaW5nUmVzdWx0EloKH2RpcmVjdF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYBiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhtkaXJlY3RSZWZ1bmRUeFNpZ25pbmdSZXN1bHQSbAopZGlyZWN0X2Zyb21fY3BmcF9yZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYByABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UiNkaXJlY3RGcm9tQ3BmcFJlZnVuZFR4U2lnbmluZ1Jlc3VsdCJFChJDcmVhdGVUcmVlUmVzcG9uc2USLwoEbm9kZRgBIAEoCzIbLnNwYXJrLkNyZWF0aW9uUmVzcG9uc2VOb2RlUgRub2RlIoQBChNTaWduaW5nT3BlcmF0b3JJbmZvEhQKBWluZGV4GAEgASgEUgVpbmRleBIeCgppZGVudGlmaWVyGAIgASgJUgppZGVudGlmaWVyEh0KCnB1YmxpY19rZXkYAyABKAxSCXB1YmxpY0tleRIYCgdhZGRyZXNzGAQgASgJUgdhZGRyZXNzIusBCh5HZXRTaWduaW5nT3BlcmF0b3JMaXN0UmVzcG9uc2USaAoRc2lnbmluZ19vcGVyYXRvcnMYASADKAsyOy5zcGFyay5HZXRTaWduaW5nT3BlcmF0b3JMaXN0UmVzcG9uc2UuU2lnbmluZ09wZXJhdG9yc0VudHJ5UhBzaWduaW5nT3BlcmF0b3JzGl8KFVNpZ25pbmdPcGVyYXRvcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIwCgV2YWx1ZRgCIAEoCzIaLnNwYXJrLlNpZ25pbmdPcGVyYXRvckluZm9SBXZhbHVlOgI4ASJyCh1RdWVyeVVzZXJTaWduZWRSZWZ1bmRzUmVxdWVzdBIhCgxwYXltZW50X2hhc2gYASABKAxSC3BheW1lbnRIYXNoEi4KE2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxSEWlkZW50aXR5UHVibGljS2V5IpwBCh5RdWVyeVVzZXJTaWduZWRSZWZ1bmRzUmVzcG9uc2USRwoTdXNlcl9zaWduZWRfcmVmdW5kcxgBIAMoCzIXLnNwYXJrLlVzZXJTaWduZWRSZWZ1bmRSEXVzZXJTaWduZWRSZWZ1bmRzEisKCHRyYW5zZmVyGAMgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVySgQIAhADIqQDChtQcmVpbWFnZVJlcXVlc3RXaXRoVHJhbnNmZXISKgoMcGF5bWVudF9oYXNoGAEgASgMQgf6QgR6AmggUgtwYXltZW50SGFzaBJBChhyZWNlaXZlcl9pZGVudGl0eV9wdWJrZXkYAiABKAxCB/pCBHoCaCFSFnJlY2VpdmVySWRlbnRpdHlQdWJrZXkSNAoGc3RhdHVzGAMgASgOMhwuc3BhcmsuUHJlaW1hZ2VSZXF1ZXN0U3RhdHVzUgZzdGF0dXMSPQoMY3JlYXRlZF90aW1lGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFILY3JlYXRlZFRpbWUSMAoIdHJhbnNmZXIYBSABKAsyDy5zcGFyay5UcmFuc2ZlckgAUgh0cmFuc2ZlcogBARIfCghwcmVpbWFnZRgGIAEoDEgBUghwcmVpbWFnZYgBARI0ChZzZW5kZXJfaWRlbnRpdHlfcHVia2V5GAcgASgMUhRzZW5kZXJJZGVudGl0eVB1YmtleUILCglfdHJhbnNmZXJCCwoJX3ByZWltYWdlIsQCChBRdWVyeUh0bGNSZXF1ZXN0EiUKDnBheW1lbnRfaGFzaGVzGAEgAygMUg1wYXltZW50SGFzaGVzEjcKE2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSEWlkZW50aXR5UHVibGljS2V5EjkKBnN0YXR1cxgDIAEoDjIcLnNwYXJrLlByZWltYWdlUmVxdWVzdFN0YXR1c0gAUgZzdGF0dXOIAQESFAoFbGltaXQYBCABKANSBWxpbWl0EhYKBm9mZnNldBgFIAEoA1IGb2Zmc2V0EiEKDHRyYW5zZmVyX2lkcxgGIAMoCVILdHJhbnNmZXJJZHMSOQoKbWF0Y2hfcm9sZRgHIAEoDjIaLnNwYXJrLlByZWltYWdlUmVxdWVzdFJvbGVSCW1hdGNoUm9sZUIJCgdfc3RhdHVzInwKEVF1ZXJ5SHRsY1Jlc3BvbnNlEk8KEXByZWltYWdlX3JlcXVlc3RzGAEgAygLMiIuc3BhcmsuUHJlaW1hZ2VSZXF1ZXN0V2l0aFRyYW5zZmVyUhBwcmVpbWFnZVJlcXVlc3RzEhYKBm9mZnNldBgCIAEoA1IGb2Zmc2V0IocBChZQcm92aWRlUHJlaW1hZ2VSZXF1ZXN0EiEKDHBheW1lbnRfaGFzaBgBIAEoDFILcGF5bWVudEhhc2gSGgoIcHJlaW1hZ2UYAiABKAxSCHByZWltYWdlEi4KE2lkZW50aXR5X3B1YmxpY19rZXkYAyABKAxSEWlkZW50aXR5UHVibGljS2V5IkYKF1Byb3ZpZGVQcmVpbWFnZVJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIigKC1RyZWVOb2RlSWRzEhkKCG5vZGVfaWRzGAEgAygJUgdub2RlSWRzIrgCChFRdWVyeU5vZGVzUmVxdWVzdBI0ChVvd25lcl9pZGVudGl0eV9wdWJrZXkYASABKAxIAFITb3duZXJJZGVudGl0eVB1YmtleRIvCghub2RlX2lkcxgCIAEoCzISLnNwYXJrLlRyZWVOb2RlSWRzSABSB25vZGVJZHMSJwoPaW5jbHVkZV9wYXJlbnRzGAMgASgIUg5pbmNsdWRlUGFyZW50cxIUCgVsaW1pdBgEIAEoA1IFbGltaXQSFgoGb2Zmc2V0GAUgASgDUgZvZmZzZXQSKAoHbmV0d29yaxgGIAEoDjIOLnNwYXJrLk5ldHdvcmtSB25ldHdvcmsSMQoIc3RhdHVzZXMYByADKA4yFS5zcGFyay5UcmVlTm9kZVN0YXR1c1IIc3RhdHVzZXNCCAoGc291cmNlIrMBChJRdWVyeU5vZGVzUmVzcG9uc2USOgoFbm9kZXMYASADKAsyJC5zcGFyay5RdWVyeU5vZGVzUmVzcG9uc2UuTm9kZXNFbnRyeVIFbm9kZXMSFgoGb2Zmc2V0GAIgASgDUgZvZmZzZXQaSQoKTm9kZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIlCgV2YWx1ZRgCIAEoCzIPLnNwYXJrLlRyZWVOb2RlUgV2YWx1ZToCOAEidQoVQ2FuY2VsVHJhbnNmZXJSZXF1ZXN0Eh8KC3RyYW5zZmVyX2lkGAEgASgJUgp0cmFuc2ZlcklkEjsKGnNlbmRlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMUhdzZW5kZXJJZGVudGl0eVB1YmxpY0tleSJFChZDYW5jZWxUcmFuc2ZlclJlc3BvbnNlEisKCHRyYW5zZmVyGAEgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyIqwBCiJRdWVyeVVudXNlZERlcG9zaXRBZGRyZXNzZXNSZXF1ZXN0Ei4KE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSEWlkZW50aXR5UHVibGljS2V5EigKB25ldHdvcmsYAiABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEhQKBWxpbWl0GAMgASgDUgVsaW1pdBIWCgZvZmZzZXQYBCABKANSBm9mZnNldCLuAQoiUXVlcnlTdGF0aWNEZXBvc2l0QWRkcmVzc2VzUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIoCgduZXR3b3JrGAIgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yaxIUCgVsaW1pdBgEIAEoA1IFbGltaXQSFgoGb2Zmc2V0GAUgASgDUgZvZmZzZXQSLAoPZGVwb3NpdF9hZGRyZXNzGAYgASgJSABSDmRlcG9zaXRBZGRyZXNziAEBQhIKEF9kZXBvc2l0X2FkZHJlc3MiygIKGURlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHQSJwoPZGVwb3NpdF9hZGRyZXNzGAEgASgJUg5kZXBvc2l0QWRkcmVzcxI1Chd1c2VyX3NpZ25pbmdfcHVibGljX2tleRgCIAEoDFIUdXNlclNpZ25pbmdQdWJsaWNLZXkSMAoUdmVyaWZ5aW5nX3B1YmxpY19rZXkYAyABKAxSEnZlcmlmeWluZ1B1YmxpY0tleRImCgdsZWFmX2lkGAQgASgJQgj6QgVyA7ABAUgAUgZsZWFmSWSIAQESTwoTcHJvb2Zfb2ZfcG9zc2Vzc2lvbhgFIAEoCzIaLnNwYXJrLkRlcG9zaXRBZGRyZXNzUHJvb2ZIAVIRcHJvb2ZPZlBvc3Nlc3Npb26IAQFCCgoIX2xlYWZfaWRCFgoUX3Byb29mX29mX3Bvc3Nlc3Npb24ijAEKI1F1ZXJ5VW51c2VkRGVwb3NpdEFkZHJlc3Nlc1Jlc3BvbnNlEk0KEWRlcG9zaXRfYWRkcmVzc2VzGAEgAygLMiAuc3BhcmsuRGVwb3NpdEFkZHJlc3NRdWVyeVJlc3VsdFIQZGVwb3NpdEFkZHJlc3NlcxIWCgZvZmZzZXQYAiABKANSBm9mZnNldCJ0CiNRdWVyeVN0YXRpY0RlcG9zaXRBZGRyZXNzZXNSZXNwb25zZRJNChFkZXBvc2l0X2FkZHJlc3NlcxgBIAMoCzIgLnNwYXJrLkRlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHRSEGRlcG9zaXRBZGRyZXNzZXMibwoTUXVlcnlCYWxhbmNlUmVxdWVzdBIuChNpZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhFpZGVudGl0eVB1YmxpY0tleRIoCgduZXR3b3JrGAIgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yayLFAQoUUXVlcnlCYWxhbmNlUmVzcG9uc2USGAoHYmFsYW5jZRgBIAEoBFIHYmFsYW5jZRJSCg1ub2RlX2JhbGFuY2VzGAIgAygLMi0uc3BhcmsuUXVlcnlCYWxhbmNlUmVzcG9uc2UuTm9kZUJhbGFuY2VzRW50cnlSDG5vZGVCYWxhbmNlcxo/ChFOb2RlQmFsYW5jZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoBFIFdmFsdWU6AjgBIsUBCgxTcGFya0FkZHJlc3MSLgoTaWRlbnRpdHlfcHVibGljX2tleRgBIAEoDFIRaWRlbnRpdHlQdWJsaWNLZXkSSwoUc3BhcmtfaW52b2ljZV9maWVsZHMYAiABKAsyGS5zcGFyay5TcGFya0ludm9pY2VGaWVsZHNSEnNwYXJrSW52b2ljZUZpZWxkcxIqCglzaWduYXR1cmUYAyABKAxCB/pCBHoCaEBIAFIJc2lnbmF0dXJliAEBQgwKCl9zaWduYXR1cmUinAMKElNwYXJrSW52b2ljZUZpZWxkcxIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEhcKAmlkGAIgASgMQgf6QgR6AmgQUgJpZBI9Cg50b2tlbnNfcGF5bWVudBgDIAEoCzIULnNwYXJrLlRva2Vuc1BheW1lbnRIAFINdG9rZW5zUGF5bWVudBI3CgxzYXRzX3BheW1lbnQYBCABKAsyEi5zcGFyay5TYXRzUGF5bWVudEgAUgtzYXRzUGF5bWVudBIgCgRtZW1vGAUgASgJQgf6QgRyAih4SAFSBG1lbW+IAQESOAoRc2VuZGVyX3B1YmxpY19rZXkYBiABKAxCB/pCBHoCaCFIAlIPc2VuZGVyUHVibGljS2V5iAEBEkAKC2V4cGlyeV90aW1lGAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgDUgpleHBpcnlUaW1liAEBQg4KDHBheW1lbnRfdHlwZUIHCgVfbWVtb0IUChJfc2VuZGVyX3B1YmxpY19rZXlCDgoMX2V4cGlyeV90aW1lIjUKC1NhdHNQYXltZW50EhsKBmFtb3VudBgBIAEoBEgAUgZhbW91bnSIAQFCCQoHX2Ftb3VudCKOAQoNVG9rZW5zUGF5bWVudBI3ChB0b2tlbl9pZGVudGlmaWVyGAEgASgMQgf6QgR6AmggSABSD3Rva2VuSWRlbnRpZmllcogBARIkCgZhbW91bnQYAiABKAxCB/pCBHoCGBBIAVIGYW1vdW50iAEBQhMKEV90b2tlbl9pZGVudGlmaWVyQgkKB19hbW91bnQixgEKJkluaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXF1ZXN0Ei8KDW9uX2NoYWluX3V0eG8YASABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxJEChVyZWZ1bmRfdHhfc2lnbmluZ19qb2IYAyABKAsyES5zcGFyay5TaWduaW5nSm9iUhJyZWZ1bmRUeFNpZ25pbmdKb2ISJQoOdXNlcl9zaWduYXR1cmUYBCABKAxSDXVzZXJTaWduYXR1cmUiwwEKJ0luaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXNwb25zZRJNChhyZWZ1bmRfdHhfc2lnbmluZ19yZXN1bHQYASABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0UhVyZWZ1bmRUeFNpZ25pbmdSZXN1bHQSSQoPZGVwb3NpdF9hZGRyZXNzGAIgASgLMiAuc3BhcmsuRGVwb3NpdEFkZHJlc3NRdWVyeVJlc3VsdFIOZGVwb3NpdEFkZHJlc3MisAMKF0luaXRpYXRlVXR4b1N3YXBSZXF1ZXN0Ei8KDW9uX2NoYWluX3V0eG8YASABKAsyCy5zcGFyay5VVFhPUgtvbkNoYWluVXR4bxI9CgxyZXF1ZXN0X3R5cGUYAiABKA4yGi5zcGFyay5VdHhvU3dhcFJlcXVlc3RUeXBlUgtyZXF1ZXN0VHlwZRIuChJjcmVkaXRfYW1vdW50X3NhdHMYAyABKARIAFIQY3JlZGl0QW1vdW50U2F0cxIiCgxtYXhfZmVlX3NhdHMYBCABKARIAFIKbWF4RmVlU2F0cxIjCg1zc3Bfc2lnbmF0dXJlGAUgASgMUgxzc3BTaWduYXR1cmUSJQoOdXNlcl9zaWduYXR1cmUYBiABKAxSDXVzZXJTaWduYXR1cmUSNwoIdHJhbnNmZXIYByABKAsyGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdFIIdHJhbnNmZXISQgoUc3BlbmRfdHhfc2lnbmluZ19qb2IYCCABKAsyES5zcGFyay5TaWduaW5nSm9iUhFzcGVuZFR4U2lnbmluZ0pvYkIICgZhbW91bnQi3wEKGEluaXRpYXRlVXR4b1N3YXBSZXNwb25zZRJLChdzcGVuZF90eF9zaWduaW5nX3Jlc3VsdBgBIAEoCzIULnNwYXJrLlNpZ25pbmdSZXN1bHRSFHNwZW5kVHhTaWduaW5nUmVzdWx0EisKCHRyYW5zZmVyGAIgASgLMg8uc3BhcmsuVHJhbnNmZXJSCHRyYW5zZmVyEkkKD2RlcG9zaXRfYWRkcmVzcxgDIAEoCzIgLnNwYXJrLkRlcG9zaXRBZGRyZXNzUXVlcnlSZXN1bHRSDmRlcG9zaXRBZGRyZXNzIosBCgtFeGl0aW5nVHJlZRIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSUQoXdXNlcl9zaWduaW5nX2NvbW1pdG1lbnQYAiABKAsyGS5jb21tb24uU2lnbmluZ0NvbW1pdG1lbnRSFXVzZXJTaWduaW5nQ29tbWl0bWVudBIQCgN2aW4YAyABKA1SA3ZpbiKcAQofRXhpdFNpbmdsZU5vZGVUcmVlU2lnbmluZ1Jlc3VsdBIXCgd0cmVlX2lkGAEgASgJUgZ0cmVlSWQSOwoOc2lnbmluZ19yZXN1bHQYAiABKAsyFC5zcGFyay5TaWduaW5nUmVzdWx0Ug1zaWduaW5nUmVzdWx0EiMKDXZlcmlmeWluZ19rZXkYAyABKAxSDHZlcmlmeWluZ0tleSJNChhCaXRjb2luVHJhbnNhY3Rpb25PdXRwdXQSFAoFdmFsdWUYASABKANSBXZhbHVlEhsKCXBrX3NjcmlwdBgCIAEoDFIIcGtTY3JpcHQi8wEKGkV4aXRTaW5nbGVOb2RlVHJlZXNSZXF1ZXN0EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkSNwoNZXhpdGluZ190cmVlcxgCIAMoCzISLnNwYXJrLkV4aXRpbmdUcmVlUgxleGl0aW5nVHJlZXMSFQoGcmF3X3R4GAMgASgMUgVyYXdUeBJKChBwcmV2aW91c19vdXRwdXRzGAQgAygLMh8uc3BhcmsuQml0Y29pblRyYW5zYWN0aW9uT3V0cHV0Ug9wcmV2aW91c091dHB1dHMibgobRXhpdFNpbmdsZU5vZGVUcmVlc1Jlc3BvbnNlEk8KD3NpZ25pbmdfcmVzdWx0cxgBIAMoCzImLnNwYXJrLkV4aXRTaW5nbGVOb2RlVHJlZVNpZ25pbmdSZXN1bHRSDnNpZ25pbmdSZXN1bHRzIloKHVF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXF1ZXN0EjkKGW93bmVyX2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxSFm93bmVySWRlbnRpdHlQdWJsaWNLZXkizwEKHlF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXNwb25zZRJoChFub2RlX2Rpc3RyaWJ1dGlvbhgBIAMoCzI7LnNwYXJrLlF1ZXJ5Tm9kZXNEaXN0cmlidXRpb25SZXNwb25zZS5Ob2RlRGlzdHJpYnV0aW9uRW50cnlSEG5vZGVEaXN0cmlidXRpb24aQwoVTm9kZURpc3RyaWJ1dGlvbkVudHJ5EhAKA2tleRgBIAEoBFIDa2V5EhQKBXZhbHVlGAIgASgEUgV2YWx1ZToCOAEimQEKGFF1ZXJ5Tm9kZXNCeVZhbHVlUmVxdWVzdBI5Chlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMUhZvd25lcklkZW50aXR5UHVibGljS2V5EhQKBXZhbHVlGAIgASgDUgV2YWx1ZRIWCgZvZmZzZXQYAyABKANSBm9mZnNldBIUCgVsaW1pdBgEIAEoA1IFbGltaXQiwQEKGVF1ZXJ5Tm9kZXNCeVZhbHVlUmVzcG9uc2USQQoFbm9kZXMYASADKAsyKy5zcGFyay5RdWVyeU5vZGVzQnlWYWx1ZVJlc3BvbnNlLk5vZGVzRW50cnlSBW5vZGVzEhYKBm9mZnNldBgCIAEoA1IGb2Zmc2V0GkkKCk5vZGVzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSJQoFdmFsdWUYAiABKAsyDy5zcGFyay5UcmVlTm9kZVIFdmFsdWU6AjgBIrYBChlHZXRVdHhvc0ZvckFkZHJlc3NSZXF1ZXN0EhgKB2FkZHJlc3MYASABKAlSB2FkZHJlc3MSFgoGb2Zmc2V0GAIgASgEUgZvZmZzZXQSFAoFbGltaXQYAyABKARSBWxpbWl0EigKB25ldHdvcmsYBCABKA4yDi5zcGFyay5OZXR3b3JrUgduZXR3b3JrEicKD2V4Y2x1ZGVfY2xhaW1lZBgFIAEoCFIOZXhjbHVkZUNsYWltZWQiVwoaR2V0VXR4b3NGb3JBZGRyZXNzUmVzcG9uc2USIQoFdXR4b3MYASADKAsyCy5zcGFyay5VVFhPUgV1dHhvcxIWCgZvZmZzZXQYAiABKARSBm9mZnNldCJjChlRdWVyeVNwYXJrSW52b2ljZXNSZXF1ZXN0EhQKBWxpbWl0GAEgASgDUgVsaW1pdBIWCgZvZmZzZXQYAiABKANSBm9mZnNldBIYCgdpbnZvaWNlGAMgAygJUgdpbnZvaWNlIncKGlF1ZXJ5U3BhcmtJbnZvaWNlc1Jlc3BvbnNlEhYKBm9mZnNldBgBIAEoA1IGb2Zmc2V0EkEKEGludm9pY2Vfc3RhdHVzZXMYAiADKAsyFi5zcGFyay5JbnZvaWNlUmVzcG9uc2VSD2ludm9pY2VTdGF0dXNlcyLlAQoPSW52b2ljZVJlc3BvbnNlEhgKB2ludm9pY2UYASABKAlSB2ludm9pY2USLAoGc3RhdHVzGAIgASgOMhQuc3BhcmsuSW52b2ljZVN0YXR1c1IGc3RhdHVzEjoKDXNhdHNfdHJhbnNmZXIYAyABKAsyEy5zcGFyay5TYXRzVHJhbnNmZXJIAFIMc2F0c1RyYW5zZmVyEj0KDnRva2VuX3RyYW5zZmVyGAQgASgLMhQuc3BhcmsuVG9rZW5UcmFuc2ZlckgAUg10b2tlblRyYW5zZmVyQg8KDXRyYW5zZmVyX3R5cGUiOAoMU2F0c1RyYW5zZmVyEigKC3RyYW5zZmVyX2lkGAEgASgMQgf6QgR6AmgQUgp0cmFuc2ZlcklkIlkKDVRva2VuVHJhbnNmZXISSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgBIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaCKtAQoiSW5pdGlhdGVTd2FwUHJpbWFyeVRyYW5zZmVyUmVxdWVzdBI3Cgh0cmFuc2ZlchgBIAEoCzIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ugh0cmFuc2ZlchJOChNhZGFwdG9yX3B1YmxpY19rZXlzGAIgASgLMh4uc3BhcmsuQWRhcHRvclB1YmxpY0tleVBhY2thZ2VSEWFkYXB0b3JQdWJsaWNLZXlzIp0BCiNJbml0aWF0ZVN3YXBQcmltYXJ5VHJhbnNmZXJSZXNwb25zZRIrCgh0cmFuc2ZlchgBIAEoCzIPLnNwYXJrLlRyYW5zZmVyUgh0cmFuc2ZlchJJCg9zaWduaW5nX3Jlc3VsdHMYAiADKAsyIC5zcGFyay5MZWFmUmVmdW5kVHhTaWduaW5nUmVzdWx0Ug5zaWduaW5nUmVzdWx0cyLPAQoXQWRhcHRvclB1YmxpY0tleVBhY2thZ2USLAoSYWRhcHRvcl9wdWJsaWNfa2V5GAEgASgMUhBhZGFwdG9yUHVibGljS2V5EjkKGWRpcmVjdF9hZGFwdG9yX3B1YmxpY19rZXkYAiABKAxSFmRpcmVjdEFkYXB0b3JQdWJsaWNLZXkSSwojZGlyZWN0X2Zyb21fY3BmcF9hZGFwdG9yX3B1YmxpY19rZXkYAyABKAxSHmRpcmVjdEZyb21DcGZwQWRhcHRvclB1YmxpY0tleSLmAQoNV2FsbGV0U2V0dGluZxJCChlvd25lcl9pZGVudGl0eV9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUhZvd25lcklkZW50aXR5UHVibGljS2V5EicKD3ByaXZhdGVfZW5hYmxlZBgCIAEoCFIOcHJpdmF0ZUVuYWJsZWQSSQoabWFzdGVyX2lkZW50aXR5X3B1YmxpY19rZXkYAyABKAxCB/pCBHoCaCFIAFIXbWFzdGVySWRlbnRpdHlQdWJsaWNLZXmIAQFCHQobX21hc3Rlcl9pZGVudGl0eV9wdWJsaWNfa2V5IowCChpVcGRhdGVXYWxsZXRTZXR0aW5nUmVxdWVzdBIsCg9wcml2YXRlX2VuYWJsZWQYASABKAhIAVIOcHJpdmF0ZUVuYWJsZWSIAQESRAoec2V0X21hc3Rlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAIgASgMSABSGnNldE1hc3RlcklkZW50aXR5UHVibGljS2V5EkgKIGNsZWFyX21hc3Rlcl9pZGVudGl0eV9wdWJsaWNfa2V5GAMgASgISABSHGNsZWFyTWFzdGVySWRlbnRpdHlQdWJsaWNLZXlCHAoabWFzdGVyX2lkZW50aXR5X3B1YmxpY19rZXlCEgoQX3ByaXZhdGVfZW5hYmxlZCJaChtVcGRhdGVXYWxsZXRTZXR0aW5nUmVzcG9uc2USOwoOd2FsbGV0X3NldHRpbmcYASABKAsyFC5zcGFyay5XYWxsZXRTZXR0aW5nUg13YWxsZXRTZXR0aW5nIhsKGVF1ZXJ5V2FsbGV0U2V0dGluZ1JlcXVlc3QiWQoaUXVlcnlXYWxsZXRTZXR0aW5nUmVzcG9uc2USOwoOd2FsbGV0X3NldHRpbmcYASABKAsyFC5zcGFyay5XYWxsZXRTZXR0aW5nUg13YWxsZXRTZXR0aW5nKk0KB05ldHdvcmsSDwoLVU5TUEVDSUZJRUQQABILCgdNQUlOTkVUEAESCwoHUkVHVEVTVBACEgsKB1RFU1RORVQQAxIKCgZTSUdORVQQBCojCglEaXJlY3Rpb24SCAoETkVYVBAAEgwKCFBSRVZJT1VTEAEq/AMKDlRyYW5zZmVyU3RhdHVzEiQKIFRSQU5TRkVSX1NUQVRVU19TRU5ERVJfSU5JVElBVEVEEAASLAooVFJBTlNGRVJfU1RBVFVTX1NFTkRFUl9LRVlfVFdFQUtfUEVORElORxABEiYKIlRSQU5TRkVSX1NUQVRVU19TRU5ERVJfS0VZX1RXRUFLRUQQAhIoCiRUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfS0VZX1RXRUFLRUQQAxIqCiZUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfUkVGVU5EX1NJR05FRBAEEh0KGVRSQU5TRkVSX1NUQVRVU19DT01QTEVURUQQBRIbChdUUkFOU0ZFUl9TVEFUVVNfRVhQSVJFRBAGEhwKGFRSQU5TRkVSX1NUQVRVU19SRVRVUk5FRBAHEjAKLFRSQU5TRkVSX1NUQVRVU19TRU5ERVJfSU5JVElBVEVEX0NPT1JESU5BVE9SEAgSLQopVFJBTlNGRVJfU1RBVFVTX1JFQ0VJVkVSX0tFWV9UV0VBS19MT0NLRUQQCRIuCipUUkFOU0ZFUl9TVEFUVVNfUkVDRUlWRVJfS0VZX1RXRUFLX0FQUExJRUQQChItCilUUkFOU0ZFUl9TVEFUVVNfQVBQTFlJTkdfU0VOREVSX0tFWV9UV0VBSxALKpoBCgxUcmFuc2ZlclR5cGUSEQoNUFJFSU1BR0VfU1dBUBAAEhQKEENPT1BFUkFUSVZFX0VYSVQQARIMCghUUkFOU0ZFUhACEg0KCVVUWE9fU1dBUBADEggKBFNXQVAQHhIQCgxDT1VOVEVSX1NXQVAQKBITCg9QUklNQVJZX1NXQVBfVjMQBBITCg9DT1VOVEVSX1NXQVBfVjMQBSomCgVPcmRlchIOCgpERVNDRU5ESU5HEAASDQoJQVNDRU5ESU5HEAEqnAEKFVByZWltYWdlUmVxdWVzdFN0YXR1cxIwCixQUkVJTUFHRV9SRVFVRVNUX1NUQVRVU19XQUlUSU5HX0ZPUl9QUkVJTUFHRRAAEisKJ1BSRUlNQUdFX1JFUVVFU1RfU1RBVFVTX1BSRUlNQUdFX1NIQVJFRBABEiQKIFBSRUlNQUdFX1JFUVVFU1RfU1RBVFVTX1JFVFVSTkVEEAIqigEKE1ByZWltYWdlUmVxdWVzdFJvbGUSIgoeUFJFSU1BR0VfUkVRVUVTVF9ST0xFX1JFQ0VJVkVSEAASIAocUFJFSU1BR0VfUkVRVUVTVF9ST0xFX1NFTkRFUhABEi0KKVBSRUlNQUdFX1JFUVVFU1RfUk9MRV9SRUNFSVZFUl9BTkRfU0VOREVSEAIqOAoTVXR4b1N3YXBSZXF1ZXN0VHlwZRIJCgVGaXhlZBAAEgoKBk1heEZlZRABEgoKBlJlZnVuZBACKk4KDUludm9pY2VTdGF0dXMSDQoJTk9UX0ZPVU5EEAASCwoHUEVORElORxABEg0KCUZJTkFMSVpFRBACEgwKCFJFVFVSTkVEEAQiBAgDEAMqgwMKDlRyZWVOb2RlU3RhdHVzEh0KGVRSRUVfTk9ERV9TVEFUVVNfQ1JFQVRJTkcQABIeChpUUkVFX05PREVfU1RBVFVTX0FWQUlMQUJMRRABEiUKIVRSRUVfTk9ERV9TVEFUVVNfRlJPWkVOX0JZX0lTU1VFUhACEiQKIFRSRUVfTk9ERV9TVEFUVVNfVFJBTlNGRVJfTE9DS0VEEAMSIQodVFJFRV9OT0RFX1NUQVRVU19TUExJVF9MT0NLRUQQBBIdChlUUkVFX05PREVfU1RBVFVTX1NQTElUVEVEEAUSHwobVFJFRV9OT0RFX1NUQVRVU19BR0dSRUdBVEVEEAYSHQoZVFJFRV9OT0RFX1NUQVRVU19PTl9DSEFJThAHEiMKH1RSRUVfTk9ERV9TVEFUVVNfQUdHUkVHQVRFX0xPQ0sQCBIbChdUUkVFX05PREVfU1RBVFVTX0VYSVRFRBAJEiEKHVRSRUVfTk9ERV9TVEFUVVNfUkVORVdfTE9DS0VEEAoyxxkKDFNwYXJrU2VydmljZRJpChhnZW5lcmF0ZV9kZXBvc2l0X2FkZHJlc3MSJC5zcGFyay5HZW5lcmF0ZURlcG9zaXRBZGRyZXNzUmVxdWVzdBolLnNwYXJrLkdlbmVyYXRlRGVwb3NpdEFkZHJlc3NSZXNwb25zZSIAEnwKH2dlbmVyYXRlX3N0YXRpY19kZXBvc2l0X2FkZHJlc3MSKi5zcGFyay5HZW5lcmF0ZVN0YXRpY0RlcG9zaXRBZGRyZXNzUmVxdWVzdBorLnNwYXJrLkdlbmVyYXRlU3RhdGljRGVwb3NpdEFkZHJlc3NSZXNwb25zZSIAEnAKG3N0YXJ0X2RlcG9zaXRfdHJlZV9jcmVhdGlvbhImLnNwYXJrLlN0YXJ0RGVwb3NpdFRyZWVDcmVhdGlvblJlcXVlc3QaJy5zcGFyay5TdGFydERlcG9zaXRUcmVlQ3JlYXRpb25SZXNwb25zZSIAEn8KJ2ZpbmFsaXplX3RyYW5zZmVyX3dpdGhfdHJhbnNmZXJfcGFja2FnZRIxLnNwYXJrLkZpbmFsaXplVHJhbnNmZXJXaXRoVHJhbnNmZXJQYWNrYWdlUmVxdWVzdBofLnNwYXJrLkZpbmFsaXplVHJhbnNmZXJSZXNwb25zZSIAElEKF3F1ZXJ5X3BlbmRpbmdfdHJhbnNmZXJzEhUuc3BhcmsuVHJhbnNmZXJGaWx0ZXIaHS5zcGFyay5RdWVyeVRyYW5zZmVyc1Jlc3BvbnNlIgASTQoTcXVlcnlfYWxsX3RyYW5zZmVycxIVLnNwYXJrLlRyYW5zZmVyRmlsdGVyGh0uc3BhcmsuUXVlcnlUcmFuc2ZlcnNSZXNwb25zZSIAElsKGWNsYWltX3RyYW5zZmVyX3R3ZWFrX2tleXMSJC5zcGFyay5DbGFpbVRyYW5zZmVyVHdlYWtLZXlzUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSIAElIKFHN0b3JlX3ByZWltYWdlX3NoYXJlEiAuc3BhcmsuU3RvcmVQcmVpbWFnZVNoYXJlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSIAEmYKF2dldF9zaWduaW5nX2NvbW1pdG1lbnRzEiMuc3BhcmsuR2V0U2lnbmluZ0NvbW1pdG1lbnRzUmVxdWVzdBokLnNwYXJrLkdldFNpZ25pbmdDb21taXRtZW50c1Jlc3BvbnNlIgASUwoQcHJvdmlkZV9wcmVpbWFnZRIdLnNwYXJrLlByb3ZpZGVQcmVpbWFnZVJlcXVlc3QaHi5zcGFyay5Qcm92aWRlUHJlaW1hZ2VSZXNwb25zZSIAEkEKCnF1ZXJ5X2h0bGMSFy5zcGFyay5RdWVyeUh0bGNSZXF1ZXN0Ghguc3BhcmsuUXVlcnlIdGxjUmVzcG9uc2UiABJBCgpyZW5ld19sZWFmEhcuc3BhcmsuUmVuZXdMZWFmUmVxdWVzdBoYLnNwYXJrLlJlbmV3TGVhZlJlc3BvbnNlIgASXAoZZ2V0X3NpZ25pbmdfb3BlcmF0b3JfbGlzdBIWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRolLnNwYXJrLkdldFNpZ25pbmdPcGVyYXRvckxpc3RSZXNwb25zZSIAEkQKC3F1ZXJ5X25vZGVzEhguc3BhcmsuUXVlcnlOb2Rlc1JlcXVlc3QaGS5zcGFyay5RdWVyeU5vZGVzUmVzcG9uc2UiABJKCg1xdWVyeV9iYWxhbmNlEhouc3BhcmsuUXVlcnlCYWxhbmNlUmVxdWVzdBobLnNwYXJrLlF1ZXJ5QmFsYW5jZVJlc3BvbnNlIgASagoZcXVlcnlfdXNlcl9zaWduZWRfcmVmdW5kcxIkLnNwYXJrLlF1ZXJ5VXNlclNpZ25lZFJlZnVuZHNSZXF1ZXN0GiUuc3BhcmsuUXVlcnlVc2VyU2lnbmVkUmVmdW5kc1Jlc3BvbnNlIgASeQoecXVlcnlfdW51c2VkX2RlcG9zaXRfYWRkcmVzc2VzEikuc3BhcmsuUXVlcnlVbnVzZWREZXBvc2l0QWRkcmVzc2VzUmVxdWVzdBoqLnNwYXJrLlF1ZXJ5VW51c2VkRGVwb3NpdEFkZHJlc3Nlc1Jlc3BvbnNlIgASeQoecXVlcnlfc3RhdGljX2RlcG9zaXRfYWRkcmVzc2VzEikuc3BhcmsuUXVlcnlTdGF0aWNEZXBvc2l0QWRkcmVzc2VzUmVxdWVzdBoqLnNwYXJrLlF1ZXJ5U3RhdGljRGVwb3NpdEFkZHJlc3Nlc1Jlc3BvbnNlIgASXAoTc3Vic2NyaWJlX3RvX2V2ZW50cxIfLnNwYXJrLlN1YnNjcmliZVRvRXZlbnRzUmVxdWVzdBogLnNwYXJrLlN1YnNjcmliZVRvRXZlbnRzUmVzcG9uc2UiADABEoYBCiNpbml0aWF0ZV9zdGF0aWNfZGVwb3NpdF91dHhvX3JlZnVuZBItLnNwYXJrLkluaXRpYXRlU3RhdGljRGVwb3NpdFV0eG9SZWZ1bmRSZXF1ZXN0Gi4uc3BhcmsuSW5pdGlhdGVTdGF0aWNEZXBvc2l0VXR4b1JlZnVuZFJlc3BvbnNlIgASYQoWZXhpdF9zaW5nbGVfbm9kZV90cmVlcxIhLnNwYXJrLkV4aXRTaW5nbGVOb2RlVHJlZXNSZXF1ZXN0GiIuc3BhcmsuRXhpdFNpbmdsZU5vZGVUcmVlc1Jlc3BvbnNlIgASVgoTY29vcGVyYXRpdmVfZXhpdF92MhIdLnNwYXJrLkNvb3BlcmF0aXZlRXhpdFJlcXVlc3QaHi5zcGFyay5Db29wZXJhdGl2ZUV4aXRSZXNwb25zZSIAEnMKHmNsYWltX3RyYW5zZmVyX3NpZ25fcmVmdW5kc192MhImLnNwYXJrLkNsYWltVHJhbnNmZXJTaWduUmVmdW5kc1JlcXVlc3QaJy5zcGFyay5DbGFpbVRyYW5zZmVyU2lnblJlZnVuZHNSZXNwb25zZSIAEmwKG2ZpbmFsaXplX25vZGVfc2lnbmF0dXJlc192MhIkLnNwYXJrLkZpbmFsaXplTm9kZVNpZ25hdHVyZXNSZXF1ZXN0GiUuc3BhcmsuRmluYWxpemVOb2RlU2lnbmF0dXJlc1Jlc3BvbnNlIgASZgoZaW5pdGlhdGVfcHJlaW1hZ2Vfc3dhcF92MhIiLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVxdWVzdBojLnNwYXJrLkluaXRpYXRlUHJlaW1hZ2VTd2FwUmVzcG9uc2UiABJmChlpbml0aWF0ZV9wcmVpbWFnZV9zd2FwX3YzEiIuc3BhcmsuSW5pdGlhdGVQcmVpbWFnZVN3YXBSZXF1ZXN0GiMuc3BhcmsuSW5pdGlhdGVQcmVpbWFnZVN3YXBSZXNwb25zZSIAElEKEnN0YXJ0X2xlYWZfc3dhcF92MhIbLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXF1ZXN0Ghwuc3BhcmsuU3RhcnRUcmFuc2ZlclJlc3BvbnNlIgASUAoRc3RhcnRfdHJhbnNmZXJfdjISGy5zcGFyay5TdGFydFRyYW5zZmVyUmVxdWVzdBocLnNwYXJrLlN0YXJ0VHJhbnNmZXJSZXNwb25zZSIAEl4KFWdldF91dHhvc19mb3JfYWRkcmVzcxIgLnNwYXJrLkdldFV0eG9zRm9yQWRkcmVzc1JlcXVlc3QaIS5zcGFyay5HZXRVdHhvc0ZvckFkZHJlc3NSZXNwb25zZSIAEl0KFHF1ZXJ5X3NwYXJrX2ludm9pY2VzEiAuc3BhcmsuUXVlcnlTcGFya0ludm9pY2VzUmVxdWVzdBohLnNwYXJrLlF1ZXJ5U3BhcmtJbnZvaWNlc1Jlc3BvbnNlIgASeQoeaW5pdGlhdGVfc3dhcF9wcmltYXJ5X3RyYW5zZmVyEikuc3BhcmsuSW5pdGlhdGVTd2FwUHJpbWFyeVRyYW5zZmVyUmVxdWVzdBoqLnNwYXJrLkluaXRpYXRlU3dhcFByaW1hcnlUcmFuc2ZlclJlc3BvbnNlIgASYAoVdXBkYXRlX3dhbGxldF9zZXR0aW5nEiEuc3BhcmsuVXBkYXRlV2FsbGV0U2V0dGluZ1JlcXVlc3QaIi5zcGFyay5VcGRhdGVXYWxsZXRTZXR0aW5nUmVzcG9uc2UiABJdChRxdWVyeV93YWxsZXRfc2V0dGluZxIgLnNwYXJrLlF1ZXJ5V2FsbGV0U2V0dGluZ1JlcXVlc3QaIS5zcGFyay5RdWVyeVdhbGxldFNldHRpbmdSZXNwb25zZSIAQixaKmdpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9zcGFya2IGcHJvdG8zCppWChFzcGFya190b2tlbi5wcm90bxILc3BhcmtfdG9rZW4aH2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8aC3NwYXJrLnByb3RvGhd2YWxpZGF0ZS92YWxpZGF0ZS5wcm90byKbAQoSVG9rZW5PdXRwdXRUb1NwZW5kEkYKG3ByZXZfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgBIAEoDEIH+kIEegJoIFIYcHJldlRva2VuVHJhbnNhY3Rpb25IYXNoEj0KG3ByZXZfdG9rZW5fdHJhbnNhY3Rpb25fdm91dBgCIAEoDVIYcHJldlRva2VuVHJhbnNhY3Rpb25Wb3V0Il8KElRva2VuVHJhbnNmZXJJbnB1dBJJChBvdXRwdXRzX3RvX3NwZW5kGAEgAygLMh8uc3BhcmtfdG9rZW4uVG9rZW5PdXRwdXRUb1NwZW5kUg5vdXRwdXRzVG9TcGVuZCKTAQoOVG9rZW5NaW50SW5wdXQSMwoRaXNzdWVyX3B1YmxpY19rZXkYASABKAxCB/pCBHoCaCFSD2lzc3VlclB1YmxpY0tleRI3ChB0b2tlbl9pZGVudGlmaWVyGAIgASgMQgf6QgR6AmggSABSD3Rva2VuSWRlbnRpZmllcogBAUITChFfdG9rZW5faWRlbnRpZmllciK/AwoQVG9rZW5DcmVhdGVJbnB1dBIzChFpc3N1ZXJfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIPaXNzdWVyUHVibGljS2V5EiYKCnRva2VuX25hbWUYAiABKAlCB/pCBHICGBRSCXRva2VuTmFtZRIqCgx0b2tlbl90aWNrZXIYAyABKAlCB/pCBHICGAZSC3Rva2VuVGlja2VyEiQKCGRlY2ltYWxzGAQgASgNQgj6QgUqAxj/AVIIZGVjaW1hbHMSJgoKbWF4X3N1cHBseRgFIAEoDEIH+kIEegJoEFIJbWF4U3VwcGx5EiEKDGlzX2ZyZWV6YWJsZRgGIAEoCFILaXNGcmVlemFibGUSSQoaY3JlYXRpb25fZW50aXR5X3B1YmxpY19rZXkYByABKAxCB/pCBHoCaCFIAFIXY3JlYXRpb25FbnRpdHlQdWJsaWNLZXmIAQESNAoOZXh0cmFfbWV0YWRhdGEYCCABKAxCCPpCBXoDGIAISAFSDWV4dHJhTWV0YWRhdGGIAQFCHQobX2NyZWF0aW9uX2VudGl0eV9wdWJsaWNfa2V5QhEKD19leHRyYV9tZXRhZGF0YSLHBAoLVG9rZW5PdXRwdXQSHQoCaWQYASABKAlCCPpCBXIDsAEBSABSAmlkiAEBEjEKEG93bmVyX3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSDm93bmVyUHVibGljS2V5EkEKFXJldm9jYXRpb25fY29tbWl0bWVudBgDIAEoDEIH+kIEegJoIUgBUhRyZXZvY2F0aW9uQ29tbWl0bWVudIgBARIxChJ3aXRoZHJhd19ib25kX3NhdHMYBCABKARIAlIQd2l0aGRyYXdCb25kU2F0c4gBARJMCiB3aXRoZHJhd19yZWxhdGl2ZV9ibG9ja19sb2NrdGltZRgFIAEoBEgDUh13aXRoZHJhd1JlbGF0aXZlQmxvY2tMb2NrdGltZYgBARI2ChB0b2tlbl9wdWJsaWNfa2V5GAYgASgMQgf6QgR6AmghSARSDnRva2VuUHVibGljS2V5iAEBEjcKEHRva2VuX2lkZW50aWZpZXIYCCABKAxCB/pCBHoCaCBIBVIPdG9rZW5JZGVudGlmaWVyiAEBEioKDHRva2VuX2Ftb3VudBgHIAEoDEIH+kIEegJoEFILdG9rZW5BbW91bnRCBQoDX2lkQhgKFl9yZXZvY2F0aW9uX2NvbW1pdG1lbnRCFQoTX3dpdGhkcmF3X2JvbmRfc2F0c0IjCiFfd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWVCEwoRX3Rva2VuX3B1YmxpY19rZXlCEwoRX3Rva2VuX2lkZW50aWZpZXIingIKElBhcnRpYWxUb2tlbk91dHB1dBIxChBvd25lcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg5vd25lclB1YmxpY0tleRIsChJ3aXRoZHJhd19ib25kX3NhdHMYAiABKARSEHdpdGhkcmF3Qm9uZFNhdHMSRwogd2l0aGRyYXdfcmVsYXRpdmVfYmxvY2tfbG9ja3RpbWUYAyABKARSHXdpdGhkcmF3UmVsYXRpdmVCbG9ja0xvY2t0aW1lEjIKEHRva2VuX2lkZW50aWZpZXIYBCABKAxCB/pCBHoCaCBSD3Rva2VuSWRlbnRpZmllchIqCgx0b2tlbl9hbW91bnQYBSABKAxCB/pCBHoCaBBSC3Rva2VuQW1vdW50IqMBChBGaW5hbFRva2VuT3V0cHV0ElEKFHBhcnRpYWxfdG9rZW5fb3V0cHV0GAEgASgLMh8uc3BhcmtfdG9rZW4uUGFydGlhbFRva2VuT3V0cHV0UhJwYXJ0aWFsVG9rZW5PdXRwdXQSPAoVcmV2b2NhdGlvbl9jb21taXRtZW50GAIgASgMQgf6QgR6AmghUhRyZXZvY2F0aW9uQ29tbWl0bWVudCKaBgoQVG9rZW5UcmFuc2FjdGlvbhIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEjwKCm1pbnRfaW5wdXQYAiABKAsyGy5zcGFya190b2tlbi5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSSAoOdHJhbnNmZXJfaW5wdXQYAyABKAsyHy5zcGFya190b2tlbi5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBJCCgxjcmVhdGVfaW5wdXQYCCABKAsyHS5zcGFya190b2tlbi5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0Ej0KDXRva2VuX291dHB1dHMYBCADKAsyGC5zcGFya190b2tlbi5Ub2tlbk91dHB1dFIMdG9rZW5PdXRwdXRzEloKI3NwYXJrX29wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXlzGAUgAygMQgz6QgmSAQYiBHoCaCFSH3NwYXJrT3BlcmF0b3JJZGVudGl0eVB1YmxpY0tleXMSOwoLZXhwaXJ5X3RpbWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgpleHBpcnlUaW1lEjIKB25ldHdvcmsYByABKA4yDi5zcGFyay5OZXR3b3JrQgj6QgWCAQIgAFIHbmV0d29yaxJUChhjbGllbnRfY3JlYXRlZF90aW1lc3RhbXAYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUhZjbGllbnRDcmVhdGVkVGltZXN0YW1wEk8KE2ludm9pY2VfYXR0YWNobWVudHMYCiADKAsyHi5zcGFya190b2tlbi5JbnZvaWNlQXR0YWNobWVudFISaW52b2ljZUF0dGFjaG1lbnRzEj8KGXZhbGlkaXR5X2R1cmF0aW9uX3NlY29uZHMYCyABKARIAVIXdmFsaWRpdHlEdXJhdGlvblNlY29uZHOIAQFCDgoMdG9rZW5faW5wdXRzQhwKGl92YWxpZGl0eV9kdXJhdGlvbl9zZWNvbmRzIpkDChhUb2tlblRyYW5zYWN0aW9uTWV0YWRhdGESWgojc3Bhcmtfb3BlcmF0b3JfaWRlbnRpdHlfcHVibGljX2tleXMYAiADKAxCDPpCCZIBBiIEegJoIVIfc3BhcmtPcGVyYXRvcklkZW50aXR5UHVibGljS2V5cxIyCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya0II+kIFggECIABSB25ldHdvcmsSVAoYY2xpZW50X2NyZWF0ZWRfdGltZXN0YW1wGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFIWY2xpZW50Q3JlYXRlZFRpbWVzdGFtcBJGChl2YWxpZGl0eV9kdXJhdGlvbl9zZWNvbmRzGAUgASgEQgr6QgcyBRisAigBUhd2YWxpZGl0eUR1cmF0aW9uU2Vjb25kcxJPChNpbnZvaWNlX2F0dGFjaG1lbnRzGAYgAygLMh4uc3BhcmtfdG9rZW4uSW52b2ljZUF0dGFjaG1lbnRSEmludm9pY2VBdHRhY2htZW50cyLJAwoXUGFydGlhbFRva2VuVHJhbnNhY3Rpb24SGAoHdmVyc2lvbhgBIAEoDVIHdmVyc2lvbhJjChp0b2tlbl90cmFuc2FjdGlvbl9tZXRhZGF0YRgCIAEoCzIlLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25NZXRhZGF0YVIYdG9rZW5UcmFuc2FjdGlvbk1ldGFkYXRhEjwKCm1pbnRfaW5wdXQYAyABKAsyGy5zcGFya190b2tlbi5Ub2tlbk1pbnRJbnB1dEgAUgltaW50SW5wdXQSSAoOdHJhbnNmZXJfaW5wdXQYBCABKAsyHy5zcGFya190b2tlbi5Ub2tlblRyYW5zZmVySW5wdXRIAFINdHJhbnNmZXJJbnB1dBJCCgxjcmVhdGVfaW5wdXQYBSABKAsyHS5zcGFya190b2tlbi5Ub2tlbkNyZWF0ZUlucHV0SABSC2NyZWF0ZUlucHV0ElMKFXBhcnRpYWxfdG9rZW5fb3V0cHV0cxgGIAMoCzIfLnNwYXJrX3Rva2VuLlBhcnRpYWxUb2tlbk91dHB1dFITcGFydGlhbFRva2VuT3V0cHV0c0IOCgx0b2tlbl9pbnB1dHMiwQMKFUZpbmFsVG9rZW5UcmFuc2FjdGlvbhIYCgd2ZXJzaW9uGAEgASgNUgd2ZXJzaW9uEmMKGnRva2VuX3RyYW5zYWN0aW9uX21ldGFkYXRhGAIgASgLMiUuc3BhcmtfdG9rZW4uVG9rZW5UcmFuc2FjdGlvbk1ldGFkYXRhUhh0b2tlblRyYW5zYWN0aW9uTWV0YWRhdGESPAoKbWludF9pbnB1dBgDIAEoCzIbLnNwYXJrX3Rva2VuLlRva2VuTWludElucHV0SABSCW1pbnRJbnB1dBJICg50cmFuc2Zlcl9pbnB1dBgEIAEoCzIfLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNmZXJJbnB1dEgAUg10cmFuc2ZlcklucHV0EkIKDGNyZWF0ZV9pbnB1dBgFIAEoCzIdLnNwYXJrX3Rva2VuLlRva2VuQ3JlYXRlSW5wdXRIAFILY3JlYXRlSW5wdXQSTQoTZmluYWxfdG9rZW5fb3V0cHV0cxgGIAMoCzIdLnNwYXJrX3Rva2VuLkZpbmFsVG9rZW5PdXRwdXRSEWZpbmFsVG9rZW5PdXRwdXRzQg4KDHRva2VuX2lucHV0cyI4ChFJbnZvaWNlQXR0YWNobWVudBIjCg1zcGFya19pbnZvaWNlGAEgASgJUgxzcGFya0ludm9pY2UiXgoSU2lnbmF0dXJlV2l0aEluZGV4EicKCXNpZ25hdHVyZRgBIAEoDEIJ+kIGegQQQBhJUglzaWduYXR1cmUSHwoLaW5wdXRfaW5kZXgYAiABKA1SCmlucHV0SW5kZXgitAEKHklucHV0VHR4b1NpZ25hdHVyZXNQZXJPcGVyYXRvchJICg90dHhvX3NpZ25hdHVyZXMYASADKAsyHy5zcGFya190b2tlbi5TaWduYXR1cmVXaXRoSW5kZXhSDnR0eG9TaWduYXR1cmVzEkgKHG9wZXJhdG9yX2lkZW50aXR5X3B1YmxpY19rZXkYAiABKAxCB/pCBHoCaCFSGW9wZXJhdG9ySWRlbnRpdHlQdWJsaWNLZXki8gIKF1N0YXJ0VHJhbnNhY3Rpb25SZXF1ZXN0EjcKE2lkZW50aXR5X3B1YmxpY19rZXkYASABKAxCB/pCBHoCaCFSEWlkZW50aXR5UHVibGljS2V5ElkKGXBhcnRpYWxfdG9rZW5fdHJhbnNhY3Rpb24YAiABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhdwYXJ0aWFsVG9rZW5UcmFuc2FjdGlvbhJ7CipwYXJ0aWFsX3Rva2VuX3RyYW5zYWN0aW9uX293bmVyX3NpZ25hdHVyZXMYAyADKAsyHy5zcGFya190b2tlbi5TaWduYXR1cmVXaXRoSW5kZXhSJnBhcnRpYWxUb2tlblRyYW5zYWN0aW9uT3duZXJTaWduYXR1cmVzEkYKGXZhbGlkaXR5X2R1cmF0aW9uX3NlY29uZHMYBCABKARCCvpCBzIFGKwCKAFSF3ZhbGlkaXR5RHVyYXRpb25TZWNvbmRzIq4BChhTdGFydFRyYW5zYWN0aW9uUmVzcG9uc2USVQoXZmluYWxfdG9rZW5fdHJhbnNhY3Rpb24YASABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SOwoNa2V5c2hhcmVfaW5mbxgCIAEoCzIWLnNwYXJrLlNpZ25pbmdLZXlzaGFyZVIMa2V5c2hhcmVJbmZvIvgCChhDb21taXRUcmFuc2FjdGlvblJlcXVlc3QSVQoXZmluYWxfdG9rZW5fdHJhbnNhY3Rpb24YASABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SSAocZmluYWxfdG9rZW5fdHJhbnNhY3Rpb25faGFzaBgCIAEoDEIH+kIEegJoIFIZZmluYWxUb2tlblRyYW5zYWN0aW9uSGFzaBJ3CiJpbnB1dF90dHhvX3NpZ25hdHVyZXNfcGVyX29wZXJhdG9yGAMgAygLMisuc3BhcmtfdG9rZW4uSW5wdXRUdHhvU2lnbmF0dXJlc1Blck9wZXJhdG9yUh5pbnB1dFR0eG9TaWduYXR1cmVzUGVyT3BlcmF0b3ISQgoZb3duZXJfaWRlbnRpdHlfcHVibGljX2tleRgEIAEoDEIH+kIEegJoIVIWb3duZXJJZGVudGl0eVB1YmxpY0tleSK6AQoOQ29tbWl0UHJvZ3Jlc3MSUQoeY29tbWl0dGVkX29wZXJhdG9yX3B1YmxpY19rZXlzGAEgAygMQgz6QgmSAQYiBHoCaCFSG2NvbW1pdHRlZE9wZXJhdG9yUHVibGljS2V5cxJVCiB1bmNvbW1pdHRlZF9vcGVyYXRvcl9wdWJsaWNfa2V5cxgCIAMoDEIM+kIJkgEGIgR6AmghUh11bmNvbW1pdHRlZE9wZXJhdG9yUHVibGljS2V5cyKhAQoZQ29tbWl0VHJhbnNhY3Rpb25SZXNwb25zZRI+Cg1jb21taXRfc3RhdHVzGAEgASgOMhkuc3BhcmtfdG9rZW4uQ29tbWl0U3RhdHVzUgxjb21taXRTdGF0dXMSRAoPY29tbWl0X3Byb2dyZXNzGAIgASgLMhsuc3BhcmtfdG9rZW4uQ29tbWl0UHJvZ3Jlc3NSDmNvbW1pdFByb2dyZXNzIqYCChtCcm9hZGNhc3RUcmFuc2FjdGlvblJlcXVlc3QSNwoTaWRlbnRpdHlfcHVibGljX2tleRgBIAEoDEIH+kIEegJoIVIRaWRlbnRpdHlQdWJsaWNLZXkSYAoZcGFydGlhbF90b2tlbl90cmFuc2FjdGlvbhgCIAEoCzIkLnNwYXJrX3Rva2VuLlBhcnRpYWxUb2tlblRyYW5zYWN0aW9uUhdwYXJ0aWFsVG9rZW5UcmFuc2FjdGlvbhJsCiJ0b2tlbl90cmFuc2FjdGlvbl9vd25lcl9zaWduYXR1cmVzGAMgAygLMh8uc3BhcmtfdG9rZW4uU2lnbmF0dXJlV2l0aEluZGV4Uh90b2tlblRyYW5zYWN0aW9uT3duZXJTaWduYXR1cmVzIoACChxCcm9hZGNhc3RUcmFuc2FjdGlvblJlc3BvbnNlEloKF2ZpbmFsX3Rva2VuX3RyYW5zYWN0aW9uGAEgASgLMiIuc3BhcmtfdG9rZW4uRmluYWxUb2tlblRyYW5zYWN0aW9uUhVmaW5hbFRva2VuVHJhbnNhY3Rpb24SPgoNY29tbWl0X3N0YXR1cxgCIAEoDjIZLnNwYXJrX3Rva2VuLkNvbW1pdFN0YXR1c1IMY29tbWl0U3RhdHVzEkQKD2NvbW1pdF9wcm9ncmVzcxgDIAEoCzIbLnNwYXJrX3Rva2VuLkNvbW1pdFByb2dyZXNzUg5jb21taXRQcm9ncmVzcyKSAQoZUXVlcnlUb2tlbk1ldGFkYXRhUmVxdWVzdBI5ChF0b2tlbl9pZGVudGlmaWVycxgBIAMoDEIM+kIJkgEGIgR6AmggUhB0b2tlbklkZW50aWZpZXJzEjoKEmlzc3Vlcl9wdWJsaWNfa2V5cxgCIAMoDEIM+kIJkgEGIgR6AmghUhBpc3N1ZXJQdWJsaWNLZXlzIvADCg1Ub2tlbk1ldGFkYXRhEjMKEWlzc3Vlcl9wdWJsaWNfa2V5GAEgASgMQgf6QgR6AmghUg9pc3N1ZXJQdWJsaWNLZXkSJgoKdG9rZW5fbmFtZRgCIAEoCUIH+kIEcgIYFFIJdG9rZW5OYW1lEioKDHRva2VuX3RpY2tlchgDIAEoCUIH+kIEcgIYBlILdG9rZW5UaWNrZXISJAoIZGVjaW1hbHMYBCABKA1CCPpCBSoDGP8BUghkZWNpbWFscxImCgptYXhfc3VwcGx5GAUgASgMQgf6QgR6AmgQUgltYXhTdXBwbHkSIQoMaXNfZnJlZXphYmxlGAYgASgIUgtpc0ZyZWV6YWJsZRJJChpjcmVhdGlvbl9lbnRpdHlfcHVibGljX2tleRgHIAEoDEIH+kIEegJoIUgAUhdjcmVhdGlvbkVudGl0eVB1YmxpY0tleYgBARIyChB0b2tlbl9pZGVudGlmaWVyGAggASgMQgf6QgR6AmggUg90b2tlbklkZW50aWZpZXISNAoOZXh0cmFfbWV0YWRhdGEYCSABKAxCCPpCBXoDGIAISAFSDWV4dHJhTWV0YWRhdGGIAQFCHQobX2NyZWF0aW9uX2VudGl0eV9wdWJsaWNfa2V5QhEKD19leHRyYV9tZXRhZGF0YSJfChpRdWVyeVRva2VuTWV0YWRhdGFSZXNwb25zZRJBCg50b2tlbl9tZXRhZGF0YRgBIAMoCzIaLnNwYXJrX3Rva2VuLlRva2VuTWV0YWRhdGFSDXRva2VuTWV0YWRhdGEirAIKGFF1ZXJ5VG9rZW5PdXRwdXRzUmVxdWVzdBI4ChFvd25lcl9wdWJsaWNfa2V5cxgBIAMoDEIM+kIJkgEGIgR6AmghUg9vd25lclB1YmxpY0tleXMSOgoSaXNzdWVyX3B1YmxpY19rZXlzGAIgAygMQgz6QgmSAQYiBHoCaCFSEGlzc3VlclB1YmxpY0tleXMSOQoRdG9rZW5faWRlbnRpZmllcnMYBCADKAxCDPpCCZIBBiIEegJoIFIQdG9rZW5JZGVudGlmaWVycxIoCgduZXR3b3JrGAMgASgOMg4uc3BhcmsuTmV0d29ya1IHbmV0d29yaxI1CgxwYWdlX3JlcXVlc3QYBSABKAsyEi5zcGFyay5QYWdlUmVxdWVzdFILcGFnZVJlcXVlc3QirQMKHVF1ZXJ5VG9rZW5UcmFuc2FjdGlvbnNSZXF1ZXN0EiwKCm91dHB1dF9pZHMYASADKAlCDfpCCpIBByIFcgOwAQFSCW91dHB1dElkcxI4ChFvd25lcl9wdWJsaWNfa2V5cxgCIAMoDEIM+kIJkgEGIgR6AmghUg9vd25lclB1YmxpY0tleXMSOgoSaXNzdWVyX3B1YmxpY19rZXlzGAMgAygMQgz6QgmSAQYiBHoCaCFSEGlzc3VlclB1YmxpY0tleXMSOQoRdG9rZW5faWRlbnRpZmllcnMYByADKAxCDPpCCZIBBiIEegJoIFIQdG9rZW5JZGVudGlmaWVycxJGChh0b2tlbl90cmFuc2FjdGlvbl9oYXNoZXMYBCADKAxCDPpCCZIBBiIEegJoIFIWdG9rZW5UcmFuc2FjdGlvbkhhc2hlcxIiCgVvcmRlchgIIAEoDjIMLnNwYXJrLk9yZGVyUgVvcmRlchIgCgVsaW1pdBgFIAEoA0IK+kIHIgUY6AcoAFIFbGltaXQSHwoGb2Zmc2V0GAYgASgDQgf6QgQiAigAUgZvZmZzZXQipgEKHlF1ZXJ5VG9rZW5UcmFuc2FjdGlvbnNSZXNwb25zZRJsCh50b2tlbl90cmFuc2FjdGlvbnNfd2l0aF9zdGF0dXMYASADKAsyJy5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uV2l0aFN0YXR1c1IbdG9rZW5UcmFuc2FjdGlvbnNXaXRoU3RhdHVzEhYKBm9mZnNldBgCIAEoA1IGb2Zmc2V0ItYBCiFPdXRwdXRXaXRoUHJldmlvdXNUcmFuc2FjdGlvbkRhdGESMAoGb3V0cHV0GAEgASgLMhguc3BhcmtfdG9rZW4uVG9rZW5PdXRwdXRSBm91dHB1dBJDChlwcmV2aW91c190cmFuc2FjdGlvbl9oYXNoGAIgASgMQgf6QgR6AmggUhdwcmV2aW91c1RyYW5zYWN0aW9uSGFzaBI6ChlwcmV2aW91c190cmFuc2FjdGlvbl92b3V0GAMgASgNUhdwcmV2aW91c1RyYW5zYWN0aW9uVm91dCLaAQoZUXVlcnlUb2tlbk91dHB1dHNSZXNwb25zZRKCAQomb3V0cHV0c193aXRoX3ByZXZpb3VzX3RyYW5zYWN0aW9uX2RhdGEYASADKAsyLi5zcGFya190b2tlbi5PdXRwdXRXaXRoUHJldmlvdXNUcmFuc2FjdGlvbkRhdGFSIm91dHB1dHNXaXRoUHJldmlvdXNUcmFuc2FjdGlvbkRhdGESOAoNcGFnZV9yZXNwb25zZRgCIAEoCzITLnNwYXJrLlBhZ2VSZXNwb25zZVIMcGFnZVJlc3BvbnNlImQKGFNwZW50VG9rZW5PdXRwdXRNZXRhZGF0YRIbCglvdXRwdXRfaWQYASABKAlSCG91dHB1dElkEisKEXJldm9jYXRpb25fc2VjcmV0GAIgASgMUhByZXZvY2F0aW9uU2VjcmV0Io4BCiRUb2tlblRyYW5zYWN0aW9uQ29uZmlybWF0aW9uTWV0YWRhdGESZgocc3BlbnRfdG9rZW5fb3V0cHV0c19tZXRhZGF0YRgBIAMoCzIlLnNwYXJrX3Rva2VuLlNwZW50VG9rZW5PdXRwdXRNZXRhZGF0YVIZc3BlbnRUb2tlbk91dHB1dHNNZXRhZGF0YSLMAgoaVG9rZW5UcmFuc2FjdGlvbldpdGhTdGF0dXMSSgoRdG9rZW5fdHJhbnNhY3Rpb24YASABKAsyHS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uUhB0b2tlblRyYW5zYWN0aW9uEjsKBnN0YXR1cxgCIAEoDjIjLnNwYXJrX3Rva2VuLlRva2VuVHJhbnNhY3Rpb25TdGF0dXNSBnN0YXR1cxJmChVjb25maXJtYXRpb25fbWV0YWRhdGEYAyABKAsyMS5zcGFya190b2tlbi5Ub2tlblRyYW5zYWN0aW9uQ29uZmlybWF0aW9uTWV0YWRhdGFSFGNvbmZpcm1hdGlvbk1ldGFkYXRhEj0KFnRva2VuX3RyYW5zYWN0aW9uX2hhc2gYBCABKAxCB/pCBHoCaCBSFHRva2VuVHJhbnNhY3Rpb25IYXNoIqwDChNGcmVlemVUb2tlbnNQYXlsb2FkEhgKB3ZlcnNpb24YASABKA1SB3ZlcnNpb24SMQoQb3duZXJfcHVibGljX2tleRgCIAEoDEIH+kIEegJoIVIOb3duZXJQdWJsaWNLZXkSNgoQdG9rZW5fcHVibGljX2tleRgDIAEoDEIH+kIEegJoIUgAUg50b2tlblB1YmxpY0tleYgBARI3ChB0b2tlbl9pZGVudGlmaWVyGAQgASgMQgf6QgR6AmggSAFSD3Rva2VuSWRlbnRpZmllcogBARI6Chlpc3N1ZXJfcHJvdmlkZWRfdGltZXN0YW1wGAUgASgEUhdpc3N1ZXJQcm92aWRlZFRpbWVzdGFtcBJIChxvcGVyYXRvcl9pZGVudGl0eV9wdWJsaWNfa2V5GAYgASgMQgf6QgR6AmghUhlvcGVyYXRvcklkZW50aXR5UHVibGljS2V5EicKD3Nob3VsZF91bmZyZWV6ZRgHIAEoCFIOc2hvdWxkVW5mcmVlemVCEwoRX3Rva2VuX3B1YmxpY19rZXlCEwoRX3Rva2VuX2lkZW50aWZpZXIioQEKE0ZyZWV6ZVRva2Vuc1JlcXVlc3QSVAoVZnJlZXplX3Rva2Vuc19wYXlsb2FkGAEgASgLMiAuc3BhcmtfdG9rZW4uRnJlZXplVG9rZW5zUGF5bG9hZFITZnJlZXplVG9rZW5zUGF5bG9hZBI0ChBpc3N1ZXJfc2lnbmF0dXJlGAIgASgMQgn6QgZ6BBBAGElSD2lzc3VlclNpZ25hdHVyZSKJAQoURnJlZXplVG9rZW5zUmVzcG9uc2USPQoTaW1wYWN0ZWRfb3V0cHV0X2lkcxgBIAMoCUIN+kIKkgEHIgVyA7ABAVIRaW1wYWN0ZWRPdXRwdXRJZHMSMgoVaW1wYWN0ZWRfdG9rZW5fYW1vdW50GAIgASgMUhNpbXBhY3RlZFRva2VuQW1vdW50KqcBChRUb2tlblRyYW5zYWN0aW9uVHlwZRImCiJUT0tFTl9UUkFOU0FDVElPTl9UWVBFX1VOU1BFQ0lGSUVEEAASIQodVE9LRU5fVFJBTlNBQ1RJT05fVFlQRV9DUkVBVEUQARIfChtUT0tFTl9UUkFOU0FDVElPTl9UWVBFX01JTlQQAhIjCh9UT0tFTl9UUkFOU0FDVElPTl9UWVBFX1RSQU5TRkVSEAMqUwoMQ29tbWl0U3RhdHVzEhYKEkNPTU1JVF9VTlNQRUNJRklFRBAAEhUKEUNPTU1JVF9QUk9DRVNTSU5HEAESFAoQQ09NTUlUX0ZJTkFMSVpFRBACKoYCChZUb2tlblRyYW5zYWN0aW9uU3RhdHVzEh0KGVRPS0VOX1RSQU5TQUNUSU9OX1NUQVJURUQQABIcChhUT0tFTl9UUkFOU0FDVElPTl9TSUdORUQQARIeChpUT0tFTl9UUkFOU0FDVElPTl9SRVZFQUxFRBAFEh8KG1RPS0VOX1RSQU5TQUNUSU9OX0ZJTkFMSVpFRBACEicKI1RPS0VOX1RSQU5TQUNUSU9OX1NUQVJURURfQ0FOQ0VMTEVEEAMSJgoiVE9LRU5fVFJBTlNBQ1RJT05fU0lHTkVEX0NBTkNFTExFRBAEEh0KGVRPS0VOX1RSQU5TQUNUSU9OX1VOS05PV04QCjLwBQoRU3BhcmtUb2tlblNlcnZpY2USYgoRc3RhcnRfdHJhbnNhY3Rpb24SJC5zcGFya190b2tlbi5TdGFydFRyYW5zYWN0aW9uUmVxdWVzdBolLnNwYXJrX3Rva2VuLlN0YXJ0VHJhbnNhY3Rpb25SZXNwb25zZSIAEmUKEmNvbW1pdF90cmFuc2FjdGlvbhIlLnNwYXJrX3Rva2VuLkNvbW1pdFRyYW5zYWN0aW9uUmVxdWVzdBomLnNwYXJrX3Rva2VuLkNvbW1pdFRyYW5zYWN0aW9uUmVzcG9uc2UiABJpChRxdWVyeV90b2tlbl9tZXRhZGF0YRImLnNwYXJrX3Rva2VuLlF1ZXJ5VG9rZW5NZXRhZGF0YVJlcXVlc3QaJy5zcGFya190b2tlbi5RdWVyeVRva2VuTWV0YWRhdGFSZXNwb25zZSIAEnUKGHF1ZXJ5X3Rva2VuX3RyYW5zYWN0aW9ucxIqLnNwYXJrX3Rva2VuLlF1ZXJ5VG9rZW5UcmFuc2FjdGlvbnNSZXF1ZXN0Gisuc3BhcmtfdG9rZW4uUXVlcnlUb2tlblRyYW5zYWN0aW9uc1Jlc3BvbnNlIgASZgoTcXVlcnlfdG9rZW5fb3V0cHV0cxIlLnNwYXJrX3Rva2VuLlF1ZXJ5VG9rZW5PdXRwdXRzUmVxdWVzdBomLnNwYXJrX3Rva2VuLlF1ZXJ5VG9rZW5PdXRwdXRzUmVzcG9uc2UiABJWCg1mcmVlemVfdG9rZW5zEiAuc3BhcmtfdG9rZW4uRnJlZXplVG9rZW5zUmVxdWVzdBohLnNwYXJrX3Rva2VuLkZyZWV6ZVRva2Vuc1Jlc3BvbnNlIgASbgoVYnJvYWRjYXN0X3RyYW5zYWN0aW9uEiguc3BhcmtfdG9rZW4uQnJvYWRjYXN0VHJhbnNhY3Rpb25SZXF1ZXN0Gikuc3BhcmtfdG9rZW4uQnJvYWRjYXN0VHJhbnNhY3Rpb25SZXNwb25zZSIAQjJaMGdpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9zcGFya190b2tlbmIGcHJvdG8zCqUECgptb2NrLnByb3RvEgRtb2NrGhtnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8iQAobQ2xlYW5VcFByZWltYWdlU2hhcmVSZXF1ZXN0EiEKDHBheW1lbnRfaGFzaBgBIAEoDFILcGF5bWVudEhhc2giTQoYVXBkYXRlTm9kZXNTdGF0dXNSZXF1ZXN0EhkKCG5vZGVfaWRzGAEgAygJUgdub2RlSWRzEhYKBnN0YXR1cxgCIAEoCVIGc3RhdHVzIjEKElRyaWdnZXJUYXNrUmVxdWVzdBIbCgl0YXNrX25hbWUYASABKAlSCHRhc2tOYW1lMvoBCgtNb2NrU2VydmljZRJWChdjbGVhbl91cF9wcmVpbWFnZV9zaGFyZRIhLm1vY2suQ2xlYW5VcFByZWltYWdlU2hhcmVSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IgASTwoTdXBkYXRlX25vZGVzX3N0YXR1cxIeLm1vY2suVXBkYXRlTm9kZXNTdGF0dXNSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IgASQgoMdHJpZ2dlcl90YXNrEhgubW9jay5UcmlnZ2VyVGFza1JlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiAEIrWilnaXRodWIuY29tL2xpZ2h0c3BhcmtkZXYvc3BhcmsvcHJvdG8vbW9ja2IGcHJvdG8zCuoHChFzcGFya19hdXRobi5wcm90bxILc3BhcmtfYXV0aG4ieAoJQ2hhbGxlbmdlEhgKB3ZlcnNpb24YASABKAVSB3ZlcnNpb24SHAoJdGltZXN0YW1wGAIgASgDUgl0aW1lc3RhbXASFAoFbm9uY2UYAyABKAxSBW5vbmNlEh0KCnB1YmxpY19rZXkYBCABKAxSCXB1YmxpY0tleSKFAQoSUHJvdGVjdGVkQ2hhbGxlbmdlEhgKB3ZlcnNpb24YASABKAVSB3ZlcnNpb24SNAoJY2hhbGxlbmdlGAIgASgLMhYuc3BhcmtfYXV0aG4uQ2hhbGxlbmdlUgljaGFsbGVuZ2USHwoLc2VydmVyX2htYWMYAyABKAxSCnNlcnZlckhtYWMiNAoTR2V0Q2hhbGxlbmdlUmVxdWVzdBIdCgpwdWJsaWNfa2V5GAEgASgMUglwdWJsaWNLZXkiaAoUR2V0Q2hhbGxlbmdlUmVzcG9uc2USUAoTcHJvdGVjdGVkX2NoYWxsZW5nZRgBIAEoCzIfLnNwYXJrX2F1dGhuLlByb3RlY3RlZENoYWxsZW5nZVIScHJvdGVjdGVkQ2hhbGxlbmdlIqcBChZWZXJpZnlDaGFsbGVuZ2VSZXF1ZXN0ElAKE3Byb3RlY3RlZF9jaGFsbGVuZ2UYASABKAsyHy5zcGFya19hdXRobi5Qcm90ZWN0ZWRDaGFsbGVuZ2VSEnByb3RlY3RlZENoYWxsZW5nZRIcCglzaWduYXR1cmUYAiABKAxSCXNpZ25hdHVyZRIdCgpwdWJsaWNfa2V5GAMgASgMUglwdWJsaWNLZXkicQoXVmVyaWZ5Q2hhbGxlbmdlUmVzcG9uc2USIwoNc2Vzc2lvbl90b2tlbhgBIAEoCVIMc2Vzc2lvblRva2VuEjEKFGV4cGlyYXRpb25fdGltZXN0YW1wGAIgASgDUhNleHBpcmF0aW9uVGltZXN0YW1wMswBChFTcGFya0F1dGhuU2VydmljZRJWCg1nZXRfY2hhbGxlbmdlEiAuc3BhcmtfYXV0aG4uR2V0Q2hhbGxlbmdlUmVxdWVzdBohLnNwYXJrX2F1dGhuLkdldENoYWxsZW5nZVJlc3BvbnNlIgASXwoQdmVyaWZ5X2NoYWxsZW5nZRIjLnNwYXJrX2F1dGhuLlZlcmlmeUNoYWxsZW5nZVJlcXVlc3QaJC5zcGFya19hdXRobi5WZXJpZnlDaGFsbGVuZ2VSZXNwb25zZSIAQjJaMGdpdGh1Yi5jb20vbGlnaHRzcGFya2Rldi9zcGFyay9wcm90by9zcGFya19hdXRobmIGcHJvdG8z";
28984
26976
  function getSparkDescriptorBytes() {
28985
26977
  const binaryString = atob(SPARK_DESCRIPTORS_BASE64);
28986
26978
  const bytes = new Uint8Array(binaryString.length);
@@ -29006,7 +26998,6 @@ function getRegistry() {
29006
26998
  return _registry;
29007
26999
  }
29008
27000
  try {
29009
- console.log("Loading embedded protobuf descriptors...");
29010
27001
  const descriptorBytes = getSparkDescriptorBytes();
29011
27002
  const descriptorSet = FileDescriptorSet.decode(descriptorBytes);
29012
27003
  _registry = {
@@ -29015,7 +27006,6 @@ function getRegistry() {
29015
27006
  messageMap: /* @__PURE__ */ new Map()
29016
27007
  };
29017
27008
  for (const fileDescriptor of descriptorSet.file) {
29018
- console.log(`Processing proto file: ${fileDescriptor.name}`);
29019
27009
  _registry.fileMap.set(fileDescriptor.name, fileDescriptor);
29020
27010
  if (fileDescriptor.messageType) {
29021
27011
  for (const messageDescriptor of fileDescriptor.messageType) {
@@ -30609,52 +28599,11 @@ function sortInvoiceAttachments(attachments) {
30609
28599
  if (!attachments || attachments.length === 0) {
30610
28600
  return attachments;
30611
28601
  }
30612
- const keyed = [];
30613
- for (let i = 0; i < attachments.length; i++) {
30614
- const attachment = attachments[i];
30615
- if (!attachment) {
30616
- throw new SparkValidationError(
30617
- `invoice attachment at index ${i} cannot be null`,
30618
- {
30619
- field: `invoiceAttachments[${i}]`,
30620
- index: i
30621
- }
30622
- );
30623
- }
30624
- const invoice = attachment.sparkInvoice;
30625
- let idBytes;
30626
- try {
30627
- const decoded = import_base6.bech32m.decode(invoice, 500);
30628
- const payload = SparkAddress.decode(import_base6.bech32m.fromWords(decoded.words));
30629
- if (!payload.sparkInvoiceFields || !payload.sparkInvoiceFields.id) {
30630
- throw new Error("missing spark invoice fields or id");
30631
- }
30632
- idBytes = payload.sparkInvoiceFields.id;
30633
- } catch (err) {
30634
- throw new SparkValidationError(`invalid invoice at ${i}`, {
30635
- field: `invoiceAttachments[${i}].sparkInvoice`,
30636
- index: i,
30637
- value: invoice,
30638
- error: err
30639
- });
30640
- }
30641
- if (!idBytes || idBytes.length !== 16) {
30642
- throw new SparkValidationError(`invalid invoice id at ${i}`, {
30643
- field: `invoiceAttachments[${i}].sparkInvoice`,
30644
- index: i
30645
- });
30646
- }
30647
- keyed.push({ id: idBytes, attachment });
30648
- }
30649
- keyed.sort((a, b) => {
30650
- for (let j = 0; j < a.id.length && j < b.id.length; j++) {
30651
- const av = a.id[j];
30652
- const bv = b.id[j];
30653
- if (av !== bv) return av - bv;
30654
- }
30655
- return a.id.length - b.id.length;
28602
+ return [...attachments].sort((a, b) => {
28603
+ const invoiceA = a.sparkInvoice;
28604
+ const invoiceB = b.sparkInvoice;
28605
+ return invoiceA < invoiceB ? -1 : invoiceA > invoiceB ? 1 : 0;
30656
28606
  });
30657
- return keyed.map((k) => k.attachment);
30658
28607
  }
30659
28608
  async function hashPartialTokenTransaction(partialTokenTransaction) {
30660
28609
  if (!partialTokenTransaction) {
@@ -32398,6 +30347,31 @@ var UserRequest3 = `
32398
30347
  `;
32399
30348
 
32400
30349
  // src/graphql/client.ts
30350
+ var RETRYABLE_STATUS_CODES = /* @__PURE__ */ new Set([
30351
+ 502,
30352
+ // Bad Gateway
30353
+ 503,
30354
+ // Service Unavailable
30355
+ 504
30356
+ // Gateway Timeout
30357
+ ]);
30358
+ function createRetryFetch(baseFetch, maxRetries = 5, baseDelayMs = 1e3) {
30359
+ return async (input, init) => {
30360
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
30361
+ const response = await baseFetch(input, init);
30362
+ if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < maxRetries) {
30363
+ const delay = Math.min(baseDelayMs * Math.pow(2, attempt), 1e4);
30364
+ console.warn(
30365
+ `[SspClient] HTTP ${response.status} (attempt ${attempt + 1}/${maxRetries + 1}), retrying in ${delay}ms`
30366
+ );
30367
+ await new Promise((r) => setTimeout(r, delay));
30368
+ continue;
30369
+ }
30370
+ return response;
30371
+ }
30372
+ throw new Error("Retry loop exited unexpectedly");
30373
+ };
30374
+ }
32401
30375
  var SspClient = class {
32402
30376
  requester;
32403
30377
  signer;
@@ -32408,6 +30382,7 @@ var SspClient = class {
32408
30382
  this.authProvider = new SparkAuthProvider();
32409
30383
  const { fetch } = getFetch();
32410
30384
  const options = config.sspClientOptions;
30385
+ const retryFetch = createRetryFetch(fetch);
32411
30386
  this.requester = new import_core12.Requester(
32412
30387
  new import_core12.NodeKeyCache(import_core12.DefaultCrypto),
32413
30388
  options.schemaEndpoint || `graphql/spark/2025-03-19`,
@@ -32416,7 +30391,7 @@ var SspClient = class {
32416
30391
  options.baseUrl,
32417
30392
  import_core12.DefaultCrypto,
32418
30393
  void 0,
32419
- fetch
30394
+ retryFetch
32420
30395
  );
32421
30396
  }
32422
30397
  async executeRawQuery(query, needsAuth = true) {
@@ -33363,22 +31338,24 @@ var BaseTransferService = class {
33363
31338
  signingCommitments.signingCommitments.slice(2 * leaves.length)
33364
31339
  );
33365
31340
  const sparkFrost2 = getSparkFrost();
33366
- const encryptedKeyTweaks = {};
33367
- for (const [key, value] of keyTweakInputMap) {
33368
- const protoToEncrypt = {
33369
- leavesToSend: value
33370
- };
33371
- const protoToEncryptBinary = SendLeafKeyTweaks.encode(protoToEncrypt).finish();
33372
- const operator = this.config.getSigningOperators()[key];
33373
- if (!operator) {
33374
- throw new SparkValidationError("Operator not found");
33375
- }
33376
- const encryptedProto = await sparkFrost2.encryptEcies(
33377
- protoToEncryptBinary,
33378
- (0, import_utils21.hexToBytes)(operator.identityPublicKey)
33379
- );
33380
- encryptedKeyTweaks[key] = Uint8Array.from(encryptedProto);
33381
- }
31341
+ const encryptedKeyTweaksEntries = await Promise.all(
31342
+ Array.from(keyTweakInputMap.entries()).map(async ([key, value]) => {
31343
+ const protoToEncrypt = {
31344
+ leavesToSend: value
31345
+ };
31346
+ const protoToEncryptBinary = SendLeafKeyTweaks.encode(protoToEncrypt).finish();
31347
+ const operator = this.config.getSigningOperators()[key];
31348
+ if (!operator) {
31349
+ throw new SparkValidationError("Operator not found");
31350
+ }
31351
+ const encryptedProto = await sparkFrost2.encryptEcies(
31352
+ protoToEncryptBinary,
31353
+ (0, import_utils21.hexToBytes)(operator.identityPublicKey)
31354
+ );
31355
+ return [key, Uint8Array.from(encryptedProto)];
31356
+ })
31357
+ );
31358
+ const encryptedKeyTweaks = Object.fromEntries(encryptedKeyTweaksEntries);
33382
31359
  const transferPackage = {
33383
31360
  leavesToSend: cpfpLeafSigningJobs,
33384
31361
  keyTweakPackage: encryptedKeyTweaks,
@@ -33424,22 +31401,24 @@ var BaseTransferService = class {
33424
31401
  paymentHash
33425
31402
  );
33426
31403
  const sparkFrost2 = getSparkFrost();
33427
- const encryptedKeyTweaks = {};
33428
- for (const [key, value] of keyTweakInputMap) {
33429
- const protoToEncrypt = {
33430
- leavesToSend: value
33431
- };
33432
- const protoToEncryptBinary = SendLeafKeyTweaks.encode(protoToEncrypt).finish();
33433
- const operator = this.config.getSigningOperators()[key];
33434
- if (!operator) {
33435
- throw new SparkValidationError("Operator not found");
33436
- }
33437
- const encryptedProto = await sparkFrost2.encryptEcies(
33438
- protoToEncryptBinary,
33439
- (0, import_utils21.hexToBytes)(operator.identityPublicKey)
33440
- );
33441
- encryptedKeyTweaks[key] = Uint8Array.from(encryptedProto);
33442
- }
31404
+ const encryptedKeyTweaksEntries = await Promise.all(
31405
+ Array.from(keyTweakInputMap.entries()).map(async ([key, value]) => {
31406
+ const protoToEncrypt = {
31407
+ leavesToSend: value
31408
+ };
31409
+ const protoToEncryptBinary = SendLeafKeyTweaks.encode(protoToEncrypt).finish();
31410
+ const operator = this.config.getSigningOperators()[key];
31411
+ if (!operator) {
31412
+ throw new SparkValidationError("Operator not found");
31413
+ }
31414
+ const encryptedProto = await sparkFrost2.encryptEcies(
31415
+ protoToEncryptBinary,
31416
+ (0, import_utils21.hexToBytes)(operator.identityPublicKey)
31417
+ );
31418
+ return [key, Uint8Array.from(encryptedProto)];
31419
+ })
31420
+ );
31421
+ const encryptedKeyTweaks = Object.fromEntries(encryptedKeyTweaksEntries);
33443
31422
  const transferPackage = {
33444
31423
  leavesToSend: cpfpLeafSigningJobs,
33445
31424
  keyTweakPackage: encryptedKeyTweaks,
@@ -33566,19 +31545,25 @@ var BaseTransferService = class {
33566
31545
  }
33567
31546
  async prepareSendTransferKeyTweaks(transferID, receiverIdentityPubkey, leaves, cpfpRefundSignatureMap, directRefundSignatureMap, directFromCpfpRefundSignatureMap) {
33568
31547
  const leavesTweaksMap = /* @__PURE__ */ new Map();
33569
- for (const leaf of leaves) {
33570
- const cpfpRefundSignature = cpfpRefundSignatureMap.get(leaf.leaf.id);
33571
- const directRefundSignature = directRefundSignatureMap.get(leaf.leaf.id);
33572
- const directFromCpfpRefundSignature = directFromCpfpRefundSignatureMap.get(leaf.leaf.id);
33573
- const leafTweaksMap = await this.prepareSingleSendTransferKeyTweak(
33574
- transferID,
33575
- leaf,
33576
- receiverIdentityPubkey,
33577
- cpfpRefundSignature,
33578
- directRefundSignature,
33579
- directFromCpfpRefundSignature
33580
- );
33581
- for (const [identifier, leafTweak] of leafTweaksMap) {
31548
+ const results = await Promise.all(
31549
+ leaves.map(async (leaf) => {
31550
+ const cpfpRefundSignature = cpfpRefundSignatureMap.get(leaf.leaf.id);
31551
+ const directRefundSignature = directRefundSignatureMap.get(
31552
+ leaf.leaf.id
31553
+ );
31554
+ const directFromCpfpRefundSignature = directFromCpfpRefundSignatureMap.get(leaf.leaf.id);
31555
+ return await this.prepareSingleSendTransferKeyTweak(
31556
+ transferID,
31557
+ leaf,
31558
+ receiverIdentityPubkey,
31559
+ cpfpRefundSignature,
31560
+ directRefundSignature,
31561
+ directFromCpfpRefundSignature
31562
+ );
31563
+ })
31564
+ );
31565
+ for (const result of results) {
31566
+ for (const [identifier, leafTweak] of result) {
33582
31567
  leavesTweaksMap.set(identifier, [
33583
31568
  ...leavesTweaksMap.get(identifier) || [],
33584
31569
  leafTweak
@@ -33663,15 +31648,10 @@ var TransferService = class extends BaseTransferService {
33663
31648
  super(config, connectionManager, signingService);
33664
31649
  }
33665
31650
  async claimTransfer(transfer, leaves) {
33666
- let proofMap;
33667
31651
  if (transfer.status === 2 /* TRANSFER_STATUS_SENDER_KEY_TWEAKED */) {
33668
- proofMap = await this.claimTransferTweakKeys(transfer, leaves);
31652
+ await this.claimTransferTweakKeys(transfer, leaves);
33669
31653
  }
33670
- const signatures = await this.claimTransferSignRefunds(
33671
- transfer,
33672
- leaves,
33673
- proofMap
33674
- );
31654
+ const signatures = await this.claimTransferSignRefunds(transfer, leaves);
33675
31655
  return await this.finalizeNodeSignatures(signatures);
33676
31656
  }
33677
31657
  // When transferIds is not provided, all pending transfers for the receiver will be returned.
@@ -33722,31 +31702,33 @@ var TransferService = class extends BaseTransferService {
33722
31702
  }
33723
31703
  async verifyPendingTransfer(transfer) {
33724
31704
  const leafPubKeyMap = /* @__PURE__ */ new Map();
33725
- for (const leaf of transfer.leaves) {
33726
- if (!leaf.leaf) {
33727
- throw new Error("Leaf is undefined");
33728
- }
33729
- const encoder = new TextEncoder();
33730
- const leafIdBytes = encoder.encode(leaf.leaf.id);
33731
- const transferIdBytes = encoder.encode(transfer.id);
33732
- const payload = new Uint8Array([
33733
- ...leafIdBytes,
33734
- ...transferIdBytes,
33735
- ...leaf.secretCipher
33736
- ]);
33737
- const payloadHash = (0, import_sha212.sha256)(payload);
33738
- if (!import_secp256k112.secp256k1.verify(
33739
- leaf.signature,
33740
- payloadHash,
33741
- transfer.senderIdentityPublicKey
33742
- )) {
33743
- throw new Error("Signature verification failed");
33744
- }
33745
- const leafSecret = await this.config.signer.decryptEcies(
33746
- leaf.secretCipher
33747
- );
33748
- leafPubKeyMap.set(leaf.leaf.id, leafSecret);
33749
- }
31705
+ await Promise.all(
31706
+ transfer.leaves.map(async (leaf) => {
31707
+ if (!leaf.leaf) {
31708
+ throw new Error("Leaf is undefined");
31709
+ }
31710
+ const encoder = new TextEncoder();
31711
+ const leafIdBytes = encoder.encode(leaf.leaf.id);
31712
+ const transferIdBytes = encoder.encode(transfer.id);
31713
+ const payload = new Uint8Array([
31714
+ ...leafIdBytes,
31715
+ ...transferIdBytes,
31716
+ ...leaf.secretCipher
31717
+ ]);
31718
+ const payloadHash = (0, import_sha212.sha256)(payload);
31719
+ if (!import_secp256k112.secp256k1.verify(
31720
+ leaf.signature,
31721
+ payloadHash,
31722
+ transfer.senderIdentityPublicKey
31723
+ )) {
31724
+ throw new Error("Signature verification failed");
31725
+ }
31726
+ const leafSecret = await this.config.signer.decryptEcies(
31727
+ leaf.secretCipher
31728
+ );
31729
+ leafPubKeyMap.set(leaf.leaf.id, leafSecret);
31730
+ })
31731
+ );
33750
31732
  return leafPubKeyMap;
33751
31733
  }
33752
31734
  async queryTransfer(transferId) {
@@ -33808,29 +31790,31 @@ var TransferService = class extends BaseTransferService {
33808
31790
  async sendTransferSignRefundInternal(leaves, receiverIdentityPubkey, expiryTime, forSwap) {
33809
31791
  const transferId = (0, import_uuidv72.uuidv7)();
33810
31792
  const leafDataMap = /* @__PURE__ */ new Map();
33811
- for (const leaf of leaves) {
33812
- const signingNonceCommitment = await this.config.signer.getRandomSigningCommitment();
33813
- const directSigningNonceCommitment = await this.config.signer.getRandomSigningCommitment();
33814
- const directFromCpfpRefundSigningNonceCommitment = await this.config.signer.getRandomSigningCommitment();
33815
- const tx = getTxFromRawTxBytes(leaf.leaf.nodeTx);
33816
- const refundTx = getTxFromRawTxBytes(leaf.leaf.refundTx);
33817
- const directTx = leaf.leaf.directTx.length > 0 ? getTxFromRawTxBytes(leaf.leaf.directTx) : void 0;
33818
- const directRefundTx = leaf.leaf.directRefundTx.length > 0 ? getTxFromRawTxBytes(leaf.leaf.directRefundTx) : void 0;
33819
- const directFromCpfpRefundTx = leaf.leaf.directFromCpfpRefundTx.length > 0 ? getTxFromRawTxBytes(leaf.leaf.directFromCpfpRefundTx) : void 0;
33820
- leafDataMap.set(leaf.leaf.id, {
33821
- keyDerivation: leaf.keyDerivation,
33822
- receivingPubkey: receiverIdentityPubkey,
33823
- signingNonceCommitment,
33824
- directSigningNonceCommitment,
33825
- tx,
33826
- directTx,
33827
- refundTx,
33828
- directRefundTx,
33829
- directFromCpfpRefundTx,
33830
- directFromCpfpRefundSigningNonceCommitment,
33831
- vout: leaf.leaf.vout
33832
- });
33833
- }
31793
+ await Promise.all(
31794
+ leaves.map(async (leaf) => {
31795
+ const signingNonceCommitment = await this.config.signer.getRandomSigningCommitment();
31796
+ const directSigningNonceCommitment = await this.config.signer.getRandomSigningCommitment();
31797
+ const directFromCpfpRefundSigningNonceCommitment = await this.config.signer.getRandomSigningCommitment();
31798
+ const tx = getTxFromRawTxBytes(leaf.leaf.nodeTx);
31799
+ const refundTx = getTxFromRawTxBytes(leaf.leaf.refundTx);
31800
+ const directTx = leaf.leaf.directTx.length > 0 ? getTxFromRawTxBytes(leaf.leaf.directTx) : void 0;
31801
+ const directRefundTx = leaf.leaf.directRefundTx.length > 0 ? getTxFromRawTxBytes(leaf.leaf.directRefundTx) : void 0;
31802
+ const directFromCpfpRefundTx = leaf.leaf.directFromCpfpRefundTx.length > 0 ? getTxFromRawTxBytes(leaf.leaf.directFromCpfpRefundTx) : void 0;
31803
+ leafDataMap.set(leaf.leaf.id, {
31804
+ keyDerivation: leaf.keyDerivation,
31805
+ receivingPubkey: receiverIdentityPubkey,
31806
+ signingNonceCommitment,
31807
+ directSigningNonceCommitment,
31808
+ tx,
31809
+ directTx,
31810
+ refundTx,
31811
+ directRefundTx,
31812
+ directFromCpfpRefundTx,
31813
+ directFromCpfpRefundSigningNonceCommitment,
31814
+ vout: leaf.leaf.vout
31815
+ });
31816
+ })
31817
+ );
33834
31818
  const signingJobs = await this.prepareRefundSoSigningJobs(
33835
31819
  leaves,
33836
31820
  leafDataMap
@@ -33892,65 +31876,71 @@ var TransferService = class extends BaseTransferService {
33892
31876
  }
33893
31877
  async prepareRefundSoSigningJobs(leaves, leafDataMap, isForClaim) {
33894
31878
  const signingJobs = [];
33895
- for (const leaf of leaves) {
33896
- const refundSigningData = leafDataMap.get(leaf.leaf.id);
33897
- if (!refundSigningData) {
33898
- throw new Error(`Leaf data not found for leaf ${leaf.leaf.id}`);
33899
- }
33900
- const nodeTx = getTxFromRawTxBytes(leaf.leaf.nodeTx);
33901
- let directNodeTx;
33902
- if (leaf.leaf.directTx.length > 0) {
33903
- directNodeTx = getTxFromRawTxBytes(leaf.leaf.directTx);
33904
- }
33905
- const currRefundTx = getTxFromRawTxBytes(leaf.leaf.refundTx);
33906
- const currentSequence = currRefundTx.getInput(0).sequence;
33907
- if (!currentSequence) {
33908
- throw new SparkValidationError("Invalid refund transaction", {
33909
- field: "sequence",
33910
- value: currRefundTx.getInput(0),
33911
- expected: "Non-null sequence"
33912
- });
33913
- }
33914
- const refundTxsParams = {
33915
- nodeTx,
33916
- directNodeTx,
33917
- sequence: currentSequence,
33918
- receivingPubkey: refundSigningData.receivingPubkey,
33919
- network: this.config.getNetwork()
33920
- };
33921
- const { cpfpRefundTx, directRefundTx, directFromCpfpRefundTx } = isForClaim ? createCurrentTimelockRefundTxs(refundTxsParams) : createDecrementedTimelockRefundTxs(refundTxsParams);
33922
- refundSigningData.refundTx = cpfpRefundTx;
33923
- refundSigningData.directRefundTx = directRefundTx;
33924
- refundSigningData.directFromCpfpRefundTx = directFromCpfpRefundTx;
33925
- const cpfpRefundNonceCommitmentProto = refundSigningData.signingNonceCommitment;
33926
- const directRefundNonceCommitmentProto = refundSigningData.directSigningNonceCommitment;
33927
- const directFromCpfpRefundNonceCommitmentProto = refundSigningData.directFromCpfpRefundSigningNonceCommitment;
33928
- const signingPublicKey = await this.config.signer.getPublicKeyFromDerivation(
33929
- refundSigningData.keyDerivation
33930
- );
33931
- signingJobs.push({
33932
- leafId: leaf.leaf.id,
33933
- refundTxSigningJob: {
33934
- signingPublicKey,
33935
- rawTx: cpfpRefundTx.toBytes(),
33936
- signingNonceCommitment: cpfpRefundNonceCommitmentProto.commitment
33937
- },
33938
- directRefundTxSigningJob: directRefundTx ? {
33939
- signingPublicKey,
33940
- rawTx: directRefundTx.toBytes(),
33941
- signingNonceCommitment: directRefundNonceCommitmentProto.commitment
33942
- } : void 0,
33943
- directFromCpfpRefundTxSigningJob: directFromCpfpRefundTx ? {
33944
- signingPublicKey,
33945
- rawTx: directFromCpfpRefundTx.toBytes(),
33946
- signingNonceCommitment: directFromCpfpRefundNonceCommitmentProto.commitment
33947
- } : void 0
33948
- });
31879
+ const results = await Promise.all(
31880
+ leaves.map(async (leaf) => {
31881
+ const refundSigningData = leafDataMap.get(leaf.leaf.id);
31882
+ if (!refundSigningData) {
31883
+ throw new Error(`Leaf data not found for leaf ${leaf.leaf.id}`);
31884
+ }
31885
+ const nodeTx = getTxFromRawTxBytes(leaf.leaf.nodeTx);
31886
+ let directNodeTx;
31887
+ if (leaf.leaf.directTx.length > 0) {
31888
+ directNodeTx = getTxFromRawTxBytes(leaf.leaf.directTx);
31889
+ }
31890
+ const currRefundTx = getTxFromRawTxBytes(leaf.leaf.refundTx);
31891
+ const currentSequence = currRefundTx.getInput(0).sequence;
31892
+ if (!currentSequence) {
31893
+ throw new SparkValidationError("Invalid refund transaction", {
31894
+ field: "sequence",
31895
+ value: currRefundTx.getInput(0),
31896
+ expected: "Non-null sequence"
31897
+ });
31898
+ }
31899
+ const refundTxsParams = {
31900
+ nodeTx,
31901
+ directNodeTx,
31902
+ sequence: currentSequence,
31903
+ receivingPubkey: refundSigningData.receivingPubkey,
31904
+ network: this.config.getNetwork()
31905
+ };
31906
+ const { cpfpRefundTx, directRefundTx, directFromCpfpRefundTx } = isForClaim ? createCurrentTimelockRefundTxs(refundTxsParams) : createDecrementedTimelockRefundTxs(refundTxsParams);
31907
+ const isZeroNode = !getCurrentTimelock(nodeTx.getInput(0).sequence);
31908
+ refundSigningData.refundTx = cpfpRefundTx;
31909
+ refundSigningData.directRefundTx = directRefundTx && !isZeroNode ? directRefundTx : void 0;
31910
+ refundSigningData.directFromCpfpRefundTx = directFromCpfpRefundTx;
31911
+ const cpfpRefundNonceCommitmentProto = refundSigningData.signingNonceCommitment;
31912
+ const directRefundNonceCommitmentProto = refundSigningData.directSigningNonceCommitment;
31913
+ const directFromCpfpRefundNonceCommitmentProto = refundSigningData.directFromCpfpRefundSigningNonceCommitment;
31914
+ const signingPublicKey = await this.config.signer.getPublicKeyFromDerivation(
31915
+ refundSigningData.keyDerivation
31916
+ );
31917
+ return {
31918
+ leafId: leaf.leaf.id,
31919
+ refundTxSigningJob: {
31920
+ signingPublicKey,
31921
+ rawTx: cpfpRefundTx.toBytes(),
31922
+ signingNonceCommitment: cpfpRefundNonceCommitmentProto.commitment
31923
+ },
31924
+ directRefundTxSigningJob: directRefundTx && !isZeroNode ? {
31925
+ signingPublicKey,
31926
+ rawTx: directRefundTx.toBytes(),
31927
+ signingNonceCommitment: directRefundNonceCommitmentProto.commitment
31928
+ } : void 0,
31929
+ directFromCpfpRefundTxSigningJob: directFromCpfpRefundTx ? {
31930
+ signingPublicKey,
31931
+ rawTx: directFromCpfpRefundTx.toBytes(),
31932
+ signingNonceCommitment: directFromCpfpRefundNonceCommitmentProto.commitment
31933
+ } : void 0
31934
+ };
31935
+ })
31936
+ );
31937
+ for (const result of results) {
31938
+ signingJobs.push(result);
33949
31939
  }
33950
31940
  return signingJobs;
33951
31941
  }
33952
31942
  async claimTransferTweakKeys(transfer, leaves) {
33953
- const { leafDataMap: leavesTweaksMap, proofMap } = await this.prepareClaimLeavesKeyTweaks(leaves);
31943
+ const leavesTweaksMap = await this.prepareClaimLeavesKeyTweaks(leaves);
33954
31944
  const errors = [];
33955
31945
  const promises = Object.entries(this.config.getSigningOperators()).map(
33956
31946
  async ([identifier, operator]) => {
@@ -33988,14 +31978,13 @@ var TransferService = class extends BaseTransferService {
33988
31978
  if (errors.length > 0) {
33989
31979
  throw errors[0];
33990
31980
  }
33991
- return proofMap;
33992
31981
  }
33993
31982
  async prepareClaimLeavesKeyTweaks(leaves) {
33994
31983
  const leafDataMap = /* @__PURE__ */ new Map();
33995
- const proofMap = /* @__PURE__ */ new Map();
33996
- for (const leaf of leaves) {
33997
- const { leafKeyTweaks: leafData, proofs } = await this.prepareClaimLeafKeyTweaks(leaf);
33998
- proofMap.set(leaf.leaf.id, proofs);
31984
+ const results = await Promise.all(
31985
+ leaves.map((leaf) => this.prepareClaimLeafKeyTweaks(leaf))
31986
+ );
31987
+ for (const { leafKeyTweaks: leafData } of results) {
33999
31988
  for (const [identifier, leafTweak] of leafData) {
34000
31989
  leafDataMap.set(identifier, [
34001
31990
  ...leafDataMap.get(identifier) || [],
@@ -34003,7 +31992,7 @@ var TransferService = class extends BaseTransferService {
34003
31992
  ]);
34004
31993
  }
34005
31994
  }
34006
- return { leafDataMap, proofMap };
31995
+ return leafDataMap;
34007
31996
  }
34008
31997
  async prepareClaimLeafKeyTweaks(leaf) {
34009
31998
  const signingOperators = this.config.getSigningOperators();
@@ -34050,24 +32039,26 @@ var TransferService = class extends BaseTransferService {
34050
32039
  }
34051
32040
  return { leafKeyTweaks: leafTweaksMap, proofs: shares[0].proofs };
34052
32041
  }
34053
- async claimTransferSignRefunds(transfer, leafKeys, proofMap) {
32042
+ async claimTransferSignRefunds(transfer, leafKeys) {
34054
32043
  const leafDataMap = /* @__PURE__ */ new Map();
34055
- for (const leafKey of leafKeys) {
34056
- const tx = getTxFromRawTxBytes(leafKey.leaf.nodeTx);
34057
- const directTx = leafKey.leaf.directTx.length > 0 ? getTxFromRawTxBytes(leafKey.leaf.directTx) : void 0;
34058
- leafDataMap.set(leafKey.leaf.id, {
34059
- keyDerivation: leafKey.newKeyDerivation,
34060
- receivingPubkey: await this.config.signer.getPublicKeyFromDerivation(
34061
- leafKey.newKeyDerivation
34062
- ),
34063
- signingNonceCommitment: await this.config.signer.getRandomSigningCommitment(),
34064
- directSigningNonceCommitment: await this.config.signer.getRandomSigningCommitment(),
34065
- directFromCpfpRefundSigningNonceCommitment: await this.config.signer.getRandomSigningCommitment(),
34066
- tx,
34067
- directTx,
34068
- vout: leafKey.leaf.vout
34069
- });
34070
- }
32044
+ await Promise.all(
32045
+ leafKeys.map(async (leafKey) => {
32046
+ const tx = getTxFromRawTxBytes(leafKey.leaf.nodeTx);
32047
+ const directTx = leafKey.leaf.directTx.length > 0 ? getTxFromRawTxBytes(leafKey.leaf.directTx) : void 0;
32048
+ leafDataMap.set(leafKey.leaf.id, {
32049
+ keyDerivation: leafKey.newKeyDerivation,
32050
+ receivingPubkey: await this.config.signer.getPublicKeyFromDerivation(
32051
+ leafKey.newKeyDerivation
32052
+ ),
32053
+ signingNonceCommitment: await this.config.signer.getRandomSigningCommitment(),
32054
+ directSigningNonceCommitment: await this.config.signer.getRandomSigningCommitment(),
32055
+ directFromCpfpRefundSigningNonceCommitment: await this.config.signer.getRandomSigningCommitment(),
32056
+ tx,
32057
+ directTx,
32058
+ vout: leafKey.leaf.vout
32059
+ });
32060
+ })
32061
+ );
34071
32062
  const signingJobs = await this.prepareRefundSoSigningJobs(
34072
32063
  leafKeys,
34073
32064
  leafDataMap,
@@ -34077,14 +32068,6 @@ var TransferService = class extends BaseTransferService {
34077
32068
  this.config.getCoordinatorAddress()
34078
32069
  );
34079
32070
  let resp;
34080
- const secretProofMap = {};
34081
- if (proofMap) {
34082
- for (const [leafId, proof] of proofMap.entries()) {
34083
- secretProofMap[leafId] = {
34084
- proofs: proof
34085
- };
34086
- }
34087
- }
34088
32071
  try {
34089
32072
  resp = await sparkClient.claim_transfer_sign_refunds_v2({
34090
32073
  transferId: transfer.id,
@@ -34659,9 +32642,7 @@ var CoopExitService = class extends BaseTransferService {
34659
32642
  const signingJob = {
34660
32643
  leafId: leaf.leaf.id,
34661
32644
  refundTxSigningJob: {
34662
- signingPublicKey: await this.config.signer.getPublicKeyFromDerivation(
34663
- leaf.keyDerivation
34664
- ),
32645
+ signingPublicKey,
34665
32646
  rawTx: cpfpRefundTx.toBytes(),
34666
32647
  signingNonceCommitment: signingNonceCommitment.commitment
34667
32648
  },
@@ -34712,13 +32693,13 @@ var CoopExitService = class extends BaseTransferService {
34712
32693
  });
34713
32694
  } catch (error) {
34714
32695
  throw new SparkRequestError("Failed to initiate cooperative exit", {
34715
- operation: "cooperative_exit",
32696
+ operation: "cooperative_exit_v2",
34716
32697
  error
34717
32698
  });
34718
32699
  }
34719
32700
  if (!response.transfer) {
34720
32701
  throw new SparkRequestError("Failed to initiate cooperative exit", {
34721
- operation: "cooperative_exit",
32702
+ operation: "cooperative_exit_v2",
34722
32703
  error: new Error("No transfer in response")
34723
32704
  });
34724
32705
  }
@@ -35037,7 +33018,7 @@ var LightningService = class {
35037
33018
  });
35038
33019
  } catch (error) {
35039
33020
  throw new SparkRequestError("Failed to initiate preimage swap", {
35040
- operation: "initiate_preimage_swap",
33021
+ operation: "initiate_preimage_swap_v3",
35041
33022
  error
35042
33023
  });
35043
33024
  }
@@ -35116,12 +33097,13 @@ var SigningService = class {
35116
33097
  expected: "Non-null signing commitments"
35117
33098
  });
35118
33099
  }
33100
+ const publicKey = await this.config.signer.getPublicKeyFromDerivation(
33101
+ leaf.keyDerivation
33102
+ );
35119
33103
  const signingResult = await this.config.signer.signFrost({
35120
33104
  message: sighash,
35121
33105
  keyDerivation: leaf.keyDerivation,
35122
- publicKey: await this.config.signer.getPublicKeyFromDerivation(
35123
- leaf.keyDerivation
35124
- ),
33106
+ publicKey,
35125
33107
  selfCommitment: signingCommitment,
35126
33108
  statechainCommitments: signingCommitments,
35127
33109
  adaptorPubKey: new Uint8Array(),
@@ -35129,9 +33111,7 @@ var SigningService = class {
35129
33111
  });
35130
33112
  leafSigningJobs.push({
35131
33113
  leafId: leaf.leaf.id,
35132
- signingPublicKey: await this.config.signer.getPublicKeyFromDerivation(
35133
- leaf.keyDerivation
35134
- ),
33114
+ signingPublicKey: publicKey,
35135
33115
  rawTx: refundTx.toBytes(),
35136
33116
  signingNonceCommitment: signingCommitment.commitment,
35137
33117
  userSignature: signingResult,
@@ -39529,7 +37509,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
39529
37509
  * @param tokenIdentifiers - Optional array of token identifiers to filter by
39530
37510
  * @param outputIds - Optional array of output IDs to filter by
39531
37511
  * @param order - Optional order for results ("ASCENDING" or "DESCENDING", defaults to "DESCENDING")
39532
- * @param pageSize - Optional page size (defaults to 100)
37512
+ * @param pageSize - Optional page size (defaults to 50)
39533
37513
  * @param offset - Optional offset for pagination (defaults to 0)
39534
37514
  * @returns Promise resolving to array of token transactions with their current status
39535
37515
  */
@@ -39552,7 +37532,7 @@ var SparkWallet = class _SparkWallet extends import_eventemitter3.EventEmitter {
39552
37532
  tokenIdentifiers,
39553
37533
  outputIds,
39554
37534
  order,
39555
- pageSize: pageSize ?? 100,
37535
+ pageSize: pageSize ?? 50,
39556
37536
  offset: offset ?? 0
39557
37537
  });
39558
37538
  }