browserscale-ts 1.7.1 → 1.9.0
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.
- package/README.md +137 -81
- package/dist/browser.d.ts +1 -1
- package/dist/browser.js +1 -1
- package/dist/browserscale.browser.js +533 -216
- package/dist/client.d.ts +266 -60
- package/dist/client.js +348 -81
- package/dist/defaults.d.ts +11 -9
- package/dist/defaults.js +15 -12
- package/dist/dom-mirror.d.ts +27 -0
- package/dist/dom-mirror.js +27 -0
- package/dist/errors.d.ts +43 -0
- package/dist/errors.js +37 -0
- package/dist/gen/wrc_pb.d.ts +466 -91
- package/dist/gen/wrc_pb.js +145 -135
- package/dist/index.d.ts +15 -9
- package/dist/index.js +17 -13
- package/dist/internal/convert.d.ts +4 -2
- package/dist/internal/convert.js +28 -0
- package/dist/locator.d.ts +12 -11
- package/dist/locator.js +14 -22
- package/dist/network-capture.d.ts +3 -2
- package/dist/network-capture.js +3 -2
- package/dist/options.d.ts +1 -1
- package/dist/scripts.d.ts +4 -3
- package/dist/scripts.js +4 -3
- package/dist/types.d.ts +52 -0
- package/package.json +1 -1
|
@@ -3799,82 +3799,78 @@ function serviceDesc(file, path, ...paths) {
|
|
|
3799
3799
|
}
|
|
3800
3800
|
|
|
3801
3801
|
// src/gen/wrc_pb.ts
|
|
3802
|
-
var file_wrc = /* @__PURE__ */ fileDesc("Cgl3cmMucHJvdG8SD2Jyb3dzZXJzY2FsZS52MSI7CgRSZWN0EgkKAXgYASABKAESCQoBeRgCIAEoARINCgV3aWR0aBgDIAEoARIOCgZoZWlnaHQYBCABKAEihgIKCUZyYW1lSW5mbxIQCghmcmFtZV9pZBgBIAEoCRILCgN1cmwYAiABKAkSEAoIaXNfb29waWYYAyABKAgSFgoOaGFzX2pzX2NvbnRleHQYBCABKAgSEgoKaXNfbG9hZGluZxgFIAEoCBISCgppc192aXNpYmxlGAYgASgIEiwKDWFic29sdXRlX3JlY3QYByABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIsCg1yZWxhdGl2ZV9yZWN0GAggASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSLAoIY2hpbGRyZW4YCSADKAsyGi5icm93c2Vyc2NhbGUudjEuRnJhbWVJbmZvIqwBCghQYWdlSW5mbxIPCgdwYWdlX2lkGAEgASgJEhoKEmJyb3dzZXJfY29udGV4dF9pZBgCIAEoCRILCgN1cmwYAyABKAkSDQoFdGl0bGUYBCABKAkSJwoIdmlld3BvcnQYBSABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIuCgpmcmFtZV90cmVlGAYgASgLMhouYnJvd3NlcnNjYWxlLnYxLkZyYW1lSW5mbyIlCgZIZWFkZXISDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSKAAQoSSW50ZXJjZXB0ZWRSZXF1ZXN0Eg4KBm1ldGhvZBgBIAEoCRILCgN1cmwYAiABKAkSKAoHaGVhZGVycxgDIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISDAoEYm9keRgEIAEoCRIVCg1yZXNvdXJjZV90eXBlGAUgASgJIm8KE0ludGVyY2VwdGVkUmVzcG9uc2USCwoDdXJsGAEgASgJEhMKC3N0YXR1c19jb2RlGAIgASgFEigKB2hlYWRlcnMYAyADKAsyFy5icm93c2Vyc2NhbGUudjEuSGVhZGVyEgwKBGJvZHkYBCABKAkijgEKEkhlYWRlck1vZGlmaWNhdGlvbhIMCgRuYW1lGAEgASgJEhIKBXZhbHVlGAIgASgJSACIAQESDgoGYWN0aW9uGAMgASgJEhMKBmJlZm9yZRgEIAEoCUgBiAEBEhIKBWFmdGVyGAUgASgJSAKIAQFCCAoGX3ZhbHVlQgkKB19iZWZvcmVCCAoGX2FmdGVyIk0KEkNvb2tpZVBhcnRpdGlvbktleRIWCg50b3BfbGV2ZWxfc2l0ZRgBIAEoCRIfChdoYXNfY3Jvc3Nfc2l0ZV9hbmNlc3RvchgCIAEoCCK/AwoLQ29va2llUGFyYW0SDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCRIQCgN1cmwYAyABKAlIAIgBARIOCgZkb21haW4YBCABKAkSDAoEcGF0aBgFIAEoCRITCgZzZWN1cmUYBiABKAhIAYgBARIWCglodHRwX29ubHkYByABKAhIAogBARIWCglzYW1lX3NpdGUYCCABKAlIA4gBARIUCgdleHBpcmVzGAkgASgBSASIAQESFQoIcHJpb3JpdHkYCiABKAlIBYgBARIaCg1zb3VyY2Vfc2NoZW1lGAsgASgJSAaIAQESGAoLc291cmNlX3BvcnQYDCABKAVIB4gBARI/Cg1wYXJ0aXRpb25fa2V5GA0gASgLMiMuYnJvd3NlcnNjYWxlLnYxLkNvb2tpZVBhcnRpdGlvbktleUgIiAEBQgYKBF91cmxCCQoHX3NlY3VyZUIMCgpfaHR0cF9vbmx5QgwKCl9zYW1lX3NpdGVCCgoIX2V4cGlyZXNCCwoJX3ByaW9yaXR5QhAKDl9zb3VyY2Vfc2NoZW1lQg4KDF9zb3VyY2VfcG9ydEIQCg5fcGFydGl0aW9uX2tleSKtAQoNV2FpdENvbmRpdGlvbhIVCghzZWxlY3RvchgBIAEoCUgAiAEBEhoKDWpzX2V4cHJlc3Npb24YAiABKAlIAYgBARIUCgd2aXNpYmxlGAMgASgISAKIAQESGAoLc3RlYWR5X3RpbWUYBCABKAFIA4gBAUILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCgoIX3Zpc2libGVCDgoMX3N0ZWFkeV90aW1lIrsBCgpXYWl0UmVzdWx0Eg0KBWluZGV4GAEgASgFEhAKCGZyYW1lX2lkGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRISCgppc192aXNpYmxlGAQgASgIEiUKBmJvdW5kcxgFIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Ei4KBWVycm9yGAYgASgLMhouYnJvd3NlcnNjYWxlLnYxLldhaXRFcnJvckgAiAEBQggKBl9lcnJvciLsAQoTV2FpdENvbmRpdGlvblN0YXR1cxINCgVpbmRleBgBIAEoBRINCgVzdGF0ZRgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEAoIZnJhbWVfaWQYBCABKAkSEgoKaXNfdmlzaWJsZRgFIAEoCBIqCgZib3VuZHMYBiABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdEgAiAEBEjQKCG9jY2x1ZGVyGAcgASgLMh0uYnJvd3NlcnNjYWxlLnYxLk9jY2x1ZGVySW5mb0gBiAEBQgkKB19ib3VuZHNCCwoJX29jY2x1ZGVyImQKCVdhaXRFcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSOAoKY29uZGl0aW9ucxgDIAMoCzIkLmJyb3dzZXJzY2FsZS52MS5XYWl0Q29uZGl0aW9uU3RhdHVzIqYBCg1FbGVtZW50UmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhIKCmlzX3Zpc2libGUYBCABKAgSJQoGYm91bmRzGAUgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSDgoGcm9vdF94GAYgASgBEg4KBnJvb3RfeRgHIAEoASLSAwoMT2NjbHVkZXJJbmZvEhcKD2JhY2tlbmRfbm9kZV9pZBgBIAEoBRIQCghmcmFtZV9pZBgCIAEoCRIQCgh0YWdfbmFtZRgDIAEoCRIPCgJpZBgEIAEoCUgAiAEBEhcKCmNsYXNzX25hbWUYBSABKAlIAYgBARIRCgR0ZXh0GAYgASgJSAKIAQESJQoGYm91bmRzGAcgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSGwoOcG9pbnRlcl9ldmVudHMYCCABKAlIA4gBARIXCgp2aXNpYmlsaXR5GAkgASgJSASIAQESFAoHb3BhY2l0eRgKIAEoAUgFiAEBEhQKB3pfaW5kZXgYCyABKAlIBogBARIlChhoaXR0YWJsZV93aGlsZV9pbnZpc2libGUYDCABKAhIB4gBARIVCghwb3NpdGlvbhgNIAEoCUgIiAEBQgUKA19pZEINCgtfY2xhc3NfbmFtZUIHCgVfdGV4dEIRCg9fcG9pbnRlcl9ldmVudHNCDQoLX3Zpc2liaWxpdHlCCgoIX29wYWNpdHlCCgoIX3pfaW5kZXhCGwoZX2hpdHRhYmxlX3doaWxlX2ludmlzaWJsZUILCglfcG9zaXRpb24ioAEKCkNsaWNrRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEjQKCG9jY2x1ZGVyGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLk9jY2x1ZGVySW5mb0gAiAEBEhwKD2V2YWRlX2F0dGVtcHRlZBgEIAEoCEgBiAEBQgsKCV9vY2NsdWRlckISChBfZXZhZGVfYXR0ZW1wdGVkIt8BCgtDbGlja1Jlc3VsdBIPCgdzdWNjZXNzGAEgASgIEhAKCGZyYW1lX2lkGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRISCgppc192aXNpYmxlGAQgASgIEiUKBmJvdW5kcxgFIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Eg4KBnJvb3RfeBgGIAEoARIOCgZyb290X3kYByABKAESLwoFZXJyb3IYCCABKAsyGy5icm93c2Vyc2NhbGUudjEuQ2xpY2tFcnJvckgAiAEBQggKBl9lcnJvciKeAgoMUmVhY3Rpb25JbmZvEhMKC3JlYWN0aW9uX2lkGAEgASgJEhsKDm1hdGNoX3NlbGVjdG9yGAIgASgJSACIAQESIAoTbWF0Y2hfanNfZXhwcmVzc2lvbhgDIAEoCUgBiAEBEhwKD2FjdGlvbl9zZWxlY3RvchgEIAEoCUgCiAEBEiEKFGFjdGlvbl9qc19leHByZXNzaW9uGAUgASgJSAOIAQESEAoIZnJhbWVfaWQYBiABKAkSDwoHdmlzaWJsZRgHIAEoCEIRCg9fbWF0Y2hfc2VsZWN0b3JCFgoUX21hdGNoX2pzX2V4cHJlc3Npb25CEgoQX2FjdGlvbl9zZWxlY3RvckIXChVfYWN0aW9uX2pzX2V4cHJlc3Npb24i1gMKEkFkZFJlYWN0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIbCg5tYXRjaF9zZWxlY3RvchgEIAEoCUgAiAEBEiAKE21hdGNoX2pzX2V4cHJlc3Npb24YBSABKAlIAYgBARIVCghmcmFtZV9pZBgGIAEoCUgCiAEBEhQKB3Zpc2libGUYByABKAhIA4gBARIcCg9hY3Rpb25fc2VsZWN0b3IYCCABKAlIBIgBARIhChRhY3Rpb25fanNfZXhwcmVzc2lvbhgJIAEoCUgFiAEBEhMKBmJ1dHRvbhgKIAEoCUgGiAEBEhgKC2NsaWNrX2NvdW50GAsgASgFSAeIAQESFQoIaW50ZXJ2YWwYDCABKAFICIgBAUIRCg9fbWF0Y2hfc2VsZWN0b3JCFgoUX21hdGNoX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgoKCF92aXNpYmxlQhIKEF9hY3Rpb25fc2VsZWN0b3JCFwoVX2FjdGlvbl9qc19leHByZXNzaW9uQgkKB19idXR0b25CDgoMX2NsaWNrX2NvdW50QgsKCV9pbnRlcnZhbCIqChNBZGRSZWFjdGlvblJlc3BvbnNlEhMKC3JlYWN0aW9uX2lkGAEgASgJIlEKFVJlbW92ZVJlYWN0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEwoLcmVhY3Rpb25faWQYAyABKAkiKQoWUmVtb3ZlUmVhY3Rpb25SZXNwb25zZRIPCgdyZW1vdmVkGAEgASgIIkwKFExpc3RSZWFjdGlvbnNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJIkkKFUxpc3RSZWFjdGlvbnNSZXNwb25zZRIwCglyZWFjdGlvbnMYASADKAsyHS5icm93c2Vyc2NhbGUudjEuUmVhY3Rpb25JbmZvIukBCgpFbGVtZW50UmVmEhcKD2JhY2tlbmRfbm9kZV9pZBgBIAEoBRIQCgh0YWdfbmFtZRgCIAEoCRIPCgJpZBgDIAEoCUgAiAEBEhEKBG5hbWUYBCABKAlIAYgBARIXCgpjbGFzc19uYW1lGAUgASgJSAKIAQESFwoKaW5wdXRfdHlwZRgGIAEoCUgDiAEBEhEKBHRleHQYByABKAlIBIgBARIQCghlZGl0YWJsZRgIIAEoCEIFCgNfaWRCBwoFX25hbWVCDQoLX2NsYXNzX25hbWVCDQoLX2lucHV0X3R5cGVCBwoFX3RleHQi7gIKCUZpbGxFcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSNQoLY2xpY2tfZXJyb3IYAyABKAsyGy5icm93c2Vyc2NhbGUudjEuQ2xpY2tFcnJvckgAiAEBEiQKF2ZvY3VzZWRfYmFja2VuZF9ub2RlX2lkGAQgASgFSAGIAQESOQoPZm9jdXNlZF9lbGVtZW50GAUgASgLMhsuYnJvd3NlcnNjYWxlLnYxLkVsZW1lbnRSZWZIAogBARIcCg90YXJnZXRfZWRpdGFibGUYBiABKAhIA4gBARIgChN0YXJnZXRfdmFsdWVfbGVuZ3RoGAcgASgFSASIAQFCDgoMX2NsaWNrX2Vycm9yQhoKGF9mb2N1c2VkX2JhY2tlbmRfbm9kZV9pZEISChBfZm9jdXNlZF9lbGVtZW50QhIKEF90YXJnZXRfZWRpdGFibGVCFgoUX3RhcmdldF92YWx1ZV9sZW5ndGgiogEKCkZpbGxSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSDgoGcm9vdF94GAYgASgBEg4KBnJvb3RfeRgHIAEoARIuCgVlcnJvchgIIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5GaWxsRXJyb3JIAIgBAUIICgZfZXJyb3IiwgEKCkRyYWdSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSDwoHc3RhcnRfeBgEIAEoARIPCgdzdGFydF95GAUgASgBEg0KBWVuZF94GAYgASgBEg0KBWVuZF95GAcgASgBEi4KBWVycm9yGAggASgLMhouYnJvd3NlcnNjYWxlLnYxLkRyYWdFcnJvckgAiAEBQggKBl9lcnJvciJxCglEcmFnRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEjUKC2NsaWNrX2Vycm9yGAMgASgLMhsuYnJvd3NlcnNjYWxlLnYxLkNsaWNrRXJyb3JIAIgBAUIOCgxfY2xpY2tfZXJyb3IirgEKElNlbGVjdE9wdGlvblJlc3VsdBIWCg5zZWxlY3RlZF9pbmRleBgBIAEoBRIWCg5zZWxlY3RlZF92YWx1ZRgCIAEoCRIVCg1zZWxlY3RlZF90ZXh0GAMgASgJEg8KB3N1Y2Nlc3MYBCABKAgSNgoFZXJyb3IYBSABKAsyIi5icm93c2Vyc2NhbGUudjEuU2VsZWN0T3B0aW9uRXJyb3JIAIgBAUIICgZfZXJyb3IiMgoRU2VsZWN0T3B0aW9uRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIsEBCgxTY3JvbGxSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEgoKaXNfdmlzaWJsZRgEIAEoCBIlCgZib3VuZHMYBSABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIwCgVlcnJvchgIIAEoCzIcLmJyb3dzZXJzY2FsZS52MS5TY3JvbGxFcnJvckgAiAEBQggKBl9lcnJvciIsCgtTY3JvbGxFcnJvchIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAki3QEKCk1vdmVSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEgoKaXNfdmlzaWJsZRgEIAEoCBIlCgZib3VuZHMYBSABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIOCgZyb290X3gYBiABKAESDgoGcm9vdF95GAcgASgBEi4KBWVycm9yGAggASgLMhouYnJvd3NlcnNjYWxlLnYxLk1vdmVFcnJvckgAiAEBQggKBl9lcnJvciIqCglNb3ZlRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIuYBCg9TZXRQcm94eVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhcKCnByb3h5X2hvc3QYAyABKAlIAIgBARIXCgpwcm94eV9wb3J0GAQgASgFSAGIAQESGwoOcHJveHlfdXNlcm5hbWUYBSABKAlIAogBARIbCg5wcm94eV9wYXNzd29yZBgGIAEoCUgDiAEBQg0KC19wcm94eV9ob3N0Qg0KC19wcm94eV9wb3J0QhEKD19wcm94eV91c2VybmFtZUIRCg9fcHJveHlfcGFzc3dvcmQiNgoPR2V0UGFnZXNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCSI8ChBHZXRQYWdlc1Jlc3BvbnNlEigKBXBhZ2VzGAEgAygLMhkuYnJvd3NlcnNjYWxlLnYxLlBhZ2VJbmZvIpoBCg9OYXZpZ2F0ZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSCwoDdXJsGAQgASgJEhUKCHJlZmVycmVyGAUgASgJSACIAQESFAoHdGltZW91dBgGIAEoAUgBiAEBQgsKCV9yZWZlcnJlckIKCghfdGltZW91dCIxChBOYXZpZ2F0ZVJlc3BvbnNlEhAKCGZyYW1lX2lkGAEgASgJEgsKA3VybBgCIAEoCSK2AQoPTG9hZEhUTUxSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgsKA3VybBgEIAEoCRIMCgRodG1sGAUgASgJEigKB2hlYWRlcnMYBiADKAsyFy5icm93c2Vyc2NhbGUudjEuSGVhZGVyEhgKC3N0YXR1c19jb2RlGAcgASgFSACIAQFCDgoMX3N0YXR1c19jb2RlIn8KD0V2YWx1YXRlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRISCgpleHByZXNzaW9uGAQgASgJEhUKCGZyYW1lX2lkGAUgASgJSACIAQFCCwoJX2ZyYW1lX2lkInYKEEV2YWx1YXRlUmVzcG9uc2USDgoGcmVzdWx0GAEgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgCIAEoBRISCgppc192aXNpYmxlGAMgASgIEiUKBmJvdW5kcxgEIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0ImMKClJ1blJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg4KBnNvdXJjZRgDIAEoCRIUCgdwYWdlX2lkGAQgASgJSACIAQFCCgoIX3BhZ2VfaWQiLgoLUnVuUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCBIOCgZyZXN1bHQYAiABKAkiwgEKEFdhaXRGb3JBbnlQYXJhbXMSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSMgoKY29uZGl0aW9ucxgEIAMoCzIeLmJyb3dzZXJzY2FsZS52MS5XYWl0Q29uZGl0aW9uEhUKCGZyYW1lX2lkGAUgASgJSACIAQESFAoHdGltZW91dBgGIAEoAUgBiAEBQgsKCV9mcmFtZV9pZEIKCghfdGltZW91dCL1AgoTU2VsZWN0T3B0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBEhIKBWluZGV4GAggASgFSASIAQESEgoFdmFsdWUYCSABKAlIBYgBARIRCgR0ZXh0GAogASgJSAaIAQESGAoLZmlyZV9ldmVudHMYCyABKAhIB4gBAUISChBfYmFja2VuZF9ub2RlX2lkQgsKCV9zZWxlY3RvckIQCg5fanNfZXhwcmVzc2lvbkILCglfZnJhbWVfaWRCCAoGX2luZGV4QggKBl92YWx1ZUIHCgVfdGV4dEIOCgxfZmlyZV9ldmVudHMi7wEKD1Njcm9sbFRvUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBQhIKEF9iYWNrZW5kX25vZGVfaWRCCwoJX3NlbGVjdG9yQhAKDl9qc19leHByZXNzaW9uQgsKCV9mcmFtZV9pZCKZAgoNTW92ZVRvUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBEg4KAXgYCCABKAFIBIgBARIOCgF5GAkgASgBSAWIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgQKAl94QgQKAl95IoIDCgxDbGlja1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSHAoPYmFja2VuZF9ub2RlX2lkGAQgASgFSACIAQESFQoIc2VsZWN0b3IYBSABKAlIAYgBARIaCg1qc19leHByZXNzaW9uGAYgASgJSAKIAQESFQoIZnJhbWVfaWQYByABKAlIA4gBARITCgZidXR0b24YCCABKAlIBIgBARIYCgtjbGlja19jb3VudBgJIAEoBUgFiAEBEg4KAXgYCiABKAFIBogBARIOCgF5GAsgASgBSAeIAQESEwoGYWN0aW9uGAwgASgJSAiIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgkKB19idXR0b25CDgoMX2NsaWNrX2NvdW50QgQKAl94QgQKAl95QgkKB19hY3Rpb24igwMKC0RyYWdSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhwKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgAiAEBEhUKCHNlbGVjdG9yGAUgASgJSAGIAQESGgoNanNfZXhwcmVzc2lvbhgGIAEoCUgCiAEBEhUKCGZyYW1lX2lkGAcgASgJSAOIAQESFQoIb2Zmc2V0X3gYCCABKAFIBIgBARIVCghvZmZzZXRfeRgJIAEoAUgFiAEBEhcKCmFic29sdXRlX3gYCiABKAFIBogBARIXCgphYnNvbHV0ZV95GAsgASgBSAeIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgsKCV9vZmZzZXRfeEILCglfb2Zmc2V0X3lCDQoLX2Fic29sdXRlX3hCDQoLX2Fic29sdXRlX3ki7wIKC0ZpbGxSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhwKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgAiAEBEhUKCHNlbGVjdG9yGAUgASgJSAGIAQESGgoNanNfZXhwcmVzc2lvbhgGIAEoCUgCiAEBEhUKCGZyYW1lX2lkGAcgASgJSAOIAQESDAoEdGV4dBgIIAEoCRIYCgtjbGVhcl9maXJzdBgJIAEoCEgEiAEBEhQKB3RpbWVvdXQYCiABKAFIBYgBARIYCgtzdGVhZHlfdGltZRgLIAEoAUgGiAEBQhIKEF9iYWNrZW5kX25vZGVfaWRCCwoJX3NlbGVjdG9yQhAKDl9qc19leHByZXNzaW9uQgsKCV9mcmFtZV9pZEIOCgxfY2xlYXJfZmlyc3RCCgoIX3RpbWVvdXRCDgoMX3N0ZWFkeV90aW1lIkwKE1NldEJsb2NrTGlzdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhAKCHBhdHRlcm5zGAMgAygJImEKFVNldFN0YXRpY1BhdGhzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEAoIcGF0dGVybnMYAyADKAkSEQoJYmxvYl9uYW1lGAQgASgJIogBChhXYWl0Rm9yQW55UmVxdWVzdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhAKCHBhdHRlcm5zGAMgAygJEhMKC2Fib3J0X2ZsYWdzGAQgAygFEhQKB3RpbWVvdXQYBSABKAFIAIgBAUIKCghfdGltZW91dCJgChlXYWl0Rm9yQW55UmVxdWVzdFJlc3BvbnNlEg0KBWluZGV4GAEgASgFEjQKB3JlcXVlc3QYAiABKAsyIy5icm93c2Vyc2NhbGUudjEuSW50ZXJjZXB0ZWRSZXF1ZXN0IokBChlXYWl0Rm9yQW55UmVzcG9uc2VSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIQCghwYXR0ZXJucxgDIAMoCRITCgthYm9ydF9mbGFncxgEIAMoBRIUCgd0aW1lb3V0GAUgASgBSACIAQFCCgoIX3RpbWVvdXQiYwoaV2FpdEZvckFueVJlc3BvbnNlUmVzcG9uc2USDQoFaW5kZXgYASABKAUSNgoIcmVzcG9uc2UYAiABKAsyJC5icm93c2Vyc2NhbGUudjEuSW50ZXJjZXB0ZWRSZXNwb25zZSLKAQoUTW9kaWZ5UmVxdWVzdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhMKC3VybF9wYXR0ZXJuGAMgASgJEjoKDW1vZGlmaWNhdGlvbnMYBCADKAsyIy5icm93c2Vyc2NhbGUudjEuSGVhZGVyTW9kaWZpY2F0aW9uEhEKBGJvZHkYBSABKAlIAIgBARIUCgd0aW1lb3V0GAYgASgBSAGIAQFCBwoFX2JvZHlCCgoIX3RpbWVvdXQiTQoVTW9kaWZ5UmVxdWVzdFJlc3BvbnNlEjQKB3JlcXVlc3QYASABKAsyIy5icm93c2Vyc2NhbGUudjEuSW50ZXJjZXB0ZWRSZXF1ZXN0IoYBChpTdGFydE5ldHdvcmtDYXB0dXJlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEAoIcGF0dGVybnMYAyADKAkSDgoGYm9kaWVzGAQgASgJEhUKDWJvZHlfcGF0dGVybnMYBSADKAlKBAgGEAdKBAgHEAgiQAoZU3RvcE5ldHdvcmtDYXB0dXJlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiLQoaU3RvcE5ldHdvcmtDYXB0dXJlUmVzcG9uc2USDwoHc3RvcHBlZBgBIAEoCCJECh1TdHJlYW1OZXR3b3JrRXhjaGFuZ2VzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiWwoUTmV0d29ya0V4Y2hhbmdlRXZlbnQSMgoIZXhjaGFuZ2UYASABKAsyIC5icm93c2Vyc2NhbGUudjEuTmV0d29ya0V4Y2hhbmdlEg8KB2Ryb3BwZWQYAiABKAQitAUKD05ldHdvcmtFeGNoYW5nZRISCgpyZXF1ZXN0X2lkGAEgASgJEhAKCGNoYWluX2lkGAIgASgJEhYKDnJlZGlyZWN0X2luZGV4GAMgASgFEhAKCGZyYW1lX2lkGAQgASgJEhAKCGlzX29vcGlmGAUgASgIEhUKDXJlc291cmNlX3R5cGUYBiABKAkSDgoGbWV0aG9kGAcgASgJEgsKA3VybBgIIAEoCRIVCg1pbml0aWF0b3JfdXJsGAkgASgJEjAKD3JlcXVlc3RfaGVhZGVycxgKIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISIAoYcmVxdWVzdF9oZWFkZXJzX2FyZV93aXJlGAsgASgIEhQKDHJlcXVlc3RfYm9keRgMIAEoDBIeChZyZXF1ZXN0X2JvZHlfdHJ1bmNhdGVkGA0gASgIEhQKDGhhc19yZXNwb25zZRgOIAEoCBITCgtzdGF0dXNfY29kZRgPIAEoBRITCgtzdGF0dXNfdGV4dBgQIAEoCRIRCgltaW1lX3R5cGUYESABKAkSEAoIcHJvdG9jb2wYEiABKAkSFgoOcmVtb3RlX2FkZHJlc3MYEyABKAkSEwoLc2VydmVkX2Zyb20YFCABKAkSMQoQcmVzcG9uc2VfaGVhZGVycxgVIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISIQoZcmVzcG9uc2VfaGVhZGVyc19hcmVfd2lyZRgWIAEoCBIVCg1yZXNwb25zZV9ib2R5GBcgASgMEh8KF3Jlc3BvbnNlX2JvZHlfdHJ1bmNhdGVkGBggASgIEh4KFnJlc3BvbnNlX2JvZHlfY2FwdHVyZWQYGSABKAgSGwoTZW5jb2RlZF9kYXRhX2xlbmd0aBgaIAEoAxINCgVlcnJvchgbIAEoCSI4ChFHZXRDb29raWVzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiQwoSR2V0Q29va2llc1Jlc3BvbnNlEi0KB2Nvb2tpZXMYASADKAsyHC5icm93c2Vyc2NhbGUudjEuQ29va2llUGFyYW0iZwoRU2V0Q29va2llc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEi0KB2Nvb2tpZXMYAyADKAsyHC5icm93c2Vyc2NhbGUudjEuQ29va2llUGFyYW0iOgoTQ2xlYXJDb29raWVzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiKQoLU3RvcmFnZUl0ZW0SCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJIlEKElN0b3JhZ2VPcmlnaW5FbnRyeRIOCgZvcmlnaW4YASABKAkSKwoFaXRlbXMYAiADKAsyHC5icm93c2Vyc2NhbGUudjEuU3RvcmFnZUl0ZW0iWAoRR2V0U3RvcmFnZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhMKBm9yaWdpbhgDIAEoCUgAiAEBQgkKB19vcmlnaW4iSgoSR2V0U3RvcmFnZVJlc3BvbnNlEjQKB3N0b3JhZ2UYASADKAsyIy5icm93c2Vyc2NhbGUudjEuU3RvcmFnZU9yaWdpbkVudHJ5IpgBChFTZXRTdG9yYWdlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSNAoHc3RvcmFnZRgDIAMoCzIjLmJyb3dzZXJzY2FsZS52MS5TdG9yYWdlT3JpZ2luRW50cnkSGAoLY2xlYXJfZmlyc3QYBCABKAhIAIgBAUIOCgxfY2xlYXJfZmlyc3QiWgoTQ2xlYXJTdG9yYWdlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEwoGb3JpZ2luGAMgASgJSACIAQFCCQoHX29yaWdpbiIsCgtEYnNjU2Vzc2lvbhIMCgRzaXRlGAEgASgJEg8KB3Nlc3Npb24YAiABKAki2AIKC0F1dGhTZXNzaW9uEhQKB2dhaWFfaWQYASABKAlIAIgBARISCgVlbWFpbBgCIAEoCUgBiAEBEhoKDXJlZnJlc2hfdG9rZW4YAyABKAlIAogBARIgChN3cmFwcGVkX2JpbmRpbmdfa2V5GAQgASgJSAOIAQESJAoXc2lnbmluX3Njb3BlZF9kZXZpY2VfaWQYBSABKAlIBIgBARIZCgxzeW5jX2NvbnNlbnQYBiABKAhIBYgBARIzCg1kYnNjX3Nlc3Npb25zGAcgAygLMhwuYnJvd3NlcnNjYWxlLnYxLkRic2NTZXNzaW9uQgoKCF9nYWlhX2lkQggKBl9lbWFpbEIQCg5fcmVmcmVzaF90b2tlbkIWChRfd3JhcHBlZF9iaW5kaW5nX2tleUIaChhfc2lnbmluX3Njb3BlZF9kZXZpY2VfaWRCDwoNX3N5bmNfY29uc2VudCI8ChVHZXRBdXRoU2Vzc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIlgKFkdldEF1dGhTZXNzaW9uUmVzcG9uc2USMgoHc2Vzc2lvbhgBIAEoCzIcLmJyb3dzZXJzY2FsZS52MS5BdXRoU2Vzc2lvbkgAiAEBQgoKCF9zZXNzaW9uImsKFVNldEF1dGhTZXNzaW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSLQoHc2Vzc2lvbhgDIAEoCzIcLmJyb3dzZXJzY2FsZS52MS5BdXRoU2Vzc2lvbiKHAQoNR2V0RE9NUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBEhIKBWRlcHRoGAUgASgFSAGIAQFCCwoJX2ZyYW1lX2lkQggKBl9kZXB0aCIdCg5HZXRET01SZXNwb25zZRILCgNkb20YASABKAkimQQKFUdldE9ic2VydmF0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIjChZtYXhfZWxlbWVudHNfcGVyX2ZyYW1lGAQgASgFSACIAQESHAoPbWF4X3RleHRfbGVuZ3RoGAUgASgFSAGIAQESEwoGZm9ybWF0GAYgASgJSAKIAQESHQoQbWF4X3RvdGFsX3Rva2VucxgHIAEoBUgDiAEBEhsKDmluY2x1ZGVfYm91bmRzGAggASgISASIAQESGgoNdmlld3BvcnRfb25seRgJIAEoCEgFiAEBEhwKD2JhY2tlbmRfbm9kZV9pZBgKIAEoBUgGiAEBEhUKCHNlbGVjdG9yGAsgASgJSAeIAQESGgoNanNfZXhwcmVzc2lvbhgMIAEoCUgIiAEBEhUKCGZyYW1lX2lkGA0gASgJSAmIAQFCGQoXX21heF9lbGVtZW50c19wZXJfZnJhbWVCEgoQX21heF90ZXh0X2xlbmd0aEIJCgdfZm9ybWF0QhMKEV9tYXhfdG90YWxfdG9rZW5zQhEKD19pbmNsdWRlX2JvdW5kc0IQCg5fdmlld3BvcnRfb25seUISChBfYmFja2VuZF9ub2RlX2lkQgsKCV9zZWxlY3RvckIQCg5fanNfZXhwcmVzc2lvbkILCglfZnJhbWVfaWQiRQoWR2V0T2JzZXJ2YXRpb25SZXNwb25zZRITCgtvYnNlcnZhdGlvbhgBIAEoCUoECAIQA1IQb2JzZXJ2YXRpb25fanNvbiJtChFHZXRET01IYXNoUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBQgsKCV9mcmFtZV9pZCIiChJHZXRET01IYXNoUmVzcG9uc2USDAoEaGFzaBgBIAEoCSKAAQoVU3RhcnREb21NaXJyb3JSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRISCgVkZXB0aBgEIAEoBUgAiAEBEhMKBnBpZXJjZRgFIAEoCEgBiAEBQggKBl9kZXB0aEIJCgdfcGllcmNlSgQIAxAEIksKFlN0YXJ0RG9tTWlycm9yUmVzcG9uc2USDAoEcm9vdBgBIAEoCRIQCghmcmFtZV9pZBgCIAEoCRILCgNzZXEYAyABKARKBAgEEAUiQQoUU3RvcERvbU1pcnJvclJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJSgQIAxAEIpcBChVHZXREb21DaGlsZHJlblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBEhIKBWRlcHRoGAUgASgFSAGIAQFCCwoJX2ZyYW1lX2lkQggKBl9kZXB0aCI3ChZHZXREb21DaGlsZHJlblJlc3BvbnNlEhAKCGNoaWxkcmVuGAEgASgJEgsKA3NlcRgCIAEoBCJ8ChhSZWxlYXNlRG9tU3VidHJlZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBQgsKCV9mcmFtZV9pZCJ4ChRSZXZlYWxEb21Ob2RlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhUKCGZyYW1lX2lkGAQgASgJSACIAQFCCwoJX2ZyYW1lX2lkIjIKFVJldmVhbERvbU5vZGVSZXNwb25zZRIMCgRwYXRoGAEgASgJEgsKA3NlcRgCIAEoBCJgChVHZXREb21SZXZpc2lvblJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhUKCGZyYW1lX2lkGAMgASgJSACIAQFCCwoJX2ZyYW1lX2lkIioKFkdldERvbVJldmlzaW9uUmVzcG9uc2USEAoIcmV2aXNpb24YASABKAQiPQoWU3RyZWFtRG9tRXZlbnRzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiOQoJRG9tVXBkYXRlEhAKCGZyYW1lX2lkGAEgASgJEgsKA3NlcRgCIAEoBBINCgVlZGl0cxgDIAEoCSIhCglEb21SZXN5bmMSDgoGcmVhc29uGAIgASgJSgQIARACInsKCERvbUV2ZW50EiwKBnVwZGF0ZRgBIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5Eb21VcGRhdGVIABIsCgZyZXN5bmMYAiABKAsyGi5icm93c2Vyc2NhbGUudjEuRG9tUmVzeW5jSABCBwoFZXZlbnRKBAgDEARKBAgEEAUiZgoYSW5zcGVjdEF0UG9zaXRpb25SZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgkKAXgYBCABKAESCQoBeRgFIAEoASKpAQoZSW5zcGVjdEF0UG9zaXRpb25SZXNwb25zZRIXCg9iYWNrZW5kX25vZGVfaWQYASABKAUSEAoIZnJhbWVfaWQYAiABKAkSEAoIdGFnX25hbWUYAyABKAkSFAoMdGV4dF9jb250ZW50GAQgASgJEhIKCmlzX3Zpc2libGUYBSABKAgSJQoGYm91bmRzGAYgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QiiQEKFEhpZ2hsaWdodE5vZGVSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBRIVCghmcmFtZV9pZBgFIAEoCUgAiAEBQgsKCV9mcmFtZV9pZCJXChFJbnNlcnRUZXh0UmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIMCgR0ZXh0GAQgASgJInsKC1R5cGVSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgwKBHRleHQYBCABKAkSGAoLY2xlYXJfZmlyc3QYBSABKAhIAIgBAUIOCgxfY2xlYXJfZmlyc3QiugEKD1ByZXNzS2V5UmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRILCgNrZXkYBCABKAkSEQoEY29kZRgFIAEoCUgAiAEBEhYKCW1vZGlmaWVycxgGIAEoBUgBiAEBEhUKCGxvY2F0aW9uGAcgASgFSAKIAQFCBwoFX2NvZGVCDAoKX21vZGlmaWVyc0ILCglfbG9jYXRpb24ivAEKEVJlbGVhc2VLZXlSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgsKA2tleRgEIAEoCRIRCgRjb2RlGAUgASgJSACIAQESFgoJbW9kaWZpZXJzGAYgASgFSAGIAQESFQoIbG9jYXRpb24YByABKAVIAogBAUIHCgVfY29kZUIMCgpfbW9kaWZpZXJzQgsKCV9sb2NhdGlvbiJLChNHZXRTZWxlY3Rpb25SZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJIiQKFEdldFNlbGVjdGlvblJlc3BvbnNlEgwKBHRleHQYASABKAkiiwEKEVNjcmVlbnNob3RSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhMKBmZvcm1hdBgEIAEoCUgAiAEBEhQKB3F1YWxpdHkYBSABKAVIAYgBAUIJCgdfZm9ybWF0QgoKCF9xdWFsaXR5IkgKElNjcmVlbnNob3RSZXNwb25zZRITCgtkYXRhX2Jhc2U2NBgBIAEoCRINCgV3aWR0aBgCIAEoBRIOCgZoZWlnaHQYAyABKAUikwMKEVJlYWRDYW52YXNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhwKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgAiAEBEhUKCHNlbGVjdG9yGAUgASgJSAGIAQESGgoNanNfZXhwcmVzc2lvbhgGIAEoCUgCiAEBEhUKCGZyYW1lX2lkGAcgASgJSAOIAQESEwoGZm9ybWF0GAggASgJSASIAQESFAoHcXVhbGl0eRgJIAEoBUgFiAEBEg8KAnN4GAogASgFSAaIAQESDwoCc3kYCyABKAVIB4gBARIPCgJzdxgMIAEoBUgIiAEBEg8KAnNoGA0gASgFSAmIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgkKB19mb3JtYXRCCgoIX3F1YWxpdHlCBQoDX3N4QgUKA19zeUIFCgNfc3dCBQoDX3NoIpoBChJSZWFkQ2FudmFzUmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEwoLZGF0YV9iYXNlNjQYBCABKAkSDQoFd2lkdGgYBSABKAUSDgoGaGVpZ2h0GAYgASgFEhQKDG9yaWdpbl9jbGVhbhgHIAEoCCJkChNTb2x2ZUNhcHRjaGFSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRISCgp0aW1lb3V0X21zGAMgASgFEhQKDHJldHJ5X2Ftb3VudBgEIAEoBSImChRTb2x2ZUNhcHRjaGFSZXNwb25zZRIOCgZyZXN1bHQYASABKAkiZQoJSWNlU2VydmVyEgwKBHVybHMYASADKAkSFQoIdXNlcm5hbWUYAiABKAlIAIgBARIXCgpjcmVkZW50aWFsGAMgASgJSAGIAQFCCwoJX3VzZXJuYW1lQg0KC19jcmVkZW50aWFsIj0KFkdldFN0cmVhbUNvbmZpZ1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIkoKF0dldFN0cmVhbUNvbmZpZ1Jlc3BvbnNlEi8KC2ljZV9zZXJ2ZXJzGAEgAygLMhouYnJvd3NlcnNjYWxlLnYxLkljZVNlcnZlciJMChJTdGFydFN0cmVhbVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhEKCW9mZmVyX3NkcBgDIAEoCSJSChNTdGFydFN0cmVhbVJlc3BvbnNlEhIKCmFuc3dlcl9zZHAYASABKAkSJwoIdmlld3BvcnQYAiABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdCI4ChFTdG9wU3RyZWFtUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiFAoSU3RvcFN0cmVhbVJlc3BvbnNlIkMKDlNjcmlwdExvZ0VudHJ5Eg0KBWxldmVsGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEQoJdGltZXN0YW1wGAMgASgDIkcKEFJ1blNjcmlwdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg4KBnNvdXJjZRgDIAEoCSKFAQoRUnVuU2NyaXB0UmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCBIOCgZyZXN1bHQYAiABKAkSDgoGcnVuX2lkGAMgASgJEiwKA2xvZxgEIAMoCzIfLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRMb2dFbnRyeRIRCgl0cnVuY2F0ZWQYBSABKAgiSQoSU3RhcnRTY3JpcHRSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIOCgZzb3VyY2UYAyABKAkiJQoTU3RhcnRTY3JpcHRSZXNwb25zZRIOCgZydW5faWQYASABKAkiSQoSU3RvcFNjcmlwdHNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIOCgZydW5faWQYAyABKAkiJgoTU3RvcFNjcmlwdHNSZXNwb25zZRIPCgdzdG9wcGVkGAEgASgFIi8KCVNjcmlwdFJ1bhIOCgZydW5faWQYASABKAkSEgoKcnVubmluZ19tcxgCIAEoAyI8ChVMaXN0U2NyaXB0UnVuc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIkIKFkxpc3RTY3JpcHRSdW5zUmVzcG9uc2USKAoEcnVucxgBIAMoCzIaLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRSdW4iUAoZU3RyZWFtU2NyaXB0RXZlbnRzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDgoGcnVuX2lkGAMgASgJIkoKCVNjcmlwdExvZxIOCgZydW5faWQYASABKAkSLQoEbGluZRgCIAEoCzIfLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRMb2dFbnRyeSJSCg5TY3JpcHRGaW5pc2hlZBIOCgZydW5faWQYASABKAkSDwoHc3VjY2VzcxgCIAEoCBIOCgZyZXN1bHQYAyABKAkSDwoHc3RvcHBlZBgEIAEoCCKHAQoLU2NyaXB0RXZlbnQSKQoDbG9nGAEgASgLMhouYnJvd3NlcnNjYWxlLnYxLlNjcmlwdExvZ0gAEjMKCGZpbmlzaGVkGAIgASgLMh8uYnJvd3NlcnNjYWxlLnYxLlNjcmlwdEZpbmlzaGVkSAASDwoHZHJvcHBlZBgDIAEoBEIHCgVldmVudDLLKAoHQnJvd3NlchJECghTZXRQcm94eRIgLmJyb3dzZXJzY2FsZS52MS5TZXRQcm94eVJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSTwoIR2V0UGFnZXMSIC5icm93c2Vyc2NhbGUudjEuR2V0UGFnZXNSZXF1ZXN0GiEuYnJvd3NlcnNjYWxlLnYxLkdldFBhZ2VzUmVzcG9uc2USTwoITmF2aWdhdGUSIC5icm93c2Vyc2NhbGUudjEuTmF2aWdhdGVSZXF1ZXN0GiEuYnJvd3NlcnNjYWxlLnYxLk5hdmlnYXRlUmVzcG9uc2USRAoITG9hZEhUTUwSIC5icm93c2Vyc2NhbGUudjEuTG9hZEhUTUxSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5Ek8KCEV2YWx1YXRlEiAuYnJvd3NlcnNjYWxlLnYxLkV2YWx1YXRlUmVxdWVzdBohLmJyb3dzZXJzY2FsZS52MS5FdmFsdWF0ZVJlc3BvbnNlEkAKA1J1bhIbLmJyb3dzZXJzY2FsZS52MS5SdW5SZXF1ZXN0GhwuYnJvd3NlcnNjYWxlLnYxLlJ1blJlc3BvbnNlEkwKCldhaXRGb3JBbnkSIS5icm93c2Vyc2NhbGUudjEuV2FpdEZvckFueVBhcmFtcxobLmJyb3dzZXJzY2FsZS52MS5XYWl0UmVzdWx0ElkKDFNlbGVjdE9wdGlvbhIkLmJyb3dzZXJzY2FsZS52MS5TZWxlY3RPcHRpb25SZXF1ZXN0GiMuYnJvd3NlcnNjYWxlLnYxLlNlbGVjdE9wdGlvblJlc3VsdBJLCghTY3JvbGxUbxIgLmJyb3dzZXJzY2FsZS52MS5TY3JvbGxUb1JlcXVlc3QaHS5icm93c2Vyc2NhbGUudjEuU2Nyb2xsUmVzdWx0EkUKBk1vdmVUbxIeLmJyb3dzZXJzY2FsZS52MS5Nb3ZlVG9SZXF1ZXN0GhsuYnJvd3NlcnNjYWxlLnYxLk1vdmVSZXN1bHQSRAoFQ2xpY2sSHS5icm93c2Vyc2NhbGUudjEuQ2xpY2tSZXF1ZXN0GhwuYnJvd3NlcnNjYWxlLnYxLkNsaWNrUmVzdWx0EkEKBERyYWcSHC5icm93c2Vyc2NhbGUudjEuRHJhZ1JlcXVlc3QaGy5icm93c2Vyc2NhbGUudjEuRHJhZ1Jlc3VsdBJBCgRGaWxsEhwuYnJvd3NlcnNjYWxlLnYxLkZpbGxSZXF1ZXN0GhsuYnJvd3NlcnNjYWxlLnYxLkZpbGxSZXN1bHQSWAoLQWRkUmVhY3Rpb24SIy5icm93c2Vyc2NhbGUudjEuQWRkUmVhY3Rpb25SZXF1ZXN0GiQuYnJvd3NlcnNjYWxlLnYxLkFkZFJlYWN0aW9uUmVzcG9uc2USYQoOUmVtb3ZlUmVhY3Rpb24SJi5icm93c2Vyc2NhbGUudjEuUmVtb3ZlUmVhY3Rpb25SZXF1ZXN0GicuYnJvd3NlcnNjYWxlLnYxLlJlbW92ZVJlYWN0aW9uUmVzcG9uc2USXgoNTGlzdFJlYWN0aW9ucxIlLmJyb3dzZXJzY2FsZS52MS5MaXN0UmVhY3Rpb25zUmVxdWVzdBomLmJyb3dzZXJzY2FsZS52MS5MaXN0UmVhY3Rpb25zUmVzcG9uc2USTAoMU2V0QmxvY2tMaXN0EiQuYnJvd3NlcnNjYWxlLnYxLlNldEJsb2NrTGlzdFJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSUAoOU2V0U3RhdGljUGF0aHMSJi5icm93c2Vyc2NhbGUudjEuU2V0U3RhdGljUGF0aHNSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5EmoKEVdhaXRGb3JBbnlSZXF1ZXN0EikuYnJvd3NlcnNjYWxlLnYxLldhaXRGb3JBbnlSZXF1ZXN0UmVxdWVzdBoqLmJyb3dzZXJzY2FsZS52MS5XYWl0Rm9yQW55UmVxdWVzdFJlc3BvbnNlEm0KEldhaXRGb3JBbnlSZXNwb25zZRIqLmJyb3dzZXJzY2FsZS52MS5XYWl0Rm9yQW55UmVzcG9uc2VSZXF1ZXN0GisuYnJvd3NlcnNjYWxlLnYxLldhaXRGb3JBbnlSZXNwb25zZVJlc3BvbnNlEl4KDU1vZGlmeVJlcXVlc3QSJS5icm93c2Vyc2NhbGUudjEuTW9kaWZ5UmVxdWVzdFJlcXVlc3QaJi5icm93c2Vyc2NhbGUudjEuTW9kaWZ5UmVxdWVzdFJlc3BvbnNlEloKE1N0YXJ0TmV0d29ya0NhcHR1cmUSKy5icm93c2Vyc2NhbGUudjEuU3RhcnROZXR3b3JrQ2FwdHVyZVJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSbQoSU3RvcE5ldHdvcmtDYXB0dXJlEiouYnJvd3NlcnNjYWxlLnYxLlN0b3BOZXR3b3JrQ2FwdHVyZVJlcXVlc3QaKy5icm93c2Vyc2NhbGUudjEuU3RvcE5ldHdvcmtDYXB0dXJlUmVzcG9uc2UScQoWU3RyZWFtTmV0d29ya0V4Y2hhbmdlcxIuLmJyb3dzZXJzY2FsZS52MS5TdHJlYW1OZXR3b3JrRXhjaGFuZ2VzUmVxdWVzdBolLmJyb3dzZXJzY2FsZS52MS5OZXR3b3JrRXhjaGFuZ2VFdmVudDABElUKCkdldENvb2tpZXMSIi5icm93c2Vyc2NhbGUudjEuR2V0Q29va2llc1JlcXVlc3QaIy5icm93c2Vyc2NhbGUudjEuR2V0Q29va2llc1Jlc3BvbnNlEkgKClNldENvb2tpZXMSIi5icm93c2Vyc2NhbGUudjEuU2V0Q29va2llc1JlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSTAoMQ2xlYXJDb29raWVzEiQuYnJvd3NlcnNjYWxlLnYxLkNsZWFyQ29va2llc1JlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSVQoKR2V0U3RvcmFnZRIiLmJyb3dzZXJzY2FsZS52MS5HZXRTdG9yYWdlUmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5HZXRTdG9yYWdlUmVzcG9uc2USSAoKU2V0U3RvcmFnZRIiLmJyb3dzZXJzY2FsZS52MS5TZXRTdG9yYWdlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJMCgxDbGVhclN0b3JhZ2USJC5icm93c2Vyc2NhbGUudjEuQ2xlYXJTdG9yYWdlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJhCg5HZXRBdXRoU2Vzc2lvbhImLmJyb3dzZXJzY2FsZS52MS5HZXRBdXRoU2Vzc2lvblJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuR2V0QXV0aFNlc3Npb25SZXNwb25zZRJQCg5TZXRBdXRoU2Vzc2lvbhImLmJyb3dzZXJzY2FsZS52MS5TZXRBdXRoU2Vzc2lvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSSQoGR2V0RE9NEh4uYnJvd3NlcnNjYWxlLnYxLkdldERPTVJlcXVlc3QaHy5icm93c2Vyc2NhbGUudjEuR2V0RE9NUmVzcG9uc2USVQoKR2V0RE9NSGFzaBIiLmJyb3dzZXJzY2FsZS52MS5HZXRET01IYXNoUmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5HZXRET01IYXNoUmVzcG9uc2USYQoOR2V0T2JzZXJ2YXRpb24SJi5icm93c2Vyc2NhbGUudjEuR2V0T2JzZXJ2YXRpb25SZXF1ZXN0GicuYnJvd3NlcnNjYWxlLnYxLkdldE9ic2VydmF0aW9uUmVzcG9uc2USagoRSW5zcGVjdEF0UG9zaXRpb24SKS5icm93c2Vyc2NhbGUudjEuSW5zcGVjdEF0UG9zaXRpb25SZXF1ZXN0GiouYnJvd3NlcnNjYWxlLnYxLkluc3BlY3RBdFBvc2l0aW9uUmVzcG9uc2USTgoNSGlnaGxpZ2h0Tm9kZRIlLmJyb3dzZXJzY2FsZS52MS5IaWdobGlnaHROb2RlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJhCg5TdGFydERvbU1pcnJvchImLmJyb3dzZXJzY2FsZS52MS5TdGFydERvbU1pcnJvclJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuU3RhcnREb21NaXJyb3JSZXNwb25zZRJOCg1TdG9wRG9tTWlycm9yEiUuYnJvd3NlcnNjYWxlLnYxLlN0b3BEb21NaXJyb3JSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5EmEKDkdldERvbUNoaWxkcmVuEiYuYnJvd3NlcnNjYWxlLnYxLkdldERvbUNoaWxkcmVuUmVxdWVzdBonLmJyb3dzZXJzY2FsZS52MS5HZXREb21DaGlsZHJlblJlc3BvbnNlElYKEVJlbGVhc2VEb21TdWJ0cmVlEikuYnJvd3NlcnNjYWxlLnYxLlJlbGVhc2VEb21TdWJ0cmVlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJeCg1SZXZlYWxEb21Ob2RlEiUuYnJvd3NlcnNjYWxlLnYxLlJldmVhbERvbU5vZGVSZXF1ZXN0GiYuYnJvd3NlcnNjYWxlLnYxLlJldmVhbERvbU5vZGVSZXNwb25zZRJhCg5HZXREb21SZXZpc2lvbhImLmJyb3dzZXJzY2FsZS52MS5HZXREb21SZXZpc2lvblJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuR2V0RG9tUmV2aXNpb25SZXNwb25zZRJXCg9TdHJlYW1Eb21FdmVudHMSJy5icm93c2Vyc2NhbGUudjEuU3RyZWFtRG9tRXZlbnRzUmVxdWVzdBoZLmJyb3dzZXJzY2FsZS52MS5Eb21FdmVudDABElUKClNjcmVlbnNob3QSIi5icm93c2Vyc2NhbGUudjEuU2NyZWVuc2hvdFJlcXVlc3QaIy5icm93c2Vyc2NhbGUudjEuU2NyZWVuc2hvdFJlc3BvbnNlElUKClJlYWRDYW52YXMSIi5icm93c2Vyc2NhbGUudjEuUmVhZENhbnZhc1JlcXVlc3QaIy5icm93c2Vyc2NhbGUudjEuUmVhZENhbnZhc1Jlc3BvbnNlEkgKCkluc2VydFRleHQSIi5icm93c2Vyc2NhbGUudjEuSW5zZXJ0VGV4dFJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSPAoEVHlwZRIcLmJyb3dzZXJzY2FsZS52MS5UeXBlUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJECghQcmVzc0tleRIgLmJyb3dzZXJzY2FsZS52MS5QcmVzc0tleVJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkSSAoKUmVsZWFzZUtleRIiLmJyb3dzZXJzY2FsZS52MS5SZWxlYXNlS2V5UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eRJbCgxHZXRTZWxlY3Rpb24SJC5icm93c2Vyc2NhbGUudjEuR2V0U2VsZWN0aW9uUmVxdWVzdBolLmJyb3dzZXJzY2FsZS52MS5HZXRTZWxlY3Rpb25SZXNwb25zZRJbCgxTb2x2ZUNhcHRjaGESJC5icm93c2Vyc2NhbGUudjEuU29sdmVDYXB0Y2hhUmVxdWVzdBolLmJyb3dzZXJzY2FsZS52MS5Tb2x2ZUNhcHRjaGFSZXNwb25zZRJkCg9HZXRTdHJlYW1Db25maWcSJy5icm93c2Vyc2NhbGUudjEuR2V0U3RyZWFtQ29uZmlnUmVxdWVzdBooLmJyb3dzZXJzY2FsZS52MS5HZXRTdHJlYW1Db25maWdSZXNwb25zZRJYCgtTdGFydFN0cmVhbRIjLmJyb3dzZXJzY2FsZS52MS5TdGFydFN0cmVhbVJlcXVlc3QaJC5icm93c2Vyc2NhbGUudjEuU3RhcnRTdHJlYW1SZXNwb25zZRJVCgpTdG9wU3RyZWFtEiIuYnJvd3NlcnNjYWxlLnYxLlN0b3BTdHJlYW1SZXF1ZXN0GiMuYnJvd3NlcnNjYWxlLnYxLlN0b3BTdHJlYW1SZXNwb25zZRJSCglSdW5TY3JpcHQSIS5icm93c2Vyc2NhbGUudjEuUnVuU2NyaXB0UmVxdWVzdBoiLmJyb3dzZXJzY2FsZS52MS5SdW5TY3JpcHRSZXNwb25zZRJYCgtTdGFydFNjcmlwdBIjLmJyb3dzZXJzY2FsZS52MS5TdGFydFNjcmlwdFJlcXVlc3QaJC5icm93c2Vyc2NhbGUudjEuU3RhcnRTY3JpcHRSZXNwb25zZRJYCgtTdG9wU2NyaXB0cxIjLmJyb3dzZXJzY2FsZS52MS5TdG9wU2NyaXB0c1JlcXVlc3QaJC5icm93c2Vyc2NhbGUudjEuU3RvcFNjcmlwdHNSZXNwb25zZRJhCg5MaXN0U2NyaXB0UnVucxImLmJyb3dzZXJzY2FsZS52MS5MaXN0U2NyaXB0UnVuc1JlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuTGlzdFNjcmlwdFJ1bnNSZXNwb25zZRJgChJTdHJlYW1TY3JpcHRFdmVudHMSKi5icm93c2Vyc2NhbGUudjEuU3RyZWFtU2NyaXB0RXZlbnRzUmVxdWVzdBocLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRFdmVudDABQjNaMWdpdGh1Yi5jb20vYnJvd3NlcnNjYWxlL2Jyb3dzZXJzY2FsZS1nby9nZW5lcmF0ZWRiBnByb3RvMw", [file_google_protobuf_empty]);
|
|
3802
|
+
var file_wrc = /* @__PURE__ */ fileDesc("Cgl3cmMucHJvdG8SD2Jyb3dzZXJzY2FsZS52MSI7CgRSZWN0EgkKAXgYASABKAESCQoBeRgCIAEoARINCgV3aWR0aBgDIAEoARIOCgZoZWlnaHQYBCABKAEihgIKCUZyYW1lSW5mbxIQCghmcmFtZV9pZBgBIAEoCRILCgN1cmwYAiABKAkSEAoIaXNfb29waWYYAyABKAgSFgoOaGFzX2pzX2NvbnRleHQYBCABKAgSEgoKaXNfbG9hZGluZxgFIAEoCBISCgppc192aXNpYmxlGAYgASgIEiwKDWFic29sdXRlX3JlY3QYByABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIsCg1yZWxhdGl2ZV9yZWN0GAggASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSLAoIY2hpbGRyZW4YCSADKAsyGi5icm93c2Vyc2NhbGUudjEuRnJhbWVJbmZvIqwBCghQYWdlSW5mbxIPCgdwYWdlX2lkGAEgASgJEhoKEmJyb3dzZXJfY29udGV4dF9pZBgCIAEoCRILCgN1cmwYAyABKAkSDQoFdGl0bGUYBCABKAkSJwoIdmlld3BvcnQYBSABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIuCgpmcmFtZV90cmVlGAYgASgLMhouYnJvd3NlcnNjYWxlLnYxLkZyYW1lSW5mbyIlCgZIZWFkZXISDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCSKAAQoSSW50ZXJjZXB0ZWRSZXF1ZXN0Eg4KBm1ldGhvZBgBIAEoCRILCgN1cmwYAiABKAkSKAoHaGVhZGVycxgDIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISDAoEYm9keRgEIAEoCRIVCg1yZXNvdXJjZV90eXBlGAUgASgJIm8KE0ludGVyY2VwdGVkUmVzcG9uc2USCwoDdXJsGAEgASgJEhMKC3N0YXR1c19jb2RlGAIgASgFEigKB2hlYWRlcnMYAyADKAsyFy5icm93c2Vyc2NhbGUudjEuSGVhZGVyEgwKBGJvZHkYBCABKAkijgEKEkhlYWRlck1vZGlmaWNhdGlvbhIMCgRuYW1lGAEgASgJEhIKBXZhbHVlGAIgASgJSACIAQESDgoGYWN0aW9uGAMgASgJEhMKBmJlZm9yZRgEIAEoCUgBiAEBEhIKBWFmdGVyGAUgASgJSAKIAQFCCAoGX3ZhbHVlQgkKB19iZWZvcmVCCAoGX2FmdGVyIk0KEkNvb2tpZVBhcnRpdGlvbktleRIWCg50b3BfbGV2ZWxfc2l0ZRgBIAEoCRIfChdoYXNfY3Jvc3Nfc2l0ZV9hbmNlc3RvchgCIAEoCCK/AwoLQ29va2llUGFyYW0SDAoEbmFtZRgBIAEoCRINCgV2YWx1ZRgCIAEoCRIQCgN1cmwYAyABKAlIAIgBARIOCgZkb21haW4YBCABKAkSDAoEcGF0aBgFIAEoCRITCgZzZWN1cmUYBiABKAhIAYgBARIWCglodHRwX29ubHkYByABKAhIAogBARIWCglzYW1lX3NpdGUYCCABKAlIA4gBARIUCgdleHBpcmVzGAkgASgBSASIAQESFQoIcHJpb3JpdHkYCiABKAlIBYgBARIaCg1zb3VyY2Vfc2NoZW1lGAsgASgJSAaIAQESGAoLc291cmNlX3BvcnQYDCABKAVIB4gBARI/Cg1wYXJ0aXRpb25fa2V5GA0gASgLMiMuYnJvd3NlcnNjYWxlLnYxLkNvb2tpZVBhcnRpdGlvbktleUgIiAEBQgYKBF91cmxCCQoHX3NlY3VyZUIMCgpfaHR0cF9vbmx5QgwKCl9zYW1lX3NpdGVCCgoIX2V4cGlyZXNCCwoJX3ByaW9yaXR5QhAKDl9zb3VyY2Vfc2NoZW1lQg4KDF9zb3VyY2VfcG9ydEIQCg5fcGFydGl0aW9uX2tleSKtAQoNV2FpdENvbmRpdGlvbhIVCghzZWxlY3RvchgBIAEoCUgAiAEBEhoKDWpzX2V4cHJlc3Npb24YAiABKAlIAYgBARIUCgd2aXNpYmxlGAMgASgISAKIAQESGAoLc3RlYWR5X3RpbWUYBCABKAFIA4gBAUILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCgoIX3Zpc2libGVCDgoMX3N0ZWFkeV90aW1lIswBCgpXYWl0UmVzdWx0Eg0KBWluZGV4GAEgASgFEhAKCGZyYW1lX2lkGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRISCgppc192aXNpYmxlGAQgASgIEiUKBmJvdW5kcxgFIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Eg8KB3N1Y2Nlc3MYByABKAgSLgoFZXJyb3IYBiABKAsyGi5icm93c2Vyc2NhbGUudjEuV2FpdEVycm9ySACIAQFCCAoGX2Vycm9yIuwBChNXYWl0Q29uZGl0aW9uU3RhdHVzEg0KBWluZGV4GAEgASgFEg0KBXN0YXRlGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRIQCghmcmFtZV9pZBgEIAEoCRISCgppc192aXNpYmxlGAUgASgIEioKBmJvdW5kcxgGIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0SACIAQESNAoIb2NjbHVkZXIYByABKAsyHS5icm93c2Vyc2NhbGUudjEuT2NjbHVkZXJJbmZvSAGIAQFCCQoHX2JvdW5kc0ILCglfb2NjbHVkZXIiZAoJV2FpdEVycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCRI4Cgpjb25kaXRpb25zGAMgAygLMiQuYnJvd3NlcnNjYWxlLnYxLldhaXRDb25kaXRpb25TdGF0dXMipgEKDUVsZW1lbnRSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIQCghmcmFtZV9pZBgCIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYAyABKAUSEgoKaXNfdmlzaWJsZRgEIAEoCBIlCgZib3VuZHMYBSABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIOCgZyb290X3gYBiABKAESDgoGcm9vdF95GAcgASgBItIDCgxPY2NsdWRlckluZm8SFwoPYmFja2VuZF9ub2RlX2lkGAEgASgFEhAKCGZyYW1lX2lkGAIgASgJEhAKCHRhZ19uYW1lGAMgASgJEg8KAmlkGAQgASgJSACIAQESFwoKY2xhc3NfbmFtZRgFIAEoCUgBiAEBEhEKBHRleHQYBiABKAlIAogBARIlCgZib3VuZHMYByABKAsyFS5icm93c2Vyc2NhbGUudjEuUmVjdBIbCg5wb2ludGVyX2V2ZW50cxgIIAEoCUgDiAEBEhcKCnZpc2liaWxpdHkYCSABKAlIBIgBARIUCgdvcGFjaXR5GAogASgBSAWIAQESFAoHel9pbmRleBgLIAEoCUgGiAEBEiUKGGhpdHRhYmxlX3doaWxlX2ludmlzaWJsZRgMIAEoCEgHiAEBEhUKCHBvc2l0aW9uGA0gASgJSAiIAQFCBQoDX2lkQg0KC19jbGFzc19uYW1lQgcKBV90ZXh0QhEKD19wb2ludGVyX2V2ZW50c0INCgtfdmlzaWJpbGl0eUIKCghfb3BhY2l0eUIKCghfel9pbmRleEIbChlfaGl0dGFibGVfd2hpbGVfaW52aXNpYmxlQgsKCV9wb3NpdGlvbiItCgxDb21tYW5kRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIl0KDUNvbW1hbmRSZXN1bHQSDwoHc3VjY2VzcxgBIAEoCBIxCgVlcnJvchgCIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IioAEKCkNsaWNrRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEjQKCG9jY2x1ZGVyGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLk9jY2x1ZGVySW5mb0gAiAEBEhwKD2V2YWRlX2F0dGVtcHRlZBgEIAEoCEgBiAEBQgsKCV9vY2NsdWRlckISChBfZXZhZGVfYXR0ZW1wdGVkIt8BCgtDbGlja1Jlc3VsdBIPCgdzdWNjZXNzGAEgASgIEhAKCGZyYW1lX2lkGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRISCgppc192aXNpYmxlGAQgASgIEiUKBmJvdW5kcxgFIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Eg4KBnJvb3RfeBgGIAEoARIOCgZyb290X3kYByABKAESLwoFZXJyb3IYCCABKAsyGy5icm93c2Vyc2NhbGUudjEuQ2xpY2tFcnJvckgAiAEBQggKBl9lcnJvciKeAgoMUmVhY3Rpb25JbmZvEhMKC3JlYWN0aW9uX2lkGAEgASgJEhsKDm1hdGNoX3NlbGVjdG9yGAIgASgJSACIAQESIAoTbWF0Y2hfanNfZXhwcmVzc2lvbhgDIAEoCUgBiAEBEhwKD2FjdGlvbl9zZWxlY3RvchgEIAEoCUgCiAEBEiEKFGFjdGlvbl9qc19leHByZXNzaW9uGAUgASgJSAOIAQESEAoIZnJhbWVfaWQYBiABKAkSDwoHdmlzaWJsZRgHIAEoCEIRCg9fbWF0Y2hfc2VsZWN0b3JCFgoUX21hdGNoX2pzX2V4cHJlc3Npb25CEgoQX2FjdGlvbl9zZWxlY3RvckIXChVfYWN0aW9uX2pzX2V4cHJlc3Npb24i1gMKEkFkZFJlYWN0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIbCg5tYXRjaF9zZWxlY3RvchgEIAEoCUgAiAEBEiAKE21hdGNoX2pzX2V4cHJlc3Npb24YBSABKAlIAYgBARIVCghmcmFtZV9pZBgGIAEoCUgCiAEBEhQKB3Zpc2libGUYByABKAhIA4gBARIcCg9hY3Rpb25fc2VsZWN0b3IYCCABKAlIBIgBARIhChRhY3Rpb25fanNfZXhwcmVzc2lvbhgJIAEoCUgFiAEBEhMKBmJ1dHRvbhgKIAEoCUgGiAEBEhgKC2NsaWNrX2NvdW50GAsgASgFSAeIAQESFQoIaW50ZXJ2YWwYDCABKAFICIgBAUIRCg9fbWF0Y2hfc2VsZWN0b3JCFgoUX21hdGNoX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgoKCF92aXNpYmxlQhIKEF9hY3Rpb25fc2VsZWN0b3JCFwoVX2FjdGlvbl9qc19leHByZXNzaW9uQgkKB19idXR0b25CDgoMX2NsaWNrX2NvdW50QgsKCV9pbnRlcnZhbCJ4ChNBZGRSZWFjdGlvblJlc3BvbnNlEhMKC3JlYWN0aW9uX2lkGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIlEKFVJlbW92ZVJlYWN0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEwoLcmVhY3Rpb25faWQYAyABKAkidwoWUmVtb3ZlUmVhY3Rpb25SZXNwb25zZRIPCgdyZW1vdmVkGAEgASgIEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIkwKFExpc3RSZWFjdGlvbnNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJIpcBChVMaXN0UmVhY3Rpb25zUmVzcG9uc2USMAoJcmVhY3Rpb25zGAEgAygLMh0uYnJvd3NlcnNjYWxlLnYxLlJlYWN0aW9uSW5mbxIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciLpAQoKRWxlbWVudFJlZhIXCg9iYWNrZW5kX25vZGVfaWQYASABKAUSEAoIdGFnX25hbWUYAiABKAkSDwoCaWQYAyABKAlIAIgBARIRCgRuYW1lGAQgASgJSAGIAQESFwoKY2xhc3NfbmFtZRgFIAEoCUgCiAEBEhcKCmlucHV0X3R5cGUYBiABKAlIA4gBARIRCgR0ZXh0GAcgASgJSASIAQESEAoIZWRpdGFibGUYCCABKAhCBQoDX2lkQgcKBV9uYW1lQg0KC19jbGFzc19uYW1lQg0KC19pbnB1dF90eXBlQgcKBV90ZXh0Iu4CCglGaWxsRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEjUKC2NsaWNrX2Vycm9yGAMgASgLMhsuYnJvd3NlcnNjYWxlLnYxLkNsaWNrRXJyb3JIAIgBARIkChdmb2N1c2VkX2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgBiAEBEjkKD2ZvY3VzZWRfZWxlbWVudBgFIAEoCzIbLmJyb3dzZXJzY2FsZS52MS5FbGVtZW50UmVmSAKIAQESHAoPdGFyZ2V0X2VkaXRhYmxlGAYgASgISAOIAQESIAoTdGFyZ2V0X3ZhbHVlX2xlbmd0aBgHIAEoBUgEiAEBQg4KDF9jbGlja19lcnJvckIaChhfZm9jdXNlZF9iYWNrZW5kX25vZGVfaWRCEgoQX2ZvY3VzZWRfZWxlbWVudEISChBfdGFyZ2V0X2VkaXRhYmxlQhYKFF90YXJnZXRfdmFsdWVfbGVuZ3RoIqIBCgpGaWxsUmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEg4KBnJvb3RfeBgGIAEoARIOCgZyb290X3kYByABKAESLgoFZXJyb3IYCCABKAsyGi5icm93c2Vyc2NhbGUudjEuRmlsbEVycm9ySACIAQFCCAoGX2Vycm9yIsIBCgpEcmFnUmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEg8KB3N0YXJ0X3gYBCABKAESDwoHc3RhcnRfeRgFIAEoARINCgVlbmRfeBgGIAEoARINCgVlbmRfeRgHIAEoARIuCgVlcnJvchgIIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5EcmFnRXJyb3JIAIgBAUIICgZfZXJyb3IicQoJRHJhZ0Vycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCRI1CgtjbGlja19lcnJvchgDIAEoCzIbLmJyb3dzZXJzY2FsZS52MS5DbGlja0Vycm9ySACIAQFCDgoMX2NsaWNrX2Vycm9yIq4BChJTZWxlY3RPcHRpb25SZXN1bHQSFgoOc2VsZWN0ZWRfaW5kZXgYASABKAUSFgoOc2VsZWN0ZWRfdmFsdWUYAiABKAkSFQoNc2VsZWN0ZWRfdGV4dBgDIAEoCRIPCgdzdWNjZXNzGAQgASgIEjYKBWVycm9yGAUgASgLMiIuYnJvd3NlcnNjYWxlLnYxLlNlbGVjdE9wdGlvbkVycm9ySACIAQFCCAoGX2Vycm9yIjIKEVNlbGVjdE9wdGlvbkVycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCSLBAQoMU2Nyb2xsUmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhIKCmlzX3Zpc2libGUYBCABKAgSJQoGYm91bmRzGAUgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSMAoFZXJyb3IYCCABKAsyHC5icm93c2Vyc2NhbGUudjEuU2Nyb2xsRXJyb3JIAIgBAUIICgZfZXJyb3IiLAoLU2Nyb2xsRXJyb3ISDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJIt0BCgpNb3ZlUmVzdWx0Eg8KB3N1Y2Nlc3MYASABKAgSEAoIZnJhbWVfaWQYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhIKCmlzX3Zpc2libGUYBCABKAgSJQoGYm91bmRzGAUgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSDgoGcm9vdF94GAYgASgBEg4KBnJvb3RfeRgHIAEoARIuCgVlcnJvchgIIAEoCzIaLmJyb3dzZXJzY2FsZS52MS5Nb3ZlRXJyb3JIAIgBAUIICgZfZXJyb3IiKgoJTW92ZUVycm9yEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCSLmAQoPU2V0UHJveHlSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIXCgpwcm94eV9ob3N0GAMgASgJSACIAQESFwoKcHJveHlfcG9ydBgEIAEoBUgBiAEBEhsKDnByb3h5X3VzZXJuYW1lGAUgASgJSAKIAQESGwoOcHJveHlfcGFzc3dvcmQYBiABKAlIA4gBAUINCgtfcHJveHlfaG9zdEINCgtfcHJveHlfcG9ydEIRCg9fcHJveHlfdXNlcm5hbWVCEQoPX3Byb3h5X3Bhc3N3b3JkIjYKD0dldFBhZ2VzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiigEKEEdldFBhZ2VzUmVzcG9uc2USKAoFcGFnZXMYASADKAsyGS5icm93c2Vyc2NhbGUudjEuUGFnZUluZm8SDwoHc3VjY2VzcxgCIAEoCBIxCgVlcnJvchgDIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IipAEKDFNlc3Npb25Vc2FnZRIRCgl3YWxsX3RpbWUYASABKAESEAoIY3B1X3RpbWUYAiABKAESEgoKbWluX21lbW9yeRgDIAEoARIWCg5hdmVyYWdlX21lbW9yeRgEIAEoARITCgtwZWFrX21lbW9yeRgFIAEoARIWCg5yZW5kZXJlcnNfdXNlZBgGIAEoBRIWCg5mcmFtZXNfY3JlYXRlZBgHIAEoBSI2Cg9HZXRVc2FnZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIo4BChBHZXRVc2FnZVJlc3BvbnNlEiwKBXVzYWdlGAEgASgLMh0uYnJvd3NlcnNjYWxlLnYxLlNlc3Npb25Vc2FnZRIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciKaAQoPTmF2aWdhdGVSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEgsKA3VybBgEIAEoCRIVCghyZWZlcnJlchgFIAEoCUgAiAEBEhQKB3RpbWVvdXQYBiABKAFIAYgBAUILCglfcmVmZXJyZXJCCgoIX3RpbWVvdXQifwoQTmF2aWdhdGVSZXNwb25zZRIQCghmcmFtZV9pZBgBIAEoCRILCgN1cmwYAiABKAkSDwoHc3VjY2VzcxgDIAEoCBIxCgVlcnJvchgEIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IitgEKD0xvYWRIVE1MUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRILCgN1cmwYBCABKAkSDAoEaHRtbBgFIAEoCRIoCgdoZWFkZXJzGAYgAygLMhcuYnJvd3NlcnNjYWxlLnYxLkhlYWRlchIYCgtzdGF0dXNfY29kZRgHIAEoBUgAiAEBQg4KDF9zdGF0dXNfY29kZSJ/Cg9FdmFsdWF0ZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSEgoKZXhwcmVzc2lvbhgEIAEoCRIVCghmcmFtZV9pZBgFIAEoCUgAiAEBQgsKCV9mcmFtZV9pZCLEAQoQRXZhbHVhdGVSZXNwb25zZRIOCgZyZXN1bHQYASABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAIgASgFEhIKCmlzX3Zpc2libGUYAyABKAgSJQoGYm91bmRzGAQgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSDwoHc3VjY2VzcxgFIAEoCBIxCgVlcnJvchgGIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IiwgEKEFdhaXRGb3JBbnlQYXJhbXMSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSMgoKY29uZGl0aW9ucxgEIAMoCzIeLmJyb3dzZXJzY2FsZS52MS5XYWl0Q29uZGl0aW9uEhUKCGZyYW1lX2lkGAUgASgJSACIAQESFAoHdGltZW91dBgGIAEoAUgBiAEBQgsKCV9mcmFtZV9pZEIKCghfdGltZW91dCL1AgoTU2VsZWN0T3B0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBEhIKBWluZGV4GAggASgFSASIAQESEgoFdmFsdWUYCSABKAlIBYgBARIRCgR0ZXh0GAogASgJSAaIAQESGAoLZmlyZV9ldmVudHMYCyABKAhIB4gBAUISChBfYmFja2VuZF9ub2RlX2lkQgsKCV9zZWxlY3RvckIQCg5fanNfZXhwcmVzc2lvbkILCglfZnJhbWVfaWRCCAoGX2luZGV4QggKBl92YWx1ZUIHCgVfdGV4dEIOCgxfZmlyZV9ldmVudHMi7wEKD1Njcm9sbFRvUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBQhIKEF9iYWNrZW5kX25vZGVfaWRCCwoJX3NlbGVjdG9yQhAKDl9qc19leHByZXNzaW9uQgsKCV9mcmFtZV9pZCKZAgoNTW92ZVRvUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIcCg9iYWNrZW5kX25vZGVfaWQYBCABKAVIAIgBARIVCghzZWxlY3RvchgFIAEoCUgBiAEBEhoKDWpzX2V4cHJlc3Npb24YBiABKAlIAogBARIVCghmcmFtZV9pZBgHIAEoCUgDiAEBEg4KAXgYCCABKAFIBIgBARIOCgF5GAkgASgBSAWIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgQKAl94QgQKAl95IoIDCgxDbGlja1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSHAoPYmFja2VuZF9ub2RlX2lkGAQgASgFSACIAQESFQoIc2VsZWN0b3IYBSABKAlIAYgBARIaCg1qc19leHByZXNzaW9uGAYgASgJSAKIAQESFQoIZnJhbWVfaWQYByABKAlIA4gBARITCgZidXR0b24YCCABKAlIBIgBARIYCgtjbGlja19jb3VudBgJIAEoBUgFiAEBEg4KAXgYCiABKAFIBogBARIOCgF5GAsgASgBSAeIAQESEwoGYWN0aW9uGAwgASgJSAiIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgkKB19idXR0b25CDgoMX2NsaWNrX2NvdW50QgQKAl94QgQKAl95QgkKB19hY3Rpb24igwMKC0RyYWdSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhwKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgAiAEBEhUKCHNlbGVjdG9yGAUgASgJSAGIAQESGgoNanNfZXhwcmVzc2lvbhgGIAEoCUgCiAEBEhUKCGZyYW1lX2lkGAcgASgJSAOIAQESFQoIb2Zmc2V0X3gYCCABKAFIBIgBARIVCghvZmZzZXRfeRgJIAEoAUgFiAEBEhcKCmFic29sdXRlX3gYCiABKAFIBogBARIXCgphYnNvbHV0ZV95GAsgASgBSAeIAQFCEgoQX2JhY2tlbmRfbm9kZV9pZEILCglfc2VsZWN0b3JCEAoOX2pzX2V4cHJlc3Npb25CCwoJX2ZyYW1lX2lkQgsKCV9vZmZzZXRfeEILCglfb2Zmc2V0X3lCDQoLX2Fic29sdXRlX3hCDQoLX2Fic29sdXRlX3ki7wIKC0ZpbGxSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIPCgdwYWdlX2lkGAMgASgJEhwKD2JhY2tlbmRfbm9kZV9pZBgEIAEoBUgAiAEBEhUKCHNlbGVjdG9yGAUgASgJSAGIAQESGgoNanNfZXhwcmVzc2lvbhgGIAEoCUgCiAEBEhUKCGZyYW1lX2lkGAcgASgJSAOIAQESDAoEdGV4dBgIIAEoCRIYCgtjbGVhcl9maXJzdBgJIAEoCEgEiAEBEhQKB3RpbWVvdXQYCiABKAFIBYgBARIYCgtzdGVhZHlfdGltZRgLIAEoAUgGiAEBQhIKEF9iYWNrZW5kX25vZGVfaWRCCwoJX3NlbGVjdG9yQhAKDl9qc19leHByZXNzaW9uQgsKCV9mcmFtZV9pZEIOCgxfY2xlYXJfZmlyc3RCCgoIX3RpbWVvdXRCDgoMX3N0ZWFkeV90aW1lIkwKE1NldEJsb2NrTGlzdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhAKCHBhdHRlcm5zGAMgAygJImEKFVNldFN0YXRpY1BhdGhzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEAoIcGF0dGVybnMYAyADKAkSEQoJYmxvYl9uYW1lGAQgASgJIogBChhXYWl0Rm9yQW55UmVxdWVzdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhAKCHBhdHRlcm5zGAMgAygJEhMKC2Fib3J0X2ZsYWdzGAQgAygFEhQKB3RpbWVvdXQYBSABKAFIAIgBAUIKCghfdGltZW91dCKuAQoZV2FpdEZvckFueVJlcXVlc3RSZXNwb25zZRINCgVpbmRleBgBIAEoBRI0CgdyZXF1ZXN0GAIgASgLMiMuYnJvd3NlcnNjYWxlLnYxLkludGVyY2VwdGVkUmVxdWVzdBIPCgdzdWNjZXNzGAMgASgIEjEKBWVycm9yGAQgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciKJAQoZV2FpdEZvckFueVJlc3BvbnNlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEAoIcGF0dGVybnMYAyADKAkSEwoLYWJvcnRfZmxhZ3MYBCADKAUSFAoHdGltZW91dBgFIAEoAUgAiAEBQgoKCF90aW1lb3V0IrEBChpXYWl0Rm9yQW55UmVzcG9uc2VSZXNwb25zZRINCgVpbmRleBgBIAEoBRI2CghyZXNwb25zZRgCIAEoCzIkLmJyb3dzZXJzY2FsZS52MS5JbnRlcmNlcHRlZFJlc3BvbnNlEg8KB3N1Y2Nlc3MYAyABKAgSMQoFZXJyb3IYBCABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIsoBChRNb2RpZnlSZXF1ZXN0UmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEwoLdXJsX3BhdHRlcm4YAyABKAkSOgoNbW9kaWZpY2F0aW9ucxgEIAMoCzIjLmJyb3dzZXJzY2FsZS52MS5IZWFkZXJNb2RpZmljYXRpb24SEQoEYm9keRgFIAEoCUgAiAEBEhQKB3RpbWVvdXQYBiABKAFIAYgBAUIHCgVfYm9keUIKCghfdGltZW91dCKbAQoVTW9kaWZ5UmVxdWVzdFJlc3BvbnNlEjQKB3JlcXVlc3QYASABKAsyIy5icm93c2Vyc2NhbGUudjEuSW50ZXJjZXB0ZWRSZXF1ZXN0Eg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIoYBChpTdGFydE5ldHdvcmtDYXB0dXJlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEAoIcGF0dGVybnMYAyADKAkSDgoGYm9kaWVzGAQgASgJEhUKDWJvZHlfcGF0dGVybnMYBSADKAlKBAgGEAdKBAgHEAgiQAoZU3RvcE5ldHdvcmtDYXB0dXJlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiewoaU3RvcE5ldHdvcmtDYXB0dXJlUmVzcG9uc2USDwoHc3RvcHBlZBgBIAEoCBIPCgdzdWNjZXNzGAIgASgIEjEKBWVycm9yGAMgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciJECh1TdHJlYW1OZXR3b3JrRXhjaGFuZ2VzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkiWwoUTmV0d29ya0V4Y2hhbmdlRXZlbnQSMgoIZXhjaGFuZ2UYASABKAsyIC5icm93c2Vyc2NhbGUudjEuTmV0d29ya0V4Y2hhbmdlEg8KB2Ryb3BwZWQYAiABKAQitAUKD05ldHdvcmtFeGNoYW5nZRISCgpyZXF1ZXN0X2lkGAEgASgJEhAKCGNoYWluX2lkGAIgASgJEhYKDnJlZGlyZWN0X2luZGV4GAMgASgFEhAKCGZyYW1lX2lkGAQgASgJEhAKCGlzX29vcGlmGAUgASgIEhUKDXJlc291cmNlX3R5cGUYBiABKAkSDgoGbWV0aG9kGAcgASgJEgsKA3VybBgIIAEoCRIVCg1pbml0aWF0b3JfdXJsGAkgASgJEjAKD3JlcXVlc3RfaGVhZGVycxgKIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISIAoYcmVxdWVzdF9oZWFkZXJzX2FyZV93aXJlGAsgASgIEhQKDHJlcXVlc3RfYm9keRgMIAEoDBIeChZyZXF1ZXN0X2JvZHlfdHJ1bmNhdGVkGA0gASgIEhQKDGhhc19yZXNwb25zZRgOIAEoCBITCgtzdGF0dXNfY29kZRgPIAEoBRITCgtzdGF0dXNfdGV4dBgQIAEoCRIRCgltaW1lX3R5cGUYESABKAkSEAoIcHJvdG9jb2wYEiABKAkSFgoOcmVtb3RlX2FkZHJlc3MYEyABKAkSEwoLc2VydmVkX2Zyb20YFCABKAkSMQoQcmVzcG9uc2VfaGVhZGVycxgVIAMoCzIXLmJyb3dzZXJzY2FsZS52MS5IZWFkZXISIQoZcmVzcG9uc2VfaGVhZGVyc19hcmVfd2lyZRgWIAEoCBIVCg1yZXNwb25zZV9ib2R5GBcgASgMEh8KF3Jlc3BvbnNlX2JvZHlfdHJ1bmNhdGVkGBggASgIEh4KFnJlc3BvbnNlX2JvZHlfY2FwdHVyZWQYGSABKAgSGwoTZW5jb2RlZF9kYXRhX2xlbmd0aBgaIAEoAxINCgVlcnJvchgbIAEoCSI4ChFHZXRDb29raWVzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkikQEKEkdldENvb2tpZXNSZXNwb25zZRItCgdjb29raWVzGAEgAygLMhwuYnJvd3NlcnNjYWxlLnYxLkNvb2tpZVBhcmFtEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yImcKEVNldENvb2tpZXNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRItCgdjb29raWVzGAMgAygLMhwuYnJvd3NlcnNjYWxlLnYxLkNvb2tpZVBhcmFtIjoKE0NsZWFyQ29va2llc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIikKC1N0b3JhZ2VJdGVtEgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCSJRChJTdG9yYWdlT3JpZ2luRW50cnkSDgoGb3JpZ2luGAEgASgJEisKBWl0ZW1zGAIgAygLMhwuYnJvd3NlcnNjYWxlLnYxLlN0b3JhZ2VJdGVtIlgKEUdldFN0b3JhZ2VSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRITCgZvcmlnaW4YAyABKAlIAIgBAUIJCgdfb3JpZ2luIpgBChJHZXRTdG9yYWdlUmVzcG9uc2USNAoHc3RvcmFnZRgBIAMoCzIjLmJyb3dzZXJzY2FsZS52MS5TdG9yYWdlT3JpZ2luRW50cnkSDwoHc3VjY2VzcxgCIAEoCBIxCgVlcnJvchgDIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IimAEKEVNldFN0b3JhZ2VSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRI0CgdzdG9yYWdlGAMgAygLMiMuYnJvd3NlcnNjYWxlLnYxLlN0b3JhZ2VPcmlnaW5FbnRyeRIYCgtjbGVhcl9maXJzdBgEIAEoCEgAiAEBQg4KDF9jbGVhcl9maXJzdCJaChNDbGVhclN0b3JhZ2VSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRITCgZvcmlnaW4YAyABKAlIAIgBAUIJCgdfb3JpZ2luIiwKC0Ric2NTZXNzaW9uEgwKBHNpdGUYASABKAkSDwoHc2Vzc2lvbhgCIAEoCSLYAgoLQXV0aFNlc3Npb24SFAoHZ2FpYV9pZBgBIAEoCUgAiAEBEhIKBWVtYWlsGAIgASgJSAGIAQESGgoNcmVmcmVzaF90b2tlbhgDIAEoCUgCiAEBEiAKE3dyYXBwZWRfYmluZGluZ19rZXkYBCABKAlIA4gBARIkChdzaWduaW5fc2NvcGVkX2RldmljZV9pZBgFIAEoCUgEiAEBEhkKDHN5bmNfY29uc2VudBgGIAEoCEgFiAEBEjMKDWRic2Nfc2Vzc2lvbnMYByADKAsyHC5icm93c2Vyc2NhbGUudjEuRGJzY1Nlc3Npb25CCgoIX2dhaWFfaWRCCAoGX2VtYWlsQhAKDl9yZWZyZXNoX3Rva2VuQhYKFF93cmFwcGVkX2JpbmRpbmdfa2V5QhoKGF9zaWduaW5fc2NvcGVkX2RldmljZV9pZEIPCg1fc3luY19jb25zZW50IjwKFUdldEF1dGhTZXNzaW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkipgEKFkdldEF1dGhTZXNzaW9uUmVzcG9uc2USMgoHc2Vzc2lvbhgBIAEoCzIcLmJyb3dzZXJzY2FsZS52MS5BdXRoU2Vzc2lvbkgAiAEBEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySAGIAQFCCgoIX3Nlc3Npb25CCAoGX2Vycm9yImsKFVNldEF1dGhTZXNzaW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSLQoHc2Vzc2lvbhgDIAEoCzIcLmJyb3dzZXJzY2FsZS52MS5BdXRoU2Vzc2lvbiKHAQoNR2V0RE9NUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBEhIKBWRlcHRoGAUgASgFSAGIAQFCCwoJX2ZyYW1lX2lkQggKBl9kZXB0aCJrCg5HZXRET01SZXNwb25zZRILCgNkb20YASABKAkSDwoHc3VjY2VzcxgCIAEoCBIxCgVlcnJvchgDIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IimQQKFUdldE9ic2VydmF0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIjChZtYXhfZWxlbWVudHNfcGVyX2ZyYW1lGAQgASgFSACIAQESHAoPbWF4X3RleHRfbGVuZ3RoGAUgASgFSAGIAQESEwoGZm9ybWF0GAYgASgJSAKIAQESHQoQbWF4X3RvdGFsX3Rva2VucxgHIAEoBUgDiAEBEhsKDmluY2x1ZGVfYm91bmRzGAggASgISASIAQESGgoNdmlld3BvcnRfb25seRgJIAEoCEgFiAEBEhwKD2JhY2tlbmRfbm9kZV9pZBgKIAEoBUgGiAEBEhUKCHNlbGVjdG9yGAsgASgJSAeIAQESGgoNanNfZXhwcmVzc2lvbhgMIAEoCUgIiAEBEhUKCGZyYW1lX2lkGA0gASgJSAmIAQFCGQoXX21heF9lbGVtZW50c19wZXJfZnJhbWVCEgoQX21heF90ZXh0X2xlbmd0aEIJCgdfZm9ybWF0QhMKEV9tYXhfdG90YWxfdG9rZW5zQhEKD19pbmNsdWRlX2JvdW5kc0IQCg5fdmlld3BvcnRfb25seUISChBfYmFja2VuZF9ub2RlX2lkQgsKCV9zZWxlY3RvckIQCg5fanNfZXhwcmVzc2lvbkILCglfZnJhbWVfaWQikwEKFkdldE9ic2VydmF0aW9uUmVzcG9uc2USEwoLb2JzZXJ2YXRpb24YASABKAkSDwoHc3VjY2VzcxgDIAEoCBIxCgVlcnJvchgEIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3JKBAgCEANSEG9ic2VydmF0aW9uX2pzb24ibQoRR2V0RE9NSGFzaFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSFQoIZnJhbWVfaWQYBCABKAlIAIgBAUILCglfZnJhbWVfaWQiIgoSR2V0RE9NSGFzaFJlc3BvbnNlEgwKBGhhc2gYASABKAkigAEKFVN0YXJ0RG9tTWlycm9yUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSEgoFZGVwdGgYBCABKAVIAIgBARITCgZwaWVyY2UYBSABKAhIAYgBAUIICgZfZGVwdGhCCQoHX3BpZXJjZUoECAMQBCKZAQoWU3RhcnREb21NaXJyb3JSZXNwb25zZRIMCgRyb290GAEgASgJEhAKCGZyYW1lX2lkGAIgASgJEgsKA3NlcRgDIAEoBBIPCgdzdWNjZXNzGAUgASgIEjEKBWVycm9yGAYgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvckoECAQQBSJBChRTdG9wRG9tTWlycm9yUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAlKBAgDEAQilwEKFUdldERvbUNoaWxkcmVuUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhUKCGZyYW1lX2lkGAQgASgJSACIAQESEgoFZGVwdGgYBSABKAVIAYgBAUILCglfZnJhbWVfaWRCCAoGX2RlcHRoIoUBChZHZXREb21DaGlsZHJlblJlc3BvbnNlEhAKCGNoaWxkcmVuGAEgASgJEgsKA3NlcRgCIAEoBBIPCgdzdWNjZXNzGAMgASgIEjEKBWVycm9yGAQgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciJ8ChhSZWxlYXNlRG9tU3VidHJlZVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRIVCghmcmFtZV9pZBgEIAEoCUgAiAEBQgsKCV9mcmFtZV9pZCJ4ChRSZXZlYWxEb21Ob2RlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSFwoPYmFja2VuZF9ub2RlX2lkGAMgASgFEhUKCGZyYW1lX2lkGAQgASgJSACIAQFCCwoJX2ZyYW1lX2lkIoABChVSZXZlYWxEb21Ob2RlUmVzcG9uc2USDAoEcGF0aBgBIAEoCRILCgNzZXEYAiABKAQSDwoHc3VjY2VzcxgDIAEoCBIxCgVlcnJvchgEIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IiYAoVR2V0RG9tUmV2aXNpb25SZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIVCghmcmFtZV9pZBgDIAEoCUgAiAEBQgsKCV9mcmFtZV9pZCJ4ChZHZXREb21SZXZpc2lvblJlc3BvbnNlEhAKCHJldmlzaW9uGAEgASgEEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIj0KFlN0cmVhbURvbUV2ZW50c1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIjkKCURvbVVwZGF0ZRIQCghmcmFtZV9pZBgBIAEoCRILCgNzZXEYAiABKAQSDQoFZWRpdHMYAyABKAkiIQoJRG9tUmVzeW5jEg4KBnJlYXNvbhgCIAEoCUoECAEQAiJ7CghEb21FdmVudBIsCgZ1cGRhdGUYASABKAsyGi5icm93c2Vyc2NhbGUudjEuRG9tVXBkYXRlSAASLAoGcmVzeW5jGAIgASgLMhouYnJvd3NlcnNjYWxlLnYxLkRvbVJlc3luY0gAQgcKBWV2ZW50SgQIAxAESgQIBBAFImYKGEluc3BlY3RBdFBvc2l0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIJCgF4GAQgASgBEgkKAXkYBSABKAEi9wEKGUluc3BlY3RBdFBvc2l0aW9uUmVzcG9uc2USFwoPYmFja2VuZF9ub2RlX2lkGAEgASgFEhAKCGZyYW1lX2lkGAIgASgJEhAKCHRhZ19uYW1lGAMgASgJEhQKDHRleHRfY29udGVudBgEIAEoCRISCgppc192aXNpYmxlGAUgASgIEiUKBmJvdW5kcxgGIAEoCzIVLmJyb3dzZXJzY2FsZS52MS5SZWN0Eg8KB3N1Y2Nlc3MYByABKAgSMQoFZXJyb3IYCCABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIokBChRIaWdobGlnaHROb2RlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIXCg9iYWNrZW5kX25vZGVfaWQYBCABKAUSFQoIZnJhbWVfaWQYBSABKAlIAIgBAUILCglfZnJhbWVfaWQiVwoRSW5zZXJ0VGV4dFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSDAoEdGV4dBgEIAEoCSJ7CgtUeXBlUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRIMCgR0ZXh0GAQgASgJEhgKC2NsZWFyX2ZpcnN0GAUgASgISACIAQFCDgoMX2NsZWFyX2ZpcnN0IroBCg9QcmVzc0tleVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSCwoDa2V5GAQgASgJEhEKBGNvZGUYBSABKAlIAIgBARIWCgltb2RpZmllcnMYBiABKAVIAYgBARIVCghsb2NhdGlvbhgHIAEoBUgCiAEBQgcKBV9jb2RlQgwKCl9tb2RpZmllcnNCCwoJX2xvY2F0aW9uIrwBChFSZWxlYXNlS2V5UmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRILCgNrZXkYBCABKAkSEQoEY29kZRgFIAEoCUgAiAEBEhYKCW1vZGlmaWVycxgGIAEoBUgBiAEBEhUKCGxvY2F0aW9uGAcgASgFSAKIAQFCBwoFX2NvZGVCDAoKX21vZGlmaWVyc0ILCglfbG9jYXRpb24iSwoTR2V0U2VsZWN0aW9uUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCSJyChRHZXRTZWxlY3Rpb25SZXNwb25zZRIMCgR0ZXh0GAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSMQoFZXJyb3IYAyABKAsyHS5icm93c2Vyc2NhbGUudjEuQ29tbWFuZEVycm9ySACIAQFCCAoGX2Vycm9yIosBChFTY3JlZW5zaG90UmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDwoHcGFnZV9pZBgDIAEoCRITCgZmb3JtYXQYBCABKAlIAIgBARIUCgdxdWFsaXR5GAUgASgFSAGIAQFCCQoHX2Zvcm1hdEIKCghfcXVhbGl0eSKWAQoSU2NyZWVuc2hvdFJlc3BvbnNlEhMKC2RhdGFfYmFzZTY0GAEgASgJEg0KBXdpZHRoGAIgASgFEg4KBmhlaWdodBgDIAEoBRIPCgdzdWNjZXNzGAQgASgIEjEKBWVycm9yGAUgASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciKTAwoRUmVhZENhbnZhc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg8KB3BhZ2VfaWQYAyABKAkSHAoPYmFja2VuZF9ub2RlX2lkGAQgASgFSACIAQESFQoIc2VsZWN0b3IYBSABKAlIAYgBARIaCg1qc19leHByZXNzaW9uGAYgASgJSAKIAQESFQoIZnJhbWVfaWQYByABKAlIA4gBARITCgZmb3JtYXQYCCABKAlIBIgBARIUCgdxdWFsaXR5GAkgASgFSAWIAQESDwoCc3gYCiABKAVIBogBARIPCgJzeRgLIAEoBUgHiAEBEg8KAnN3GAwgASgFSAiIAQESDwoCc2gYDSABKAVICYgBAUISChBfYmFja2VuZF9ub2RlX2lkQgsKCV9zZWxlY3RvckIQCg5fanNfZXhwcmVzc2lvbkILCglfZnJhbWVfaWRCCQoHX2Zvcm1hdEIKCghfcXVhbGl0eUIFCgNfc3hCBQoDX3N5QgUKA19zd0IFCgNfc2gi1wEKElJlYWRDYW52YXNSZXNwb25zZRIPCgdzdWNjZXNzGAEgASgIEhAKCGZyYW1lX2lkGAIgASgJEhcKD2JhY2tlbmRfbm9kZV9pZBgDIAEoBRITCgtkYXRhX2Jhc2U2NBgEIAEoCRINCgV3aWR0aBgFIAEoBRIOCgZoZWlnaHQYBiABKAUSFAoMb3JpZ2luX2NsZWFuGAcgASgIEjEKBWVycm9yGAggASgLMh0uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRFcnJvckgAiAEBQggKBl9lcnJvciJkChNTb2x2ZUNhcHRjaGFSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRISCgp0aW1lb3V0X21zGAMgASgFEhQKDHJldHJ5X2Ftb3VudBgEIAEoBSImChRTb2x2ZUNhcHRjaGFSZXNwb25zZRIOCgZyZXN1bHQYASABKAkiZQoJSWNlU2VydmVyEgwKBHVybHMYASADKAkSFQoIdXNlcm5hbWUYAiABKAlIAIgBARIXCgpjcmVkZW50aWFsGAMgASgJSAGIAQFCCwoJX3VzZXJuYW1lQg0KC19jcmVkZW50aWFsIj0KFkdldFN0cmVhbUNvbmZpZ1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIkoKF0dldFN0cmVhbUNvbmZpZ1Jlc3BvbnNlEi8KC2ljZV9zZXJ2ZXJzGAEgAygLMhouYnJvd3NlcnNjYWxlLnYxLkljZVNlcnZlciJMChJTdGFydFN0cmVhbVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEhEKCW9mZmVyX3NkcBgDIAEoCSKgAQoTU3RhcnRTdHJlYW1SZXNwb25zZRISCgphbnN3ZXJfc2RwGAEgASgJEicKCHZpZXdwb3J0GAIgASgLMhUuYnJvd3NlcnNjYWxlLnYxLlJlY3QSDwoHc3VjY2VzcxgDIAEoCBIxCgVlcnJvchgEIAEoCzIdLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kRXJyb3JIAIgBAUIICgZfZXJyb3IiOAoRU3RvcFN0cmVhbVJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIkMKDlNjcmlwdExvZ0VudHJ5Eg0KBWxldmVsGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSEQoJdGltZXN0YW1wGAMgASgDIkcKEFJ1blNjcmlwdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJEg4KBnNvdXJjZRgDIAEoCSKFAQoRUnVuU2NyaXB0UmVzcG9uc2USDwoHc3VjY2VzcxgBIAEoCBIOCgZyZXN1bHQYAiABKAkSDgoGcnVuX2lkGAMgASgJEiwKA2xvZxgEIAMoCzIfLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRMb2dFbnRyeRIRCgl0cnVuY2F0ZWQYBSABKAgiSQoSU3RhcnRTY3JpcHRSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIOCgZzb3VyY2UYAyABKAkiJQoTU3RhcnRTY3JpcHRSZXNwb25zZRIOCgZydW5faWQYASABKAkiSQoSU3RvcFNjcmlwdHNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASABKAkSDwoHYXBpX2tleRgCIAEoCRIOCgZydW5faWQYAyABKAkiJgoTU3RvcFNjcmlwdHNSZXNwb25zZRIPCgdzdG9wcGVkGAEgASgFIi8KCVNjcmlwdFJ1bhIOCgZydW5faWQYASABKAkSEgoKcnVubmluZ19tcxgCIAEoAyI8ChVMaXN0U2NyaXB0UnVuc1JlcXVlc3QSEgoKc2Vzc2lvbl9pZBgBIAEoCRIPCgdhcGlfa2V5GAIgASgJIkIKFkxpc3RTY3JpcHRSdW5zUmVzcG9uc2USKAoEcnVucxgBIAMoCzIaLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRSdW4iUAoZU3RyZWFtU2NyaXB0RXZlbnRzUmVxdWVzdBISCgpzZXNzaW9uX2lkGAEgASgJEg8KB2FwaV9rZXkYAiABKAkSDgoGcnVuX2lkGAMgASgJIkoKCVNjcmlwdExvZxIOCgZydW5faWQYASABKAkSLQoEbGluZRgCIAEoCzIfLmJyb3dzZXJzY2FsZS52MS5TY3JpcHRMb2dFbnRyeSJSCg5TY3JpcHRGaW5pc2hlZBIOCgZydW5faWQYASABKAkSDwoHc3VjY2VzcxgCIAEoCBIOCgZyZXN1bHQYAyABKAkSDwoHc3RvcHBlZBgEIAEoCCKHAQoLU2NyaXB0RXZlbnQSKQoDbG9nGAEgASgLMhouYnJvd3NlcnNjYWxlLnYxLlNjcmlwdExvZ0gAEjMKCGZpbmlzaGVkGAIgASgLMh8uYnJvd3NlcnNjYWxlLnYxLlNjcmlwdEZpbmlzaGVkSAASDwoHZHJvcHBlZBgDIAEoBEIHCgVldmVudDLdKQoHQnJvd3NlchJMCghTZXRQcm94eRIgLmJyb3dzZXJzY2FsZS52MS5TZXRQcm94eVJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJPCghHZXRQYWdlcxIgLmJyb3dzZXJzY2FsZS52MS5HZXRQYWdlc1JlcXVlc3QaIS5icm93c2Vyc2NhbGUudjEuR2V0UGFnZXNSZXNwb25zZRJPCghHZXRVc2FnZRIgLmJyb3dzZXJzY2FsZS52MS5HZXRVc2FnZVJlcXVlc3QaIS5icm93c2Vyc2NhbGUudjEuR2V0VXNhZ2VSZXNwb25zZRJPCghOYXZpZ2F0ZRIgLmJyb3dzZXJzY2FsZS52MS5OYXZpZ2F0ZVJlcXVlc3QaIS5icm93c2Vyc2NhbGUudjEuTmF2aWdhdGVSZXNwb25zZRJMCghMb2FkSFRNTBIgLmJyb3dzZXJzY2FsZS52MS5Mb2FkSFRNTFJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJPCghFdmFsdWF0ZRIgLmJyb3dzZXJzY2FsZS52MS5FdmFsdWF0ZVJlcXVlc3QaIS5icm93c2Vyc2NhbGUudjEuRXZhbHVhdGVSZXNwb25zZRJMCgpXYWl0Rm9yQW55EiEuYnJvd3NlcnNjYWxlLnYxLldhaXRGb3JBbnlQYXJhbXMaGy5icm93c2Vyc2NhbGUudjEuV2FpdFJlc3VsdBJZCgxTZWxlY3RPcHRpb24SJC5icm93c2Vyc2NhbGUudjEuU2VsZWN0T3B0aW9uUmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5TZWxlY3RPcHRpb25SZXN1bHQSSwoIU2Nyb2xsVG8SIC5icm93c2Vyc2NhbGUudjEuU2Nyb2xsVG9SZXF1ZXN0Gh0uYnJvd3NlcnNjYWxlLnYxLlNjcm9sbFJlc3VsdBJFCgZNb3ZlVG8SHi5icm93c2Vyc2NhbGUudjEuTW92ZVRvUmVxdWVzdBobLmJyb3dzZXJzY2FsZS52MS5Nb3ZlUmVzdWx0EkQKBUNsaWNrEh0uYnJvd3NlcnNjYWxlLnYxLkNsaWNrUmVxdWVzdBocLmJyb3dzZXJzY2FsZS52MS5DbGlja1Jlc3VsdBJBCgREcmFnEhwuYnJvd3NlcnNjYWxlLnYxLkRyYWdSZXF1ZXN0GhsuYnJvd3NlcnNjYWxlLnYxLkRyYWdSZXN1bHQSQQoERmlsbBIcLmJyb3dzZXJzY2FsZS52MS5GaWxsUmVxdWVzdBobLmJyb3dzZXJzY2FsZS52MS5GaWxsUmVzdWx0ElgKC0FkZFJlYWN0aW9uEiMuYnJvd3NlcnNjYWxlLnYxLkFkZFJlYWN0aW9uUmVxdWVzdBokLmJyb3dzZXJzY2FsZS52MS5BZGRSZWFjdGlvblJlc3BvbnNlEmEKDlJlbW92ZVJlYWN0aW9uEiYuYnJvd3NlcnNjYWxlLnYxLlJlbW92ZVJlYWN0aW9uUmVxdWVzdBonLmJyb3dzZXJzY2FsZS52MS5SZW1vdmVSZWFjdGlvblJlc3BvbnNlEl4KDUxpc3RSZWFjdGlvbnMSJS5icm93c2Vyc2NhbGUudjEuTGlzdFJlYWN0aW9uc1JlcXVlc3QaJi5icm93c2Vyc2NhbGUudjEuTGlzdFJlYWN0aW9uc1Jlc3BvbnNlElQKDFNldEJsb2NrTGlzdBIkLmJyb3dzZXJzY2FsZS52MS5TZXRCbG9ja0xpc3RSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSWAoOU2V0U3RhdGljUGF0aHMSJi5icm93c2Vyc2NhbGUudjEuU2V0U3RhdGljUGF0aHNSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSagoRV2FpdEZvckFueVJlcXVlc3QSKS5icm93c2Vyc2NhbGUudjEuV2FpdEZvckFueVJlcXVlc3RSZXF1ZXN0GiouYnJvd3NlcnNjYWxlLnYxLldhaXRGb3JBbnlSZXF1ZXN0UmVzcG9uc2USbQoSV2FpdEZvckFueVJlc3BvbnNlEiouYnJvd3NlcnNjYWxlLnYxLldhaXRGb3JBbnlSZXNwb25zZVJlcXVlc3QaKy5icm93c2Vyc2NhbGUudjEuV2FpdEZvckFueVJlc3BvbnNlUmVzcG9uc2USXgoNTW9kaWZ5UmVxdWVzdBIlLmJyb3dzZXJzY2FsZS52MS5Nb2RpZnlSZXF1ZXN0UmVxdWVzdBomLmJyb3dzZXJzY2FsZS52MS5Nb2RpZnlSZXF1ZXN0UmVzcG9uc2USYgoTU3RhcnROZXR3b3JrQ2FwdHVyZRIrLmJyb3dzZXJzY2FsZS52MS5TdGFydE5ldHdvcmtDYXB0dXJlUmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0Em0KElN0b3BOZXR3b3JrQ2FwdHVyZRIqLmJyb3dzZXJzY2FsZS52MS5TdG9wTmV0d29ya0NhcHR1cmVSZXF1ZXN0GisuYnJvd3NlcnNjYWxlLnYxLlN0b3BOZXR3b3JrQ2FwdHVyZVJlc3BvbnNlEnEKFlN0cmVhbU5ldHdvcmtFeGNoYW5nZXMSLi5icm93c2Vyc2NhbGUudjEuU3RyZWFtTmV0d29ya0V4Y2hhbmdlc1JlcXVlc3QaJS5icm93c2Vyc2NhbGUudjEuTmV0d29ya0V4Y2hhbmdlRXZlbnQwARJVCgpHZXRDb29raWVzEiIuYnJvd3NlcnNjYWxlLnYxLkdldENvb2tpZXNSZXF1ZXN0GiMuYnJvd3NlcnNjYWxlLnYxLkdldENvb2tpZXNSZXNwb25zZRJQCgpTZXRDb29raWVzEiIuYnJvd3NlcnNjYWxlLnYxLlNldENvb2tpZXNSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSVAoMQ2xlYXJDb29raWVzEiQuYnJvd3NlcnNjYWxlLnYxLkNsZWFyQ29va2llc1JlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJVCgpHZXRTdG9yYWdlEiIuYnJvd3NlcnNjYWxlLnYxLkdldFN0b3JhZ2VSZXF1ZXN0GiMuYnJvd3NlcnNjYWxlLnYxLkdldFN0b3JhZ2VSZXNwb25zZRJQCgpTZXRTdG9yYWdlEiIuYnJvd3NlcnNjYWxlLnYxLlNldFN0b3JhZ2VSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSVAoMQ2xlYXJTdG9yYWdlEiQuYnJvd3NlcnNjYWxlLnYxLkNsZWFyU3RvcmFnZVJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJhCg5HZXRBdXRoU2Vzc2lvbhImLmJyb3dzZXJzY2FsZS52MS5HZXRBdXRoU2Vzc2lvblJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuR2V0QXV0aFNlc3Npb25SZXNwb25zZRJYCg5TZXRBdXRoU2Vzc2lvbhImLmJyb3dzZXJzY2FsZS52MS5TZXRBdXRoU2Vzc2lvblJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJJCgZHZXRET00SHi5icm93c2Vyc2NhbGUudjEuR2V0RE9NUmVxdWVzdBofLmJyb3dzZXJzY2FsZS52MS5HZXRET01SZXNwb25zZRJVCgpHZXRET01IYXNoEiIuYnJvd3NlcnNjYWxlLnYxLkdldERPTUhhc2hSZXF1ZXN0GiMuYnJvd3NlcnNjYWxlLnYxLkdldERPTUhhc2hSZXNwb25zZRJhCg5HZXRPYnNlcnZhdGlvbhImLmJyb3dzZXJzY2FsZS52MS5HZXRPYnNlcnZhdGlvblJlcXVlc3QaJy5icm93c2Vyc2NhbGUudjEuR2V0T2JzZXJ2YXRpb25SZXNwb25zZRJqChFJbnNwZWN0QXRQb3NpdGlvbhIpLmJyb3dzZXJzY2FsZS52MS5JbnNwZWN0QXRQb3NpdGlvblJlcXVlc3QaKi5icm93c2Vyc2NhbGUudjEuSW5zcGVjdEF0UG9zaXRpb25SZXNwb25zZRJWCg1IaWdobGlnaHROb2RlEiUuYnJvd3NlcnNjYWxlLnYxLkhpZ2hsaWdodE5vZGVSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSYQoOU3RhcnREb21NaXJyb3ISJi5icm93c2Vyc2NhbGUudjEuU3RhcnREb21NaXJyb3JSZXF1ZXN0GicuYnJvd3NlcnNjYWxlLnYxLlN0YXJ0RG9tTWlycm9yUmVzcG9uc2USVgoNU3RvcERvbU1pcnJvchIlLmJyb3dzZXJzY2FsZS52MS5TdG9wRG9tTWlycm9yUmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0EmEKDkdldERvbUNoaWxkcmVuEiYuYnJvd3NlcnNjYWxlLnYxLkdldERvbUNoaWxkcmVuUmVxdWVzdBonLmJyb3dzZXJzY2FsZS52MS5HZXREb21DaGlsZHJlblJlc3BvbnNlEl4KEVJlbGVhc2VEb21TdWJ0cmVlEikuYnJvd3NlcnNjYWxlLnYxLlJlbGVhc2VEb21TdWJ0cmVlUmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0El4KDVJldmVhbERvbU5vZGUSJS5icm93c2Vyc2NhbGUudjEuUmV2ZWFsRG9tTm9kZVJlcXVlc3QaJi5icm93c2Vyc2NhbGUudjEuUmV2ZWFsRG9tTm9kZVJlc3BvbnNlEmEKDkdldERvbVJldmlzaW9uEiYuYnJvd3NlcnNjYWxlLnYxLkdldERvbVJldmlzaW9uUmVxdWVzdBonLmJyb3dzZXJzY2FsZS52MS5HZXREb21SZXZpc2lvblJlc3BvbnNlElcKD1N0cmVhbURvbUV2ZW50cxInLmJyb3dzZXJzY2FsZS52MS5TdHJlYW1Eb21FdmVudHNSZXF1ZXN0GhkuYnJvd3NlcnNjYWxlLnYxLkRvbUV2ZW50MAESVQoKU2NyZWVuc2hvdBIiLmJyb3dzZXJzY2FsZS52MS5TY3JlZW5zaG90UmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5TY3JlZW5zaG90UmVzcG9uc2USVQoKUmVhZENhbnZhcxIiLmJyb3dzZXJzY2FsZS52MS5SZWFkQ2FudmFzUmVxdWVzdBojLmJyb3dzZXJzY2FsZS52MS5SZWFkQ2FudmFzUmVzcG9uc2USUAoKSW5zZXJ0VGV4dBIiLmJyb3dzZXJzY2FsZS52MS5JbnNlcnRUZXh0UmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0EkQKBFR5cGUSHC5icm93c2Vyc2NhbGUudjEuVHlwZVJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJMCghQcmVzc0tleRIgLmJyb3dzZXJzY2FsZS52MS5QcmVzc0tleVJlcXVlc3QaHi5icm93c2Vyc2NhbGUudjEuQ29tbWFuZFJlc3VsdBJQCgpSZWxlYXNlS2V5EiIuYnJvd3NlcnNjYWxlLnYxLlJlbGVhc2VLZXlSZXF1ZXN0Gh4uYnJvd3NlcnNjYWxlLnYxLkNvbW1hbmRSZXN1bHQSWwoMR2V0U2VsZWN0aW9uEiQuYnJvd3NlcnNjYWxlLnYxLkdldFNlbGVjdGlvblJlcXVlc3QaJS5icm93c2Vyc2NhbGUudjEuR2V0U2VsZWN0aW9uUmVzcG9uc2USWwoMU29sdmVDYXB0Y2hhEiQuYnJvd3NlcnNjYWxlLnYxLlNvbHZlQ2FwdGNoYVJlcXVlc3QaJS5icm93c2Vyc2NhbGUudjEuU29sdmVDYXB0Y2hhUmVzcG9uc2USZAoPR2V0U3RyZWFtQ29uZmlnEicuYnJvd3NlcnNjYWxlLnYxLkdldFN0cmVhbUNvbmZpZ1JlcXVlc3QaKC5icm93c2Vyc2NhbGUudjEuR2V0U3RyZWFtQ29uZmlnUmVzcG9uc2USWAoLU3RhcnRTdHJlYW0SIy5icm93c2Vyc2NhbGUudjEuU3RhcnRTdHJlYW1SZXF1ZXN0GiQuYnJvd3NlcnNjYWxlLnYxLlN0YXJ0U3RyZWFtUmVzcG9uc2USUAoKU3RvcFN0cmVhbRIiLmJyb3dzZXJzY2FsZS52MS5TdG9wU3RyZWFtUmVxdWVzdBoeLmJyb3dzZXJzY2FsZS52MS5Db21tYW5kUmVzdWx0ElIKCVJ1blNjcmlwdBIhLmJyb3dzZXJzY2FsZS52MS5SdW5TY3JpcHRSZXF1ZXN0GiIuYnJvd3NlcnNjYWxlLnYxLlJ1blNjcmlwdFJlc3BvbnNlElgKC1N0YXJ0U2NyaXB0EiMuYnJvd3NlcnNjYWxlLnYxLlN0YXJ0U2NyaXB0UmVxdWVzdBokLmJyb3dzZXJzY2FsZS52MS5TdGFydFNjcmlwdFJlc3BvbnNlElgKC1N0b3BTY3JpcHRzEiMuYnJvd3NlcnNjYWxlLnYxLlN0b3BTY3JpcHRzUmVxdWVzdBokLmJyb3dzZXJzY2FsZS52MS5TdG9wU2NyaXB0c1Jlc3BvbnNlEmEKDkxpc3RTY3JpcHRSdW5zEiYuYnJvd3NlcnNjYWxlLnYxLkxpc3RTY3JpcHRSdW5zUmVxdWVzdBonLmJyb3dzZXJzY2FsZS52MS5MaXN0U2NyaXB0UnVuc1Jlc3BvbnNlEmAKElN0cmVhbVNjcmlwdEV2ZW50cxIqLmJyb3dzZXJzY2FsZS52MS5TdHJlYW1TY3JpcHRFdmVudHNSZXF1ZXN0GhwuYnJvd3NlcnNjYWxlLnYxLlNjcmlwdEV2ZW50MAFCM1oxZ2l0aHViLmNvbS9icm93c2Vyc2NhbGUvYnJvd3NlcnNjYWxlLWdvL2dlbmVyYXRlZGIGcHJvdG8z", [file_google_protobuf_empty]);
|
|
3803
3803
|
var HeaderSchema = /* @__PURE__ */ messageDesc(file_wrc, 3);
|
|
3804
3804
|
var HeaderModificationSchema = /* @__PURE__ */ messageDesc(file_wrc, 6);
|
|
3805
3805
|
var CookiePartitionKeySchema = /* @__PURE__ */ messageDesc(file_wrc, 7);
|
|
3806
3806
|
var CookieParamSchema = /* @__PURE__ */ messageDesc(file_wrc, 8);
|
|
3807
3807
|
var WaitConditionSchema = /* @__PURE__ */ messageDesc(file_wrc, 9);
|
|
3808
|
-
var AddReactionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3809
|
-
var RemoveReactionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3810
|
-
var ListReactionsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3811
|
-
var SetProxyRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3812
|
-
var GetPagesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc,
|
|
3813
|
-
var
|
|
3814
|
-
var
|
|
3815
|
-
var
|
|
3816
|
-
var
|
|
3817
|
-
var
|
|
3818
|
-
var
|
|
3819
|
-
var
|
|
3820
|
-
var
|
|
3821
|
-
var
|
|
3822
|
-
var
|
|
3823
|
-
var
|
|
3824
|
-
var
|
|
3825
|
-
var
|
|
3826
|
-
var
|
|
3827
|
-
var
|
|
3828
|
-
var
|
|
3829
|
-
var
|
|
3830
|
-
var
|
|
3831
|
-
var
|
|
3832
|
-
var
|
|
3833
|
-
var
|
|
3834
|
-
var
|
|
3835
|
-
var
|
|
3836
|
-
var
|
|
3837
|
-
var
|
|
3838
|
-
var
|
|
3839
|
-
var
|
|
3840
|
-
var
|
|
3841
|
-
var
|
|
3842
|
-
var
|
|
3843
|
-
var
|
|
3844
|
-
var
|
|
3845
|
-
var
|
|
3846
|
-
var
|
|
3847
|
-
var
|
|
3848
|
-
var
|
|
3849
|
-
var
|
|
3850
|
-
var
|
|
3851
|
-
var
|
|
3852
|
-
var
|
|
3853
|
-
var
|
|
3854
|
-
var
|
|
3855
|
-
var
|
|
3856
|
-
var
|
|
3857
|
-
var
|
|
3858
|
-
var
|
|
3859
|
-
var
|
|
3860
|
-
var
|
|
3861
|
-
var
|
|
3862
|
-
var
|
|
3863
|
-
var
|
|
3864
|
-
var
|
|
3865
|
-
var
|
|
3866
|
-
var
|
|
3867
|
-
var
|
|
3868
|
-
var
|
|
3869
|
-
var
|
|
3870
|
-
var
|
|
3808
|
+
var AddReactionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 20);
|
|
3809
|
+
var RemoveReactionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 22);
|
|
3810
|
+
var ListReactionsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 24);
|
|
3811
|
+
var SetProxyRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 37);
|
|
3812
|
+
var GetPagesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 38);
|
|
3813
|
+
var GetUsageRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 41);
|
|
3814
|
+
var NavigateRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 43);
|
|
3815
|
+
var LoadHTMLRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 45);
|
|
3816
|
+
var EvaluateRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 46);
|
|
3817
|
+
var WaitForAnyParamsSchema = /* @__PURE__ */ messageDesc(file_wrc, 48);
|
|
3818
|
+
var SelectOptionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 49);
|
|
3819
|
+
var ScrollToRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 50);
|
|
3820
|
+
var MoveToRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 51);
|
|
3821
|
+
var ClickRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 52);
|
|
3822
|
+
var DragRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 53);
|
|
3823
|
+
var FillRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 54);
|
|
3824
|
+
var SetBlockListRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 55);
|
|
3825
|
+
var SetStaticPathsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 56);
|
|
3826
|
+
var WaitForAnyRequestRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 57);
|
|
3827
|
+
var WaitForAnyResponseRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 59);
|
|
3828
|
+
var ModifyRequestRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 61);
|
|
3829
|
+
var StartNetworkCaptureRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 63);
|
|
3830
|
+
var StopNetworkCaptureRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 64);
|
|
3831
|
+
var StreamNetworkExchangesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 66);
|
|
3832
|
+
var GetCookiesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 69);
|
|
3833
|
+
var SetCookiesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 71);
|
|
3834
|
+
var ClearCookiesRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 72);
|
|
3835
|
+
var StorageItemSchema = /* @__PURE__ */ messageDesc(file_wrc, 73);
|
|
3836
|
+
var StorageOriginEntrySchema = /* @__PURE__ */ messageDesc(file_wrc, 74);
|
|
3837
|
+
var GetStorageRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 75);
|
|
3838
|
+
var SetStorageRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 77);
|
|
3839
|
+
var ClearStorageRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 78);
|
|
3840
|
+
var DbscSessionSchema = /* @__PURE__ */ messageDesc(file_wrc, 79);
|
|
3841
|
+
var AuthSessionSchema = /* @__PURE__ */ messageDesc(file_wrc, 80);
|
|
3842
|
+
var GetAuthSessionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 81);
|
|
3843
|
+
var SetAuthSessionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 83);
|
|
3844
|
+
var GetDOMRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 84);
|
|
3845
|
+
var GetObservationRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 86);
|
|
3846
|
+
var GetDOMHashRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 88);
|
|
3847
|
+
var StartDomMirrorRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 90);
|
|
3848
|
+
var StopDomMirrorRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 92);
|
|
3849
|
+
var GetDomChildrenRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 93);
|
|
3850
|
+
var ReleaseDomSubtreeRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 95);
|
|
3851
|
+
var RevealDomNodeRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 96);
|
|
3852
|
+
var GetDomRevisionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 98);
|
|
3853
|
+
var StreamDomEventsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 100);
|
|
3854
|
+
var InspectAtPositionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 104);
|
|
3855
|
+
var HighlightNodeRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 106);
|
|
3856
|
+
var InsertTextRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 107);
|
|
3857
|
+
var TypeRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 108);
|
|
3858
|
+
var PressKeyRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 109);
|
|
3859
|
+
var ReleaseKeyRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 110);
|
|
3860
|
+
var GetSelectionRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 111);
|
|
3861
|
+
var ScreenshotRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 113);
|
|
3862
|
+
var ReadCanvasRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 115);
|
|
3863
|
+
var SolveCaptchaRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 117);
|
|
3864
|
+
var GetStreamConfigRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 120);
|
|
3865
|
+
var StartStreamRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 122);
|
|
3866
|
+
var StopStreamRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 124);
|
|
3867
|
+
var RunScriptRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 126);
|
|
3868
|
+
var StartScriptRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 128);
|
|
3869
|
+
var StopScriptsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 130);
|
|
3870
|
+
var ListScriptRunsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 133);
|
|
3871
|
+
var StreamScriptEventsRequestSchema = /* @__PURE__ */ messageDesc(file_wrc, 135);
|
|
3871
3872
|
var Browser = /* @__PURE__ */ serviceDesc(file_wrc, 0);
|
|
3872
3873
|
|
|
3873
|
-
// src/defaults.ts
|
|
3874
|
-
var DefaultWaitTimeoutMs = 3e4;
|
|
3875
|
-
var DefaultVisible = true;
|
|
3876
|
-
var DefaultSteadyMs = 500;
|
|
3877
|
-
|
|
3878
3874
|
// src/errors.ts
|
|
3879
3875
|
var BrowserScaleError = class extends Error {
|
|
3880
3876
|
constructor(message, cause) {
|
|
@@ -3883,6 +3879,19 @@ var BrowserScaleError = class extends Error {
|
|
|
3883
3879
|
this.name = "BrowserScaleError";
|
|
3884
3880
|
}
|
|
3885
3881
|
};
|
|
3882
|
+
function throwCommandError(command, error) {
|
|
3883
|
+
if (error) {
|
|
3884
|
+
throw new CommandError({ command, code: error.code, message: error.message });
|
|
3885
|
+
}
|
|
3886
|
+
}
|
|
3887
|
+
var CommandError = class extends BrowserScaleError {
|
|
3888
|
+
constructor(init) {
|
|
3889
|
+
super(formatMessage(init.command, init.code, init.message));
|
|
3890
|
+
this.name = "CommandError";
|
|
3891
|
+
this.command = init.command;
|
|
3892
|
+
this.code = init.code;
|
|
3893
|
+
}
|
|
3894
|
+
};
|
|
3886
3895
|
var ClickError = class extends BrowserScaleError {
|
|
3887
3896
|
constructor(init) {
|
|
3888
3897
|
super(formatMessage("click", init.code, init.message));
|
|
@@ -3982,9 +3991,9 @@ var Locator = class _Locator {
|
|
|
3982
3991
|
* Enforces or disables the visibility check for this Locator's wait
|
|
3983
3992
|
* condition.
|
|
3984
3993
|
*
|
|
3985
|
-
*
|
|
3986
|
-
* no effect when used as an action target — actions
|
|
3987
|
-
* visibility before dispatching.
|
|
3994
|
+
* Visibility is required by default, so pass `false` to wait for DOM
|
|
3995
|
+
* presence alone. Has no effect when used as an action target — actions
|
|
3996
|
+
* never check visibility before dispatching.
|
|
3988
3997
|
*
|
|
3989
3998
|
* @param v - true to require visibility, false to skip the check
|
|
3990
3999
|
*
|
|
@@ -4000,9 +4009,9 @@ var Locator = class _Locator {
|
|
|
4000
4009
|
* Requires the element to keep a stable position and size for at least
|
|
4001
4010
|
* `ms` milliseconds before the wait matches.
|
|
4002
4011
|
*
|
|
4003
|
-
*
|
|
4004
|
-
* for js() expressions that return a non-Element
|
|
4005
|
-
* as an action target.
|
|
4012
|
+
* Settling defaults to 500ms, so pass 0 to match the instant the element
|
|
4013
|
+
* is found. Has no effect for js() expressions that return a non-Element
|
|
4014
|
+
* value, nor when used as an action target.
|
|
4006
4015
|
*
|
|
4007
4016
|
* @param ms - steady-state duration in milliseconds; 0 disables
|
|
4008
4017
|
*
|
|
@@ -4065,19 +4074,11 @@ var Locator = class _Locator {
|
|
|
4065
4074
|
// ── Constructors (top-level functions re-export these) ──────────────
|
|
4066
4075
|
/** @internal */
|
|
4067
4076
|
static _css(selector) {
|
|
4068
|
-
return new _Locator({
|
|
4069
|
-
selector,
|
|
4070
|
-
visibleFlag: DefaultVisible,
|
|
4071
|
-
steadyMs: DefaultSteadyMs
|
|
4072
|
-
});
|
|
4077
|
+
return new _Locator({ selector });
|
|
4073
4078
|
}
|
|
4074
4079
|
/** @internal */
|
|
4075
4080
|
static _js(expression) {
|
|
4076
|
-
return new _Locator({
|
|
4077
|
-
jsExpression: expression,
|
|
4078
|
-
visibleFlag: DefaultVisible,
|
|
4079
|
-
steadyMs: DefaultSteadyMs
|
|
4080
|
-
});
|
|
4081
|
+
return new _Locator({ jsExpression: expression });
|
|
4081
4082
|
}
|
|
4082
4083
|
/** @internal */
|
|
4083
4084
|
static _node(backendNodeId) {
|
|
@@ -4260,6 +4261,7 @@ function waitConditionStatusFromProto(c) {
|
|
|
4260
4261
|
}
|
|
4261
4262
|
function unwrapWait(r) {
|
|
4262
4263
|
const res = {
|
|
4264
|
+
success: r.success,
|
|
4263
4265
|
index: r.index,
|
|
4264
4266
|
frameId: r.frameId,
|
|
4265
4267
|
backendNodeId: r.backendNodeId,
|
|
@@ -4299,6 +4301,17 @@ function pageInfoFromProto(p) {
|
|
|
4299
4301
|
frameTree: p.frameTree ? frameInfoFromProto(p.frameTree) : {}
|
|
4300
4302
|
};
|
|
4301
4303
|
}
|
|
4304
|
+
function sessionUsageFromProto(u) {
|
|
4305
|
+
return {
|
|
4306
|
+
wallTime: u.wallTime,
|
|
4307
|
+
cpuTime: u.cpuTime,
|
|
4308
|
+
minMemory: u.minMemory,
|
|
4309
|
+
averageMemory: u.averageMemory,
|
|
4310
|
+
peakMemory: u.peakMemory,
|
|
4311
|
+
renderersUsed: u.renderersUsed,
|
|
4312
|
+
framesCreated: u.framesCreated
|
|
4313
|
+
};
|
|
4314
|
+
}
|
|
4302
4315
|
function headerFromProto(h) {
|
|
4303
4316
|
return { name: h.name, value: h.value };
|
|
4304
4317
|
}
|
|
@@ -4558,8 +4571,9 @@ var NetworkCapture = class {
|
|
|
4558
4571
|
* {@link CloudBrowser.stopNetworkCapture} instead: stop awaits the reader,
|
|
4559
4572
|
* which cannot finish while the handler it called is still running.
|
|
4560
4573
|
*
|
|
4561
|
-
*
|
|
4562
|
-
*
|
|
4574
|
+
* Rejects only on a transport failure, and the local reader is shut down
|
|
4575
|
+
* regardless. Disarming a capture that is not running is a no-op rather than a
|
|
4576
|
+
* failure, so there are no error codes to branch on.
|
|
4563
4577
|
*/
|
|
4564
4578
|
async stop() {
|
|
4565
4579
|
if (this.stopped) return;
|
|
@@ -4680,7 +4694,8 @@ var ScriptRun = class {
|
|
|
4680
4694
|
*
|
|
4681
4695
|
* @returns how the script ended
|
|
4682
4696
|
*
|
|
4683
|
-
*
|
|
4697
|
+
* Rejects only on a transport failure - the connection dying, or the run being
|
|
4698
|
+
* abandoned. A script that threw is a normal outcome and arrives in the result.
|
|
4684
4699
|
*/
|
|
4685
4700
|
async wait() {
|
|
4686
4701
|
await this.endedPromise;
|
|
@@ -4698,8 +4713,8 @@ var ScriptRun = class {
|
|
|
4698
4713
|
* at its next operation in the page. Either way the handler sees a `finished`
|
|
4699
4714
|
* with `stopped` set, unless the local reader is torn down first.
|
|
4700
4715
|
*
|
|
4701
|
-
*
|
|
4702
|
-
*
|
|
4716
|
+
* Rejects only on a transport failure, and the local reader is detached
|
|
4717
|
+
* regardless. Cancelling a run that has already finished is a no-op.
|
|
4703
4718
|
*/
|
|
4704
4719
|
async stop() {
|
|
4705
4720
|
if (this.detached) return;
|
|
@@ -4874,6 +4889,14 @@ var DomMirror = class {
|
|
|
4874
4889
|
* boundary was crossed; it is a child list like any other.
|
|
4875
4890
|
*
|
|
4876
4891
|
* @param depth levels below the node, default 1
|
|
4892
|
+
*
|
|
4893
|
+
* @throws not_mirrored - the page has no mirror, or the node's frame is not
|
|
4894
|
+
* part of the one it has; after a resync, fetch the current tree before
|
|
4895
|
+
* addressing nodes again
|
|
4896
|
+
* @throws mirror_failed - the subtree could not be serialized, usually a
|
|
4897
|
+
* document that went away mid-read
|
|
4898
|
+
*
|
|
4899
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
4877
4900
|
*/
|
|
4878
4901
|
async expand(node2, depth) {
|
|
4879
4902
|
if (this.stopped) return;
|
|
@@ -4899,6 +4922,13 @@ var DomMirror = class {
|
|
|
4899
4922
|
*
|
|
4900
4923
|
* Skipping this is not an error, it is a slow leak: the browser's revealed
|
|
4901
4924
|
* set only grows, and eventually it is no longer filtering anything.
|
|
4925
|
+
*
|
|
4926
|
+
* @throws not_mirrored - the page has no mirror, or the node's frame is not
|
|
4927
|
+
* part of the one it has; this is what collapsing a node from a tree that has
|
|
4928
|
+
* since been resynced looks like, so fetch the current tree and address the
|
|
4929
|
+
* node again
|
|
4930
|
+
*
|
|
4931
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
4902
4932
|
*/
|
|
4903
4933
|
async collapse(node2) {
|
|
4904
4934
|
if (this.stopped) return;
|
|
@@ -4925,6 +4955,13 @@ var DomMirror = class {
|
|
|
4925
4955
|
*
|
|
4926
4956
|
* @returns the ancestor chain, the main document first, or an empty array if
|
|
4927
4957
|
* the node is not on the page
|
|
4958
|
+
*
|
|
4959
|
+
* @throws not_mirrored - the page has no mirror, or the given frame is not part
|
|
4960
|
+
* of the one it has
|
|
4961
|
+
* @throws mirror_failed - the path could not be serialized, usually a document
|
|
4962
|
+
* that went away mid-read
|
|
4963
|
+
*
|
|
4964
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
4928
4965
|
*/
|
|
4929
4966
|
async reveal(backendNodeId, frameId) {
|
|
4930
4967
|
if (this.stopped) return [];
|
|
@@ -4960,6 +4997,11 @@ var DomMirror = class {
|
|
|
4960
4997
|
* Throws away the local copy of the whole page and fetches a fresh one.
|
|
4961
4998
|
* Happens automatically whenever the browser says the copy is void, so you
|
|
4962
4999
|
* rarely need to call it.
|
|
5000
|
+
*
|
|
5001
|
+
* @throws mirror_failed - the page could not be serialized, usually a document
|
|
5002
|
+
* that went away while the tree was being rebuilt. The mirror then ends
|
|
5003
|
+
*
|
|
5004
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
4963
5005
|
*/
|
|
4964
5006
|
async resync(reason = "manual") {
|
|
4965
5007
|
if (this.stopped) return;
|
|
@@ -5299,15 +5341,25 @@ var CloudBrowser = class {
|
|
|
5299
5341
|
* {@link createWebSocketBrowser} the rental stays untouched; only the
|
|
5300
5342
|
* transport is closed.
|
|
5301
5343
|
*
|
|
5302
|
-
* @
|
|
5344
|
+
* @returns SessionUsage what the session consumed over its whole life, read
|
|
5345
|
+
* as it was torn down - no {@link CloudBrowser.getUsage} call is needed
|
|
5346
|
+
* before stopping. Undefined when the server could not report it, and for
|
|
5347
|
+
* a handle that owns no rental.
|
|
5348
|
+
*
|
|
5349
|
+
* Rejects only when the stop API or the transport close fails. The session is
|
|
5350
|
+
* released either way; retrying a stop is safe.
|
|
5303
5351
|
*
|
|
5304
5352
|
* @example
|
|
5305
|
-
* await browser.stopBrowser();
|
|
5353
|
+
* const usage = await browser.stopBrowser();
|
|
5354
|
+
* if (usage) {
|
|
5355
|
+
* console.log(`ran ${usage.wallTime}s, ${usage.cpuTime}s CPU, peak ${usage.peakMemory} bytes`);
|
|
5356
|
+
* }
|
|
5306
5357
|
*/
|
|
5307
5358
|
async stopBrowser() {
|
|
5308
5359
|
if (this._stopFn) {
|
|
5309
|
-
await this._stopFn();
|
|
5360
|
+
return await this._stopFn();
|
|
5310
5361
|
}
|
|
5362
|
+
return void 0;
|
|
5311
5363
|
}
|
|
5312
5364
|
// ──────────────────────────────────────────────────────────────────
|
|
5313
5365
|
// Context-level
|
|
@@ -5324,7 +5376,9 @@ var CloudBrowser = class {
|
|
|
5324
5376
|
* @param proxyUsername - proxy auth user; empty for unauthenticated proxies
|
|
5325
5377
|
* @param proxyPassword - proxy auth password; empty for unauthenticated proxies
|
|
5326
5378
|
*
|
|
5327
|
-
*
|
|
5379
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
5380
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
5381
|
+
* are no error codes to branch on.
|
|
5328
5382
|
*
|
|
5329
5383
|
* @example
|
|
5330
5384
|
* await browser.setProxy("proxy.example.com", 8080, "user", "pass");
|
|
@@ -5340,7 +5394,8 @@ var CloudBrowser = class {
|
|
|
5340
5394
|
if (proxyUsername) req.proxyUsername = proxyUsername;
|
|
5341
5395
|
if (proxyPassword) req.proxyPassword = proxyPassword;
|
|
5342
5396
|
}
|
|
5343
|
-
await this.client.setProxy(req);
|
|
5397
|
+
const res = await this.client.setProxy(req);
|
|
5398
|
+
throwCommandError("setProxy", res.error);
|
|
5344
5399
|
}
|
|
5345
5400
|
/**
|
|
5346
5401
|
* Returns all open pages (tabs and popups) for this session's browser
|
|
@@ -5352,7 +5407,9 @@ var CloudBrowser = class {
|
|
|
5352
5407
|
*
|
|
5353
5408
|
* @returns PageInfo[] for every page currently open in the context
|
|
5354
5409
|
*
|
|
5355
|
-
*
|
|
5410
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
5411
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
5412
|
+
* are no error codes to branch on.
|
|
5356
5413
|
*
|
|
5357
5414
|
* @example
|
|
5358
5415
|
* const pages = await browser.getPages();
|
|
@@ -5365,8 +5422,42 @@ var CloudBrowser = class {
|
|
|
5365
5422
|
apiKey: this.apiKey
|
|
5366
5423
|
})
|
|
5367
5424
|
);
|
|
5425
|
+
throwCommandError("getPages", resp.error);
|
|
5368
5426
|
return resp.pages.map(pageInfoFromProto);
|
|
5369
5427
|
}
|
|
5428
|
+
/**
|
|
5429
|
+
* Reports what this session's browser has consumed so far.
|
|
5430
|
+
*
|
|
5431
|
+
* Everything but minMemory and averageMemory only ever grows, so polling and
|
|
5432
|
+
* diffing two readings gives the cost of what ran in between. The final
|
|
5433
|
+
* figures need no call of their own: {@link CloudBrowser.stopBrowser} resolves
|
|
5434
|
+
* with them.
|
|
5435
|
+
*
|
|
5436
|
+
* @returns SessionUsage as of now
|
|
5437
|
+
*
|
|
5438
|
+
* Rejects only on a transport failure - a dead session, a broken connection.
|
|
5439
|
+
* This call has no semantic failure of its own, so there are no error codes to
|
|
5440
|
+
* branch on.
|
|
5441
|
+
*
|
|
5442
|
+
* @example
|
|
5443
|
+
* const before = await browser.getUsage();
|
|
5444
|
+
* await browser.navigate("https://example.com");
|
|
5445
|
+
* const after = await browser.getUsage();
|
|
5446
|
+
* console.log(`navigation cost ${after.cpuTime - before.cpuTime}s of CPU`);
|
|
5447
|
+
*/
|
|
5448
|
+
async getUsage() {
|
|
5449
|
+
const resp = await this.client.getUsage(
|
|
5450
|
+
create(GetUsageRequestSchema, {
|
|
5451
|
+
sessionId: this.sessionId,
|
|
5452
|
+
apiKey: this.apiKey
|
|
5453
|
+
})
|
|
5454
|
+
);
|
|
5455
|
+
throwCommandError("getUsage", resp.error);
|
|
5456
|
+
if (!resp.usage) {
|
|
5457
|
+
throw new BrowserScaleError("getUsage: the server sent no usage");
|
|
5458
|
+
}
|
|
5459
|
+
return sessionUsageFromProto(resp.usage);
|
|
5460
|
+
}
|
|
5370
5461
|
// ──────────────────────────────────────────────────────────────────
|
|
5371
5462
|
// Page navigation / content
|
|
5372
5463
|
// ──────────────────────────────────────────────────────────────────
|
|
@@ -5383,7 +5474,16 @@ var CloudBrowser = class {
|
|
|
5383
5474
|
* @returns NavigateResult with the final resolved URL and the frameId
|
|
5384
5475
|
* of the main frame after navigation
|
|
5385
5476
|
*
|
|
5386
|
-
* @throws
|
|
5477
|
+
* @throws timeout - nothing committed before the deadline; the page may still
|
|
5478
|
+
* be loading, so a longer timeout can be the whole fix
|
|
5479
|
+
* @throws net_error - the URL never loaded: DNS, TLS, a refused connection, or
|
|
5480
|
+
* a proxy that could not reach it. The message carries the underlying net
|
|
5481
|
+
* error name, which is what separates a bad proxy from a bad host - worth
|
|
5482
|
+
* logging, since the two need different fixes
|
|
5483
|
+
* @throws crashed - the renderer died mid-navigation; the page is unusable and
|
|
5484
|
+
* has to be navigated again
|
|
5485
|
+
*
|
|
5486
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
5387
5487
|
*
|
|
5388
5488
|
* @example
|
|
5389
5489
|
* await browser.navigate("https://example.com");
|
|
@@ -5396,6 +5496,7 @@ var CloudBrowser = class {
|
|
|
5396
5496
|
});
|
|
5397
5497
|
if (opts?.timeoutMs) req.timeout = opts.timeoutMs;
|
|
5398
5498
|
const resp = await this.client.navigate(req);
|
|
5499
|
+
throwCommandError("navigate", resp.error);
|
|
5399
5500
|
return { frameId: resp.frameId, url: resp.url };
|
|
5400
5501
|
}
|
|
5401
5502
|
/**
|
|
@@ -5410,7 +5511,11 @@ var CloudBrowser = class {
|
|
|
5410
5511
|
* @param html - response body to serve
|
|
5411
5512
|
* @param opts - optional headers and statusCode (default 200)
|
|
5412
5513
|
*
|
|
5413
|
-
* @throws
|
|
5514
|
+
* @throws timeout - the page never requested the URL, so the prepared
|
|
5515
|
+
* response had nobody to hand it to; usually the navigation was cancelled
|
|
5516
|
+
* or redirected away before reaching it
|
|
5517
|
+
*
|
|
5518
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
5414
5519
|
*
|
|
5415
5520
|
* @example
|
|
5416
5521
|
* await browser.loadHTML("https://example.com", "<h1>hi</h1>");
|
|
@@ -5425,7 +5530,8 @@ var CloudBrowser = class {
|
|
|
5425
5530
|
headers: headersToProto(opts?.headers)
|
|
5426
5531
|
});
|
|
5427
5532
|
if (opts?.statusCode) req.statusCode = opts.statusCode;
|
|
5428
|
-
await this.client.loadHTML(req);
|
|
5533
|
+
const res = await this.client.loadHTML(req);
|
|
5534
|
+
throwCommandError("loadHTML", res.error);
|
|
5429
5535
|
}
|
|
5430
5536
|
// ──────────────────────────────────────────────────────────────────
|
|
5431
5537
|
// Evaluation
|
|
@@ -5442,16 +5548,34 @@ var CloudBrowser = class {
|
|
|
5442
5548
|
* The generic T is a TypeScript hint only — there is no runtime
|
|
5443
5549
|
* validation that the JS expression actually returned that type.
|
|
5444
5550
|
*
|
|
5551
|
+
* A falsy answer and a broken expression are different outcomes. Returning
|
|
5552
|
+
* null, false or undefined is a successful evaluation and resolves normally;
|
|
5553
|
+
* an expression that throws or will not compile rejects with a
|
|
5554
|
+
* {@link CommandError}, so a typo can never read as "the page says null".
|
|
5555
|
+
*
|
|
5445
5556
|
* @param expression - JavaScript expression evaluated in the main frame
|
|
5446
5557
|
*
|
|
5447
5558
|
* @returns EvaluateResult with either value (non-Element) or element
|
|
5448
5559
|
* metadata (Element)
|
|
5449
5560
|
*
|
|
5450
|
-
* @throws
|
|
5561
|
+
* @throws {@link CommandError} - code `"threw"` (the expression raised; the
|
|
5562
|
+
* message carries the exception text), `"not_run"` (it could not be
|
|
5563
|
+
* compiled, or execution never started), `"aborted"` (the browser stopped
|
|
5564
|
+
* execution) or `"no_context"` (the frame had no live script context)
|
|
5451
5565
|
*
|
|
5452
5566
|
* @example
|
|
5453
5567
|
* const res = await browser.evaluate<string>("document.title");
|
|
5454
5568
|
* console.log(res.value);
|
|
5569
|
+
*
|
|
5570
|
+
* @example
|
|
5571
|
+
* // Telling a false answer from a broken expression.
|
|
5572
|
+
* try {
|
|
5573
|
+
* const res = await browser.evaluate<boolean>("window.__ready === true");
|
|
5574
|
+
* if (!res.value) { /* legitimately not ready yet *\/ }
|
|
5575
|
+
* } catch (e) {
|
|
5576
|
+
* if (e instanceof CommandError) throw new Error(`expression broken: ${e.message}`);
|
|
5577
|
+
* throw e;
|
|
5578
|
+
* }
|
|
5455
5579
|
*/
|
|
5456
5580
|
async evaluate(expression) {
|
|
5457
5581
|
return this._evaluate("", expression);
|
|
@@ -5483,6 +5607,13 @@ var CloudBrowser = class {
|
|
|
5483
5607
|
});
|
|
5484
5608
|
if (frameId) req.frameId = frameId;
|
|
5485
5609
|
const resp = await this.client.evaluate(req);
|
|
5610
|
+
if (resp.error) {
|
|
5611
|
+
throw new CommandError({
|
|
5612
|
+
command: "evaluate",
|
|
5613
|
+
code: resp.error.code,
|
|
5614
|
+
message: resp.error.message
|
|
5615
|
+
});
|
|
5616
|
+
}
|
|
5486
5617
|
let value = null;
|
|
5487
5618
|
if (resp.result !== "") {
|
|
5488
5619
|
try {
|
|
@@ -5492,6 +5623,7 @@ var CloudBrowser = class {
|
|
|
5492
5623
|
}
|
|
5493
5624
|
}
|
|
5494
5625
|
return {
|
|
5626
|
+
success: resp.success,
|
|
5495
5627
|
value,
|
|
5496
5628
|
backendNodeId: resp.backendNodeId,
|
|
5497
5629
|
isVisible: resp.isVisible,
|
|
@@ -5579,7 +5711,8 @@ var CloudBrowser = class {
|
|
|
5579
5711
|
sessionId: this.sessionId,
|
|
5580
5712
|
apiKey: this.apiKey,
|
|
5581
5713
|
conditions: pbConds,
|
|
5582
|
-
|
|
5714
|
+
// Left unset unless the caller passed one, so the API applies its default.
|
|
5715
|
+
timeout: opts?.timeoutMs
|
|
5583
5716
|
});
|
|
5584
5717
|
if (frameId) req.frameId = frameId;
|
|
5585
5718
|
return unwrapWait(await this.client.waitForAny(req));
|
|
@@ -5893,7 +6026,9 @@ var CloudBrowser = class {
|
|
|
5893
6026
|
* @returns DOMResult with the JSON string in `.dom` (the `.hash` field
|
|
5894
6027
|
* is populated by {@link getDOMHash}, not by this call)
|
|
5895
6028
|
*
|
|
5896
|
-
*
|
|
6029
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6030
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6031
|
+
* are no error codes to branch on.
|
|
5897
6032
|
*
|
|
5898
6033
|
* @example
|
|
5899
6034
|
* const { dom } = await browser.getDOM();
|
|
@@ -5906,6 +6041,7 @@ var CloudBrowser = class {
|
|
|
5906
6041
|
if (frameId) req.frameId = frameId;
|
|
5907
6042
|
if (opts?.depth !== void 0) req.depth = opts.depth;
|
|
5908
6043
|
const resp = await this.client.getDOM(req);
|
|
6044
|
+
throwCommandError("getDOM", resp.error);
|
|
5909
6045
|
return { hash: "", dom: resp.dom };
|
|
5910
6046
|
}
|
|
5911
6047
|
/**
|
|
@@ -5920,7 +6056,9 @@ var CloudBrowser = class {
|
|
|
5920
6056
|
*
|
|
5921
6057
|
* @returns 16-char hex string (the first 8 bytes of sha256 of the DOM JSON)
|
|
5922
6058
|
*
|
|
5923
|
-
*
|
|
6059
|
+
* Rejects only on a transport failure. The hash is computed from a serialized
|
|
6060
|
+
* tree, so there is no semantic failure of its own and no error codes to branch
|
|
6061
|
+
* on.
|
|
5924
6062
|
*
|
|
5925
6063
|
* @example
|
|
5926
6064
|
* const hash = await browser.getDOMHash();
|
|
@@ -5968,7 +6106,11 @@ var CloudBrowser = class {
|
|
|
5968
6106
|
*
|
|
5969
6107
|
* @returns the observation in the requested format, ready to hand to a model
|
|
5970
6108
|
*
|
|
5971
|
-
* @throws
|
|
6109
|
+
* @throws not_found - the requested scope root is not on the page, so there
|
|
6110
|
+
* was nothing to observe. Distinct from an observation that comes back
|
|
6111
|
+
* empty, which means the scope exists and holds nothing worth reporting
|
|
6112
|
+
*
|
|
6113
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
5972
6114
|
*
|
|
5973
6115
|
* @example
|
|
5974
6116
|
* const obs = await browser.getObservation();
|
|
@@ -5992,6 +6134,7 @@ var CloudBrowser = class {
|
|
|
5992
6134
|
if (opts?.jsExpression !== void 0) req.jsExpression = opts.jsExpression;
|
|
5993
6135
|
if (opts?.frameId !== void 0) req.frameId = opts.frameId;
|
|
5994
6136
|
const resp = await this.client.getObservation(req);
|
|
6137
|
+
throwCommandError("getObservation", resp.error);
|
|
5995
6138
|
return resp.observation;
|
|
5996
6139
|
}
|
|
5997
6140
|
/**
|
|
@@ -6008,7 +6151,11 @@ var CloudBrowser = class {
|
|
|
6008
6151
|
* @returns ScreenshotResult with the base64 image in `dataBase64` and the
|
|
6009
6152
|
* physical pixel `width`/`height`
|
|
6010
6153
|
*
|
|
6011
|
-
* @throws
|
|
6154
|
+
* @throws capture_failed - the page had no frame to copy. A page that has not
|
|
6155
|
+
* produced one yet, or is not being composited at the moment, has nothing to
|
|
6156
|
+
* hand over; retrying after it renders usually works
|
|
6157
|
+
*
|
|
6158
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6012
6159
|
*
|
|
6013
6160
|
* @example
|
|
6014
6161
|
* const shot = await browser.screenshot({ format: "png" });
|
|
@@ -6022,6 +6169,7 @@ var CloudBrowser = class {
|
|
|
6022
6169
|
if (opts?.format !== void 0) req.format = opts.format;
|
|
6023
6170
|
if (opts?.quality !== void 0) req.quality = opts.quality;
|
|
6024
6171
|
const resp = await this.client.screenshot(req);
|
|
6172
|
+
throwCommandError("screenshot", resp.error);
|
|
6025
6173
|
return {
|
|
6026
6174
|
dataBase64: resp.dataBase64,
|
|
6027
6175
|
width: resp.width,
|
|
@@ -6045,11 +6193,15 @@ var CloudBrowser = class {
|
|
|
6045
6193
|
* canvas `width`/`height`, resolved `frameId`/`backendNodeId` and the
|
|
6046
6194
|
* `originClean` flag
|
|
6047
6195
|
*
|
|
6048
|
-
* @throws
|
|
6049
|
-
* @throws
|
|
6050
|
-
* @throws
|
|
6051
|
-
*
|
|
6052
|
-
*
|
|
6196
|
+
* @throws not_found - no element matched the locator
|
|
6197
|
+
* @throws not_element - the expression was truthy but did not yield an element
|
|
6198
|
+
* @throws not_readable - the target was found but is not a readable canvas
|
|
6199
|
+
*
|
|
6200
|
+
* A target that is empty, uses `at(x, y)` or names several things at once is
|
|
6201
|
+
* rejected before anything is sent. A closed page or a frame that is gone is a
|
|
6202
|
+
* transport failure rather than a code.
|
|
6203
|
+
*
|
|
6204
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6053
6205
|
*
|
|
6054
6206
|
* @example
|
|
6055
6207
|
* const res = await browser.readCanvas(css("#game canvas"));
|
|
@@ -6077,6 +6229,7 @@ var CloudBrowser = class {
|
|
|
6077
6229
|
req.sh = opts.sh;
|
|
6078
6230
|
}
|
|
6079
6231
|
const resp = await this.client.readCanvas(req);
|
|
6232
|
+
throwCommandError("readCanvas", resp.error);
|
|
6080
6233
|
return {
|
|
6081
6234
|
success: resp.success,
|
|
6082
6235
|
frameId: resp.frameId,
|
|
@@ -6100,7 +6253,9 @@ var CloudBrowser = class {
|
|
|
6100
6253
|
*
|
|
6101
6254
|
* @param patterns - URL wildcards to block; empty array clears the list
|
|
6102
6255
|
*
|
|
6103
|
-
*
|
|
6256
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6257
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6258
|
+
* are no error codes to branch on.
|
|
6104
6259
|
*
|
|
6105
6260
|
* @example
|
|
6106
6261
|
* await browser.setBlockList([
|
|
@@ -6109,13 +6264,14 @@ var CloudBrowser = class {
|
|
|
6109
6264
|
* ]);
|
|
6110
6265
|
*/
|
|
6111
6266
|
async setBlockList(patterns) {
|
|
6112
|
-
await this.client.setBlockList(
|
|
6267
|
+
const res = await this.client.setBlockList(
|
|
6113
6268
|
create(SetBlockListRequestSchema, {
|
|
6114
6269
|
sessionId: this.sessionId,
|
|
6115
6270
|
apiKey: this.apiKey,
|
|
6116
6271
|
patterns
|
|
6117
6272
|
})
|
|
6118
6273
|
);
|
|
6274
|
+
throwCommandError("setBlockList", res.error);
|
|
6119
6275
|
}
|
|
6120
6276
|
/**
|
|
6121
6277
|
* Configures the session to serve cached static responses for requests
|
|
@@ -6129,13 +6285,15 @@ var CloudBrowser = class {
|
|
|
6129
6285
|
* @param blobName - server-side identifier of the snapshot to serve from
|
|
6130
6286
|
* @param patterns - URL wildcards to redirect to the cache; empty disables
|
|
6131
6287
|
*
|
|
6132
|
-
*
|
|
6288
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6289
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6290
|
+
* are no error codes to branch on.
|
|
6133
6291
|
*
|
|
6134
6292
|
* @example
|
|
6135
6293
|
* await browser.setStaticPaths("snap-2026-05", ["*.example.com/*"]);
|
|
6136
6294
|
*/
|
|
6137
6295
|
async setStaticPaths(blobName, patterns) {
|
|
6138
|
-
await this.client.setStaticPaths(
|
|
6296
|
+
const res = await this.client.setStaticPaths(
|
|
6139
6297
|
create(SetStaticPathsRequestSchema, {
|
|
6140
6298
|
sessionId: this.sessionId,
|
|
6141
6299
|
apiKey: this.apiKey,
|
|
@@ -6143,6 +6301,7 @@ var CloudBrowser = class {
|
|
|
6143
6301
|
patterns
|
|
6144
6302
|
})
|
|
6145
6303
|
);
|
|
6304
|
+
throwCommandError("setStaticPaths", res.error);
|
|
6146
6305
|
}
|
|
6147
6306
|
/**
|
|
6148
6307
|
* Blocks until the next request whose URL matches one of the supplied
|
|
@@ -6159,7 +6318,12 @@ var CloudBrowser = class {
|
|
|
6159
6318
|
* (the captured method/URL/headers/body; null if intercepted with
|
|
6160
6319
|
* no body)
|
|
6161
6320
|
*
|
|
6162
|
-
* @throws
|
|
6321
|
+
* @throws timeout - no request matched any pattern before the deadline.
|
|
6322
|
+
* Nothing occurring is an answer, and it stays distinguishable from a
|
|
6323
|
+
* connection that died on the way. Supplying no patterns is a caller mistake
|
|
6324
|
+
* rather than an outcome, and rejects separately
|
|
6325
|
+
*
|
|
6326
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6163
6327
|
*
|
|
6164
6328
|
* @example
|
|
6165
6329
|
* const { index, request } = await browser.waitForAnyRequest(
|
|
@@ -6181,6 +6345,7 @@ var CloudBrowser = class {
|
|
|
6181
6345
|
});
|
|
6182
6346
|
if (opts?.timeoutMs) req.timeout = opts.timeoutMs;
|
|
6183
6347
|
const resp = await this.client.waitForAnyRequest(req);
|
|
6348
|
+
throwCommandError("waitForAnyRequest", resp.error);
|
|
6184
6349
|
return {
|
|
6185
6350
|
index: resp.index,
|
|
6186
6351
|
request: interceptedRequestFromProto(resp.request)
|
|
@@ -6199,6 +6364,13 @@ var CloudBrowser = class {
|
|
|
6199
6364
|
* @returns object with `index` (matched pattern index) and `response`
|
|
6200
6365
|
* (the captured status/headers/body; null if no body was returned)
|
|
6201
6366
|
*
|
|
6367
|
+
* @throws timeout - no response matched any pattern before the deadline.
|
|
6368
|
+
* Nothing occurring is an answer, and it stays distinguishable from a
|
|
6369
|
+
* connection that died on the way. Supplying no patterns is a caller mistake
|
|
6370
|
+
* rather than an outcome, and rejects separately
|
|
6371
|
+
*
|
|
6372
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6373
|
+
*
|
|
6202
6374
|
* @example
|
|
6203
6375
|
* const { index, response } = await browser.waitForAnyResponse(
|
|
6204
6376
|
* [{ url: "*\/api/login" }],
|
|
@@ -6219,6 +6391,7 @@ var CloudBrowser = class {
|
|
|
6219
6391
|
});
|
|
6220
6392
|
if (opts?.timeoutMs) req.timeout = opts.timeoutMs;
|
|
6221
6393
|
const resp = await this.client.waitForAnyResponse(req);
|
|
6394
|
+
throwCommandError("waitForAnyResponse", resp.error);
|
|
6222
6395
|
return {
|
|
6223
6396
|
index: resp.index,
|
|
6224
6397
|
response: interceptedResponseFromProto(resp.response)
|
|
@@ -6240,7 +6413,10 @@ var CloudBrowser = class {
|
|
|
6240
6413
|
* were actually sent on the wire after modifications were applied;
|
|
6241
6414
|
* null when no request payload was reported
|
|
6242
6415
|
*
|
|
6243
|
-
* @throws
|
|
6416
|
+
* @throws timeout - no matching request appeared before the deadline, so
|
|
6417
|
+
* nothing was modified
|
|
6418
|
+
*
|
|
6419
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6244
6420
|
*
|
|
6245
6421
|
* @example
|
|
6246
6422
|
* const req = await browser.modifyRequest("*\/api/me", {
|
|
@@ -6262,6 +6438,7 @@ var CloudBrowser = class {
|
|
|
6262
6438
|
if (opts?.body) req.body = opts.body;
|
|
6263
6439
|
if (opts?.timeoutMs) req.timeout = opts.timeoutMs;
|
|
6264
6440
|
const resp = await this.client.modifyRequest(req);
|
|
6441
|
+
throwCommandError("modifyRequest", resp.error);
|
|
6265
6442
|
return interceptedRequestFromProto(resp.request);
|
|
6266
6443
|
}
|
|
6267
6444
|
// ──────────────────────────────────────────────────────────────────
|
|
@@ -6291,7 +6468,9 @@ var CloudBrowser = class {
|
|
|
6291
6468
|
* @returns NetworkCapture handle for stopping the capture and inspecting how
|
|
6292
6469
|
* it ended
|
|
6293
6470
|
*
|
|
6294
|
-
*
|
|
6471
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6472
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6473
|
+
* are no error codes to branch on.
|
|
6295
6474
|
*
|
|
6296
6475
|
* @example
|
|
6297
6476
|
* const capture = await browser.captureNetwork(
|
|
@@ -6325,10 +6504,12 @@ var CloudBrowser = class {
|
|
|
6325
6504
|
*
|
|
6326
6505
|
* @param opts - which requests to capture and whether to keep bodies
|
|
6327
6506
|
*
|
|
6328
|
-
*
|
|
6507
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6508
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6509
|
+
* are no error codes to branch on.
|
|
6329
6510
|
*/
|
|
6330
6511
|
async startNetworkCapture(opts) {
|
|
6331
|
-
await this.client.startNetworkCapture(
|
|
6512
|
+
const res = await this.client.startNetworkCapture(
|
|
6332
6513
|
create(StartNetworkCaptureRequestSchema, {
|
|
6333
6514
|
sessionId: this.sessionId,
|
|
6334
6515
|
apiKey: this.apiKey,
|
|
@@ -6337,13 +6518,15 @@ var CloudBrowser = class {
|
|
|
6337
6518
|
bodyPatterns: opts.bodyPatterns ?? []
|
|
6338
6519
|
})
|
|
6339
6520
|
);
|
|
6521
|
+
throwCommandError("startNetworkCapture", res.error);
|
|
6340
6522
|
}
|
|
6341
6523
|
/**
|
|
6342
6524
|
* Disarms the session's capture.
|
|
6343
6525
|
*
|
|
6344
6526
|
* @returns whether a capture was running
|
|
6345
6527
|
*
|
|
6346
|
-
*
|
|
6528
|
+
* Rejects only on a transport failure. Stopping a capture that is not running
|
|
6529
|
+
* is a no-op rather than a failure, so there are no error codes to branch on.
|
|
6347
6530
|
*/
|
|
6348
6531
|
async stopNetworkCapture() {
|
|
6349
6532
|
const resp = await this.client.stopNetworkCapture(
|
|
@@ -6352,6 +6535,7 @@ var CloudBrowser = class {
|
|
|
6352
6535
|
apiKey: this.apiKey
|
|
6353
6536
|
})
|
|
6354
6537
|
);
|
|
6538
|
+
throwCommandError("stopNetworkCapture", resp.error);
|
|
6355
6539
|
return resp.stopped;
|
|
6356
6540
|
}
|
|
6357
6541
|
/**
|
|
@@ -6368,7 +6552,8 @@ var CloudBrowser = class {
|
|
|
6368
6552
|
* @returns NetworkCapture attached to whatever capture is running; onExchange
|
|
6369
6553
|
* simply never fires when none is
|
|
6370
6554
|
*
|
|
6371
|
-
*
|
|
6555
|
+
* Rejects only on a transport failure: opening the subscription has no semantic
|
|
6556
|
+
* failure of its own.
|
|
6372
6557
|
*/
|
|
6373
6558
|
async streamNetworkExchanges(onExchange) {
|
|
6374
6559
|
return this.subscribeNetworkExchanges(onExchange);
|
|
@@ -6454,7 +6639,10 @@ var CloudBrowser = class {
|
|
|
6454
6639
|
* @param onResync called when the copy had to be rebuilt, after the new tree
|
|
6455
6640
|
* is in place. Rebuilding is automatic; this is for telling the user why
|
|
6456
6641
|
* their expanded nodes collapsed.
|
|
6457
|
-
* @throws
|
|
6642
|
+
* @throws mirror_failed - the page could not be serialized, usually a document
|
|
6643
|
+
* that went away while the tree was being built. No mirror is left running
|
|
6644
|
+
*
|
|
6645
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6458
6646
|
*/
|
|
6459
6647
|
async mirrorDom(opts, onChange, onResync) {
|
|
6460
6648
|
const abort = new AbortController();
|
|
@@ -6504,6 +6692,11 @@ var CloudBrowser = class {
|
|
|
6504
6692
|
* Starts (or restarts) the page's mirror and returns the main document,
|
|
6505
6693
|
* without subscribing to changes. {@link CloudBrowser.mirrorDom} is what you
|
|
6506
6694
|
* normally want; this is the raw command.
|
|
6695
|
+
*
|
|
6696
|
+
* @throws mirror_failed - the page could not be serialized, usually a document
|
|
6697
|
+
* that went away while the tree was being built. No mirror is left running
|
|
6698
|
+
*
|
|
6699
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6507
6700
|
*/
|
|
6508
6701
|
async startDomMirror(opts = {}) {
|
|
6509
6702
|
const req = create(StartDomMirrorRequestSchema, {
|
|
@@ -6513,6 +6706,7 @@ var CloudBrowser = class {
|
|
|
6513
6706
|
if (opts.depth !== void 0) req.depth = opts.depth;
|
|
6514
6707
|
if (opts.pierce !== void 0) req.pierce = opts.pierce;
|
|
6515
6708
|
const resp = await this.client.startDomMirror(req);
|
|
6709
|
+
throwCommandError("startDomMirror", resp.error);
|
|
6516
6710
|
return {
|
|
6517
6711
|
root: resp.root,
|
|
6518
6712
|
frameId: resp.frameId,
|
|
@@ -6521,12 +6715,13 @@ var CloudBrowser = class {
|
|
|
6521
6715
|
}
|
|
6522
6716
|
/** Stops the page's mirror, every frame of it. Idempotent. */
|
|
6523
6717
|
async stopDomMirror() {
|
|
6524
|
-
await this.client.stopDomMirror(
|
|
6718
|
+
const res = await this.client.stopDomMirror(
|
|
6525
6719
|
create(StopDomMirrorRequestSchema, {
|
|
6526
6720
|
sessionId: this.sessionId,
|
|
6527
6721
|
apiKey: this.apiKey
|
|
6528
6722
|
})
|
|
6529
6723
|
);
|
|
6724
|
+
throwCommandError("stopDomMirror", res.error);
|
|
6530
6725
|
}
|
|
6531
6726
|
/**
|
|
6532
6727
|
* Fetches a node's children and starts reporting changes inside them.
|
|
@@ -6534,6 +6729,17 @@ var CloudBrowser = class {
|
|
|
6534
6729
|
*
|
|
6535
6730
|
* On an `<iframe>` the one child is the document it hosts, and this call is
|
|
6536
6731
|
* what starts mirroring that frame.
|
|
6732
|
+
*
|
|
6733
|
+
* An id that is simply unknown is not a failure: the call resolves with an
|
|
6734
|
+
* empty result.
|
|
6735
|
+
*
|
|
6736
|
+
* @throws not_mirrored - the page has no mirror, or frameId is not part of the
|
|
6737
|
+
* one it has; start a mirror first, and after a resync fetch the current tree
|
|
6738
|
+
* before addressing nodes again
|
|
6739
|
+
* @throws mirror_failed - the subtree could not be serialized, usually a
|
|
6740
|
+
* document that went away mid-read
|
|
6741
|
+
*
|
|
6742
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6537
6743
|
*/
|
|
6538
6744
|
async getDomChildren(backendNodeId, frameId = "", depth) {
|
|
6539
6745
|
const req = create(GetDomChildrenRequestSchema, {
|
|
@@ -6544,11 +6750,19 @@ var CloudBrowser = class {
|
|
|
6544
6750
|
if (frameId) req.frameId = frameId;
|
|
6545
6751
|
if (depth !== void 0) req.depth = depth;
|
|
6546
6752
|
const resp = await this.client.getDomChildren(req);
|
|
6753
|
+
throwCommandError("getDomChildren", resp.error);
|
|
6547
6754
|
return { children: resp.children, seq: Number(resp.seq) };
|
|
6548
6755
|
}
|
|
6549
6756
|
/**
|
|
6550
6757
|
* Stops reporting changes inside a node, and inside any frame below it.
|
|
6551
6758
|
* {@link DomMirror.collapse} calls this.
|
|
6759
|
+
*
|
|
6760
|
+
* @throws not_mirrored - the page has no mirror, or frameId is not part of
|
|
6761
|
+
* the one it has; this is what replaying ids from a tree that has since
|
|
6762
|
+
* been resynced looks like, so fetch the current tree and address the node
|
|
6763
|
+
* again
|
|
6764
|
+
*
|
|
6765
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6552
6766
|
*/
|
|
6553
6767
|
async releaseDomSubtree(backendNodeId, frameId = "") {
|
|
6554
6768
|
const req = create(ReleaseDomSubtreeRequestSchema, {
|
|
@@ -6557,13 +6771,24 @@ var CloudBrowser = class {
|
|
|
6557
6771
|
backendNodeId
|
|
6558
6772
|
});
|
|
6559
6773
|
if (frameId) req.frameId = frameId;
|
|
6560
|
-
await this.client.releaseDomSubtree(req);
|
|
6774
|
+
const res = await this.client.releaseDomSubtree(req);
|
|
6775
|
+
throwCommandError("releaseDomSubtree", res.error);
|
|
6561
6776
|
}
|
|
6562
6777
|
/**
|
|
6563
6778
|
* Returns the chain from the main document down to a node, each ancestor
|
|
6564
6779
|
* with its own children, crossing into frames where it has to and starting
|
|
6565
6780
|
* the ones it passes through. {@link DomMirror.reveal} calls this and
|
|
6566
6781
|
* splices it in.
|
|
6782
|
+
*
|
|
6783
|
+
* An id that is simply unknown is not a failure: the call resolves with an
|
|
6784
|
+
* empty result.
|
|
6785
|
+
*
|
|
6786
|
+
* @throws not_mirrored - the page has no mirror, or frameId is not part of the
|
|
6787
|
+
* one it has
|
|
6788
|
+
* @throws mirror_failed - the path could not be serialized, usually a document
|
|
6789
|
+
* that went away mid-read
|
|
6790
|
+
*
|
|
6791
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6567
6792
|
*/
|
|
6568
6793
|
async revealDomNode(backendNodeId, frameId = "") {
|
|
6569
6794
|
const req = create(RevealDomNodeRequestSchema, {
|
|
@@ -6573,6 +6798,7 @@ var CloudBrowser = class {
|
|
|
6573
6798
|
});
|
|
6574
6799
|
if (frameId) req.frameId = frameId;
|
|
6575
6800
|
const resp = await this.client.revealDomNode(req);
|
|
6801
|
+
throwCommandError("revealDomNode", resp.error);
|
|
6576
6802
|
return { path: resp.path, seq: Number(resp.seq) };
|
|
6577
6803
|
}
|
|
6578
6804
|
/**
|
|
@@ -6584,6 +6810,10 @@ var CloudBrowser = class {
|
|
|
6584
6810
|
* whole tree just to hash it. The two answer different questions: a hash
|
|
6585
6811
|
* compares content, a revision only says whether this document moved since
|
|
6586
6812
|
* you last asked.
|
|
6813
|
+
*
|
|
6814
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6815
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6816
|
+
* are no error codes to branch on.
|
|
6587
6817
|
*/
|
|
6588
6818
|
async getDomRevision(frameId = "") {
|
|
6589
6819
|
const req = create(GetDomRevisionRequestSchema, {
|
|
@@ -6592,6 +6822,7 @@ var CloudBrowser = class {
|
|
|
6592
6822
|
});
|
|
6593
6823
|
if (frameId) req.frameId = frameId;
|
|
6594
6824
|
const resp = await this.client.getDomRevision(req);
|
|
6825
|
+
throwCommandError("getDomRevision", resp.error);
|
|
6595
6826
|
return Number(resp.revision);
|
|
6596
6827
|
}
|
|
6597
6828
|
// ──────────────────────────────────────────────────────────────────
|
|
@@ -6602,7 +6833,9 @@ var CloudBrowser = class {
|
|
|
6602
6833
|
*
|
|
6603
6834
|
* @returns CookieParam[], one per cookie in the context
|
|
6604
6835
|
*
|
|
6605
|
-
*
|
|
6836
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6837
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6838
|
+
* are no error codes to branch on.
|
|
6606
6839
|
*
|
|
6607
6840
|
* @example
|
|
6608
6841
|
* const cookies = await browser.getCookies();
|
|
@@ -6615,6 +6848,7 @@ var CloudBrowser = class {
|
|
|
6615
6848
|
apiKey: this.apiKey
|
|
6616
6849
|
})
|
|
6617
6850
|
);
|
|
6851
|
+
throwCommandError("getCookies", resp.error);
|
|
6618
6852
|
return resp.cookies.map(cookieParamFromProto);
|
|
6619
6853
|
}
|
|
6620
6854
|
/**
|
|
@@ -6625,7 +6859,9 @@ var CloudBrowser = class {
|
|
|
6625
6859
|
*
|
|
6626
6860
|
* @param cookies - cookies to write; empty array is a no-op
|
|
6627
6861
|
*
|
|
6628
|
-
*
|
|
6862
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6863
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6864
|
+
* are no error codes to branch on.
|
|
6629
6865
|
*
|
|
6630
6866
|
* @example
|
|
6631
6867
|
* await browser.setCookies([
|
|
@@ -6633,29 +6869,33 @@ var CloudBrowser = class {
|
|
|
6633
6869
|
* ]);
|
|
6634
6870
|
*/
|
|
6635
6871
|
async setCookies(cookies) {
|
|
6636
|
-
await this.client.setCookies(
|
|
6872
|
+
const res = await this.client.setCookies(
|
|
6637
6873
|
create(SetCookiesRequestSchema, {
|
|
6638
6874
|
sessionId: this.sessionId,
|
|
6639
6875
|
apiKey: this.apiKey,
|
|
6640
6876
|
cookies: cookieParamsToProto(cookies)
|
|
6641
6877
|
})
|
|
6642
6878
|
);
|
|
6879
|
+
throwCommandError("setCookies", res.error);
|
|
6643
6880
|
}
|
|
6644
6881
|
/**
|
|
6645
6882
|
* Deletes every cookie in the browser context.
|
|
6646
6883
|
*
|
|
6647
|
-
*
|
|
6884
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6885
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6886
|
+
* are no error codes to branch on.
|
|
6648
6887
|
*
|
|
6649
6888
|
* @example
|
|
6650
6889
|
* await browser.clearCookies();
|
|
6651
6890
|
*/
|
|
6652
6891
|
async clearCookies() {
|
|
6653
|
-
await this.client.clearCookies(
|
|
6892
|
+
const res = await this.client.clearCookies(
|
|
6654
6893
|
create(ClearCookiesRequestSchema, {
|
|
6655
6894
|
sessionId: this.sessionId,
|
|
6656
6895
|
apiKey: this.apiKey
|
|
6657
6896
|
})
|
|
6658
6897
|
);
|
|
6898
|
+
throwCommandError("clearCookies", res.error);
|
|
6659
6899
|
}
|
|
6660
6900
|
// ──────────────────────────────────────────────────────────────────
|
|
6661
6901
|
// Storage (localStorage)
|
|
@@ -6673,7 +6913,9 @@ var CloudBrowser = class {
|
|
|
6673
6913
|
*
|
|
6674
6914
|
* @returns StorageOriginEntry[], one per origin with localStorage data
|
|
6675
6915
|
*
|
|
6676
|
-
*
|
|
6916
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6917
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6918
|
+
* are no error codes to branch on.
|
|
6677
6919
|
*
|
|
6678
6920
|
* @example
|
|
6679
6921
|
* const storage = await browser.getStorage();
|
|
@@ -6688,6 +6930,7 @@ var CloudBrowser = class {
|
|
|
6688
6930
|
});
|
|
6689
6931
|
if (origin) req.origin = origin;
|
|
6690
6932
|
const resp = await this.client.getStorage(req);
|
|
6933
|
+
throwCommandError("getStorage", resp.error);
|
|
6691
6934
|
return resp.storage.map(storageEntryFromProto);
|
|
6692
6935
|
}
|
|
6693
6936
|
/**
|
|
@@ -6701,7 +6944,9 @@ var CloudBrowser = class {
|
|
|
6701
6944
|
*
|
|
6702
6945
|
* @param storage - entries to write, grouped by origin
|
|
6703
6946
|
*
|
|
6704
|
-
*
|
|
6947
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6948
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6949
|
+
* are no error codes to branch on.
|
|
6705
6950
|
*
|
|
6706
6951
|
* @example
|
|
6707
6952
|
* await browser.setStorage([
|
|
@@ -6715,13 +6960,14 @@ var CloudBrowser = class {
|
|
|
6715
6960
|
* ]);
|
|
6716
6961
|
*/
|
|
6717
6962
|
async setStorage(storage) {
|
|
6718
|
-
await this.client.setStorage(
|
|
6963
|
+
const res = await this.client.setStorage(
|
|
6719
6964
|
create(SetStorageRequestSchema, {
|
|
6720
6965
|
sessionId: this.sessionId,
|
|
6721
6966
|
apiKey: this.apiKey,
|
|
6722
6967
|
storage: storageEntriesToProto(storage)
|
|
6723
6968
|
})
|
|
6724
6969
|
);
|
|
6970
|
+
throwCommandError("setStorage", res.error);
|
|
6725
6971
|
}
|
|
6726
6972
|
/**
|
|
6727
6973
|
* Deletes localStorage in the browser context.
|
|
@@ -6729,7 +6975,9 @@ var CloudBrowser = class {
|
|
|
6729
6975
|
* @param origin - if set, only this origin's storage is deleted
|
|
6730
6976
|
* (e.g. "https://example.com"); omit to delete all origins
|
|
6731
6977
|
*
|
|
6732
|
-
*
|
|
6978
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
6979
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
6980
|
+
* are no error codes to branch on.
|
|
6733
6981
|
*
|
|
6734
6982
|
* @example
|
|
6735
6983
|
* // Wipe one origin.
|
|
@@ -6744,7 +6992,8 @@ var CloudBrowser = class {
|
|
|
6744
6992
|
apiKey: this.apiKey
|
|
6745
6993
|
});
|
|
6746
6994
|
if (origin) req.origin = origin;
|
|
6747
|
-
await this.client.clearStorage(req);
|
|
6995
|
+
const res = await this.client.clearStorage(req);
|
|
6996
|
+
throwCommandError("clearStorage", res.error);
|
|
6748
6997
|
}
|
|
6749
6998
|
// ──────────────────────────────────────────────────────────────────
|
|
6750
6999
|
// Auth / DBSC (portable signed-in persona)
|
|
@@ -6759,7 +7008,9 @@ var CloudBrowser = class {
|
|
|
6759
7008
|
*
|
|
6760
7009
|
* @returns AuthSession, or undefined when there is nothing to export
|
|
6761
7010
|
*
|
|
6762
|
-
*
|
|
7011
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
7012
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
7013
|
+
* are no error codes to branch on.
|
|
6763
7014
|
*
|
|
6764
7015
|
* @example
|
|
6765
7016
|
* const auth = await browser.getAuthSession();
|
|
@@ -6772,6 +7023,7 @@ var CloudBrowser = class {
|
|
|
6772
7023
|
apiKey: this.apiKey
|
|
6773
7024
|
})
|
|
6774
7025
|
);
|
|
7026
|
+
throwCommandError("getAuthSession", resp.error);
|
|
6775
7027
|
return resp.session ? authSessionFromProto(resp.session) : void 0;
|
|
6776
7028
|
}
|
|
6777
7029
|
/**
|
|
@@ -6783,20 +7035,23 @@ var CloudBrowser = class {
|
|
|
6783
7035
|
*
|
|
6784
7036
|
* @param session - session as returned by getAuthSession()
|
|
6785
7037
|
*
|
|
6786
|
-
*
|
|
7038
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
7039
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
7040
|
+
* are no error codes to branch on.
|
|
6787
7041
|
*
|
|
6788
7042
|
* @example
|
|
6789
7043
|
* await browser.setAuthSession(saved);
|
|
6790
7044
|
* await browser.navigate("https://mail.google.com");
|
|
6791
7045
|
*/
|
|
6792
7046
|
async setAuthSession(session) {
|
|
6793
|
-
await this.client.setAuthSession(
|
|
7047
|
+
const res = await this.client.setAuthSession(
|
|
6794
7048
|
create(SetAuthSessionRequestSchema, {
|
|
6795
7049
|
sessionId: this.sessionId,
|
|
6796
7050
|
apiKey: this.apiKey,
|
|
6797
7051
|
session: authSessionToProto(session)
|
|
6798
7052
|
})
|
|
6799
7053
|
);
|
|
7054
|
+
throwCommandError("setAuthSession", res.error);
|
|
6800
7055
|
}
|
|
6801
7056
|
// ──────────────────────────────────────────────────────────────────
|
|
6802
7057
|
// Devtools / live-UI helpers
|
|
@@ -6816,7 +7071,9 @@ var CloudBrowser = class {
|
|
|
6816
7071
|
* @returns InspectResult with the resolved backendNodeId, frameId, tag
|
|
6817
7072
|
* name, trimmed textContent, visibility and bounds
|
|
6818
7073
|
*
|
|
6819
|
-
*
|
|
7074
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
7075
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
7076
|
+
* are no error codes to branch on.
|
|
6820
7077
|
*
|
|
6821
7078
|
* @example
|
|
6822
7079
|
* const r = await browser.inspectAtPosition(200, 300);
|
|
@@ -6831,6 +7088,7 @@ var CloudBrowser = class {
|
|
|
6831
7088
|
y
|
|
6832
7089
|
})
|
|
6833
7090
|
);
|
|
7091
|
+
throwCommandError("inspectAtPosition", resp.error);
|
|
6834
7092
|
return {
|
|
6835
7093
|
backendNodeId: resp.backendNodeId,
|
|
6836
7094
|
frameId: resp.frameId,
|
|
@@ -6850,7 +7108,9 @@ var CloudBrowser = class {
|
|
|
6850
7108
|
* @param frameId - id of the frame the node lives in; empty string
|
|
6851
7109
|
* targets the main frame
|
|
6852
7110
|
*
|
|
6853
|
-
*
|
|
7111
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
7112
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
7113
|
+
* are no error codes to branch on.
|
|
6854
7114
|
*
|
|
6855
7115
|
* @example
|
|
6856
7116
|
* await browser.highlightNode(res.backendNodeId, res.frameId);
|
|
@@ -6862,7 +7122,8 @@ var CloudBrowser = class {
|
|
|
6862
7122
|
backendNodeId
|
|
6863
7123
|
});
|
|
6864
7124
|
if (frameId) req.frameId = frameId;
|
|
6865
|
-
await this.client.highlightNode(req);
|
|
7125
|
+
const res = await this.client.highlightNode(req);
|
|
7126
|
+
throwCommandError("highlight", res.error);
|
|
6866
7127
|
}
|
|
6867
7128
|
/**
|
|
6868
7129
|
* Pastes text at the current caret using IME-style input.
|
|
@@ -6874,19 +7135,24 @@ var CloudBrowser = class {
|
|
|
6874
7135
|
*
|
|
6875
7136
|
* @param text - the text to insert at the caret
|
|
6876
7137
|
*
|
|
6877
|
-
* @throws
|
|
7138
|
+
* @throws no_focus - nothing in the page holds focus, so there is no caret to
|
|
7139
|
+
* insert at; click the field first
|
|
7140
|
+
* @throws busy - another action is already running on this page
|
|
7141
|
+
*
|
|
7142
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6878
7143
|
*
|
|
6879
7144
|
* @example
|
|
6880
7145
|
* await browser.insertText("hello world");
|
|
6881
7146
|
*/
|
|
6882
7147
|
async insertText(text) {
|
|
6883
|
-
await this.client.insertText(
|
|
7148
|
+
const res = await this.client.insertText(
|
|
6884
7149
|
create(InsertTextRequestSchema, {
|
|
6885
7150
|
sessionId: this.sessionId,
|
|
6886
7151
|
apiKey: this.apiKey,
|
|
6887
7152
|
text
|
|
6888
7153
|
})
|
|
6889
7154
|
);
|
|
7155
|
+
throwCommandError("insertText", res.error);
|
|
6890
7156
|
}
|
|
6891
7157
|
/**
|
|
6892
7158
|
* Types `text` into the currently focused element as a per-key stream of real
|
|
@@ -6908,7 +7174,10 @@ var CloudBrowser = class {
|
|
|
6908
7174
|
* @param opts - optional: `clearFirst` clears the focused field (Ctrl+A,
|
|
6909
7175
|
* Delete) before typing
|
|
6910
7176
|
*
|
|
6911
|
-
*
|
|
7177
|
+
* `type` has no semantic failure of its own: the keys land wherever focus
|
|
7178
|
+
* happens to be, so there is no target it can miss. Only the page or context
|
|
7179
|
+
* being torn down mid-stream surfaces, and that is a transport failure rather
|
|
7180
|
+
* than a code.
|
|
6912
7181
|
*
|
|
6913
7182
|
* @example
|
|
6914
7183
|
* // OTP field that auto-advances across boxes.
|
|
@@ -6922,7 +7191,7 @@ var CloudBrowser = class {
|
|
|
6922
7191
|
text
|
|
6923
7192
|
});
|
|
6924
7193
|
if (opts?.clearFirst) req.clearFirst = true;
|
|
6925
|
-
await this.client.type(req);
|
|
7194
|
+
throwCommandError("type", (await this.client.type(req)).error);
|
|
6926
7195
|
}
|
|
6927
7196
|
/**
|
|
6928
7197
|
* Fires a single key-down event.
|
|
@@ -6937,7 +7206,11 @@ var CloudBrowser = class {
|
|
|
6937
7206
|
* `modifiers` (bit-flag: Alt=1, Ctrl=2, Meta=4, Shift=8),
|
|
6938
7207
|
* `location` (0=standard, 1=left, 2=right, 3=numpad)
|
|
6939
7208
|
*
|
|
6940
|
-
* @throws
|
|
7209
|
+
* @throws no_focus - nothing in the page holds focus, so the key has nowhere
|
|
7210
|
+
* to go; click the field first
|
|
7211
|
+
* @throws busy - another action is already running on this page
|
|
7212
|
+
*
|
|
7213
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
6941
7214
|
*
|
|
6942
7215
|
* @example
|
|
6943
7216
|
* // Ctrl+A
|
|
@@ -6953,7 +7226,8 @@ var CloudBrowser = class {
|
|
|
6953
7226
|
if (opts?.code) req.code = opts.code;
|
|
6954
7227
|
if (opts?.modifiers !== void 0) req.modifiers = opts.modifiers;
|
|
6955
7228
|
if (opts?.location !== void 0) req.location = opts.location;
|
|
6956
|
-
await this.client.pressKey(req);
|
|
7229
|
+
const res = await this.client.pressKey(req);
|
|
7230
|
+
throwCommandError("pressKey", res.error);
|
|
6957
7231
|
}
|
|
6958
7232
|
/**
|
|
6959
7233
|
* Fires a single key-up event.
|
|
@@ -6976,7 +7250,8 @@ var CloudBrowser = class {
|
|
|
6976
7250
|
if (opts?.code) req.code = opts.code;
|
|
6977
7251
|
if (opts?.modifiers !== void 0) req.modifiers = opts.modifiers;
|
|
6978
7252
|
if (opts?.location !== void 0) req.location = opts.location;
|
|
6979
|
-
await this.client.releaseKey(req);
|
|
7253
|
+
const res = await this.client.releaseKey(req);
|
|
7254
|
+
throwCommandError("releaseKey", res.error);
|
|
6980
7255
|
}
|
|
6981
7256
|
/**
|
|
6982
7257
|
* Returns the current text selection.
|
|
@@ -6987,7 +7262,9 @@ var CloudBrowser = class {
|
|
|
6987
7262
|
*
|
|
6988
7263
|
* @returns the selected text, or `""` when nothing is selected
|
|
6989
7264
|
*
|
|
6990
|
-
*
|
|
7265
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
7266
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
7267
|
+
* are no error codes to branch on.
|
|
6991
7268
|
*
|
|
6992
7269
|
* @example
|
|
6993
7270
|
* const sel = await browser.getSelection();
|
|
@@ -7000,32 +7277,35 @@ var CloudBrowser = class {
|
|
|
7000
7277
|
apiKey: this.apiKey
|
|
7001
7278
|
})
|
|
7002
7279
|
);
|
|
7280
|
+
throwCommandError("getSelection", resp.error);
|
|
7003
7281
|
return resp.text;
|
|
7004
7282
|
}
|
|
7005
7283
|
// ──────────────────────────────────────────────────────────────────
|
|
7006
7284
|
// Captcha solver
|
|
7007
7285
|
// ──────────────────────────────────────────────────────────────────
|
|
7008
7286
|
/**
|
|
7009
|
-
|
|
7010
|
-
|
|
7011
|
-
|
|
7012
|
-
|
|
7013
|
-
|
|
7014
|
-
|
|
7015
|
-
|
|
7016
|
-
|
|
7017
|
-
|
|
7018
|
-
|
|
7019
|
-
|
|
7020
|
-
|
|
7021
|
-
|
|
7022
|
-
|
|
7023
|
-
|
|
7024
|
-
|
|
7025
|
-
|
|
7026
|
-
|
|
7027
|
-
|
|
7028
|
-
|
|
7287
|
+
* Detects and solves the first supported bot-challenge it finds
|
|
7288
|
+
* anywhere on the page.
|
|
7289
|
+
*
|
|
7290
|
+
* Detection covers the common challenge types you run into in the
|
|
7291
|
+
* wild. The challenge is completed in-page server-side (the resulting
|
|
7292
|
+
* token / bypass cookies are wired into the page automatically), so
|
|
7293
|
+
* callers can ignore the returned string.
|
|
7294
|
+
*
|
|
7295
|
+
* @param opts - optional `timeoutMs` (how long to wait for a captcha to
|
|
7296
|
+
* appear; omit for server default 60s) and `retryAmount` (failures
|
|
7297
|
+
* tolerated before giving up)
|
|
7298
|
+
*
|
|
7299
|
+
* @returns empty string on success — the solution is applied server-side
|
|
7300
|
+
*
|
|
7301
|
+
* Rejects when no captcha appeared within imeoutMs, or when the one that did
|
|
7302
|
+
* could not be solved within
|
|
7303
|
+
etryAmount attempts. Neither carries a code:
|
|
7304
|
+
* solving runs outside the page, so there is no per-command code set here.
|
|
7305
|
+
*
|
|
7306
|
+
* @example
|
|
7307
|
+
* await browser.solveCaptcha({ retryAmount: 2 });
|
|
7308
|
+
*/
|
|
7029
7309
|
async solveCaptcha(opts) {
|
|
7030
7310
|
const resp = await this.client.solveCaptcha(
|
|
7031
7311
|
create(SolveCaptchaRequestSchema, {
|
|
@@ -7051,7 +7331,8 @@ var CloudBrowser = class {
|
|
|
7051
7331
|
*
|
|
7052
7332
|
* @returns the ICE servers for the client `RTCPeerConnection`
|
|
7053
7333
|
*
|
|
7054
|
-
*
|
|
7334
|
+
* Rejects when TURN is not configured on the server. That is a deployment
|
|
7335
|
+
* condition rather than a per-call outcome, so it carries no code.
|
|
7055
7336
|
*
|
|
7056
7337
|
* @example
|
|
7057
7338
|
* const ice = await browser.getStreamConfig();
|
|
@@ -7080,8 +7361,16 @@ var CloudBrowser = class {
|
|
|
7080
7361
|
* @returns the SDP answer to apply as the remote description, plus the
|
|
7081
7362
|
* viewport to map input coordinates into
|
|
7082
7363
|
*
|
|
7083
|
-
* @throws
|
|
7084
|
-
*
|
|
7364
|
+
* @throws already_active - a stream is already running on this session; stop it
|
|
7365
|
+
* before starting another
|
|
7366
|
+
* @throws negotiation_failed - the browser could not agree on a connection. The
|
|
7367
|
+
* message carries the negotiator's own diagnostic, which is usually where the
|
|
7368
|
+
* actual cause is
|
|
7369
|
+
*
|
|
7370
|
+
* An empty offer or an unconfigured TURN setup is a caller mistake rather than
|
|
7371
|
+
* an outcome, and rejects separately.
|
|
7372
|
+
*
|
|
7373
|
+
* @see {@link CommandError} for reading the code off the rejection
|
|
7085
7374
|
*
|
|
7086
7375
|
* @example
|
|
7087
7376
|
* const { answerSdp, viewport } = await browser.startStream(offer.sdp);
|
|
@@ -7095,6 +7384,7 @@ var CloudBrowser = class {
|
|
|
7095
7384
|
offerSdp
|
|
7096
7385
|
})
|
|
7097
7386
|
);
|
|
7387
|
+
throwCommandError("startStream", resp.error);
|
|
7098
7388
|
return {
|
|
7099
7389
|
answerSdp: resp.answerSdp,
|
|
7100
7390
|
viewport: resp.viewport ? { width: resp.viewport.width, height: resp.viewport.height } : null
|
|
@@ -7104,27 +7394,29 @@ var CloudBrowser = class {
|
|
|
7104
7394
|
* Tears down the live video stream for the session's page. Safe to call even
|
|
7105
7395
|
* if no stream is running.
|
|
7106
7396
|
*
|
|
7107
|
-
*
|
|
7397
|
+
* Rejects only on a transport failure. Stopping a stream that is not running is
|
|
7398
|
+
* a no-op rather than a failure, so there are no error codes to branch on.
|
|
7108
7399
|
*
|
|
7109
7400
|
* @example
|
|
7110
7401
|
* await browser.stopStream();
|
|
7111
7402
|
*/
|
|
7112
7403
|
async stopStream() {
|
|
7113
|
-
await this.client.stopStream(
|
|
7404
|
+
const res = await this.client.stopStream(
|
|
7114
7405
|
create(StopStreamRequestSchema, {
|
|
7115
7406
|
sessionId: this.sessionId,
|
|
7116
7407
|
apiKey: this.apiKey
|
|
7117
7408
|
})
|
|
7118
7409
|
);
|
|
7410
|
+
throwCommandError("stopStream", res.error);
|
|
7119
7411
|
}
|
|
7120
7412
|
// ──────────────────────────────────────────────────────────────────
|
|
7121
7413
|
// Reactions
|
|
7122
7414
|
// ──────────────────────────────────────────────────────────────────
|
|
7123
7415
|
/**
|
|
7124
|
-
* Registers a one-shot "reaction":
|
|
7125
|
-
*
|
|
7126
|
-
*
|
|
7127
|
-
*
|
|
7416
|
+
* Registers a one-shot "reaction": the browser watches for the `match`
|
|
7417
|
+
* locator in the background and, as soon as it matches, clicks it the same
|
|
7418
|
+
* way {@link CloudBrowser.click} does (scroll, human path, occlusion check) —
|
|
7419
|
+
* then removes itself. The reaction yields to any in-flight input
|
|
7128
7420
|
* action and only fires while the pointer is idle, so a reaction naturally
|
|
7129
7421
|
* slots into the gaps of a retrying foreground action (e.g. it dismisses a
|
|
7130
7422
|
* newsletter modal blocking a {@link CloudBrowser.click}, after which the
|
|
@@ -7173,6 +7465,7 @@ var CloudBrowser = class {
|
|
|
7173
7465
|
if (opts?.clickCount) req.clickCount = opts.clickCount;
|
|
7174
7466
|
if (opts?.intervalMs) req.interval = opts.intervalMs;
|
|
7175
7467
|
const resp = await this.client.addReaction(req);
|
|
7468
|
+
throwCommandError("addReaction", resp.error);
|
|
7176
7469
|
return resp.reactionId;
|
|
7177
7470
|
}
|
|
7178
7471
|
/**
|
|
@@ -7183,6 +7476,10 @@ var CloudBrowser = class {
|
|
|
7183
7476
|
*
|
|
7184
7477
|
* @returns true if a pending reaction with this id existed and was removed
|
|
7185
7478
|
*
|
|
7479
|
+
* Removing an id that is not registered is a no-op rather than an error, so the
|
|
7480
|
+
* returned boolean - not a rejection - is what tells you whether anything was
|
|
7481
|
+
* there. Rejects only on a transport failure.
|
|
7482
|
+
*
|
|
7186
7483
|
* @example
|
|
7187
7484
|
* const removed = await browser.removeReaction(id);
|
|
7188
7485
|
*/
|
|
@@ -7194,6 +7491,7 @@ var CloudBrowser = class {
|
|
|
7194
7491
|
reactionId
|
|
7195
7492
|
})
|
|
7196
7493
|
);
|
|
7494
|
+
throwCommandError("removeReaction", resp.error);
|
|
7197
7495
|
return resp.removed;
|
|
7198
7496
|
}
|
|
7199
7497
|
/**
|
|
@@ -7202,6 +7500,10 @@ var CloudBrowser = class {
|
|
|
7202
7500
|
*
|
|
7203
7501
|
* @returns the pending reactions for the page
|
|
7204
7502
|
*
|
|
7503
|
+
* Rejects only on a transport failure - a dead session, a page that is gone,
|
|
7504
|
+
* a broken connection. This call has no semantic failure of its own, so there
|
|
7505
|
+
* are no error codes to branch on.
|
|
7506
|
+
*
|
|
7205
7507
|
* @example
|
|
7206
7508
|
* const pending = await browser.listReactions();
|
|
7207
7509
|
* for (const r of pending) console.log(r.reactionId, r.matchSelector);
|
|
@@ -7213,6 +7515,7 @@ var CloudBrowser = class {
|
|
|
7213
7515
|
apiKey: this.apiKey
|
|
7214
7516
|
})
|
|
7215
7517
|
);
|
|
7518
|
+
throwCommandError("listReactions", resp.error);
|
|
7216
7519
|
return resp.reactions.map((r) => ({
|
|
7217
7520
|
reactionId: r.reactionId,
|
|
7218
7521
|
matchSelector: r.matchSelector ?? "",
|
|
@@ -7227,41 +7530,44 @@ var CloudBrowser = class {
|
|
|
7227
7530
|
// Scripts
|
|
7228
7531
|
// ──────────────────────────────────────────────────────────────────
|
|
7229
7532
|
/**
|
|
7230
|
-
|
|
7231
|
-
|
|
7232
|
-
|
|
7233
|
-
|
|
7234
|
-
|
|
7235
|
-
|
|
7236
|
-
|
|
7237
|
-
|
|
7238
|
-
|
|
7239
|
-
|
|
7240
|
-
|
|
7241
|
-
|
|
7242
|
-
|
|
7243
|
-
|
|
7244
|
-
|
|
7245
|
-
|
|
7246
|
-
|
|
7247
|
-
|
|
7248
|
-
|
|
7249
|
-
|
|
7250
|
-
|
|
7251
|
-
|
|
7252
|
-
|
|
7253
|
-
|
|
7254
|
-
|
|
7255
|
-
|
|
7256
|
-
|
|
7257
|
-
|
|
7258
|
-
|
|
7259
|
-
|
|
7260
|
-
|
|
7261
|
-
|
|
7262
|
-
|
|
7263
|
-
|
|
7264
|
-
|
|
7533
|
+
* Runs `source` in the session's browser and waits for it to finish.
|
|
7534
|
+
*
|
|
7535
|
+
* The script runs beside the browser, in a V8 isolate of its own rather than
|
|
7536
|
+
* in the page, and reaches the document through the engine: a cross-origin
|
|
7537
|
+
* `<iframe>` is read as plain `contentDocument` with no frame ids anywhere,
|
|
7538
|
+
* values come back as live objects it can assign to rather than snapshots, an
|
|
7539
|
+
* element can be handed straight to `browser.click`, and the page sees nothing
|
|
7540
|
+
* injected. Steps cost microseconds rather than network round trips, so work
|
|
7541
|
+
* that is chatty by nature — polling for a selector, walking a list,
|
|
7542
|
+
* following pagination — is affordable there. A guide for it is still to come.
|
|
7543
|
+
*
|
|
7544
|
+
* This waits for as long as the script runs, and cannot be bounded: the run
|
|
7545
|
+
* id needed to cancel only arrives with the reply. Use
|
|
7546
|
+
* {@link CloudBrowser.startScript} when the script may outlive the caller's
|
|
7547
|
+
* patience, or {@link CloudBrowser.stopScripts} to abandon what this session
|
|
7548
|
+
* is running.
|
|
7549
|
+
*
|
|
7550
|
+
* @param source - JavaScript to execute; its return value comes back as JSON
|
|
7551
|
+
*
|
|
7552
|
+
* @returns the return value and the script's whole console output. A script
|
|
7553
|
+
* that threw is reported as `success: false`, not as a rejection
|
|
7554
|
+
*
|
|
7555
|
+
* Rejects only on a transport failure. A script that fails to compile or throws
|
|
7556
|
+
* is not a rejection: the returned result has success: false and
|
|
7557
|
+
esult holds
|
|
7558
|
+
* the message, so a broken script stays distinguishable from a broken connection.
|
|
7559
|
+
*
|
|
7560
|
+
* @example
|
|
7561
|
+
* const result = await browser.runScript(`
|
|
7562
|
+
* await browser.navigate("https://example.com");
|
|
7563
|
+
* const items = [];
|
|
7564
|
+
* for (const el of await browser.getDOM().querySelectorAll("h1")) {
|
|
7565
|
+
* items.push(el.textContent);
|
|
7566
|
+
* }
|
|
7567
|
+
* return items;
|
|
7568
|
+
* `);
|
|
7569
|
+
* console.log(result.success, result.result);
|
|
7570
|
+
*/
|
|
7265
7571
|
async runScript(source) {
|
|
7266
7572
|
const resp = await this.client.runScript(
|
|
7267
7573
|
create(RunScriptRequestSchema, {
|
|
@@ -7299,7 +7605,8 @@ var CloudBrowser = class {
|
|
|
7299
7605
|
*
|
|
7300
7606
|
* @returns ScriptRun handle for awaiting or cancelling the run
|
|
7301
7607
|
*
|
|
7302
|
-
*
|
|
7608
|
+
* Rejects only on a transport failure: a script that fails to compile or throws
|
|
7609
|
+
* surfaces on the run itself rather than here.
|
|
7303
7610
|
*
|
|
7304
7611
|
* @example
|
|
7305
7612
|
* const run = await browser.startScript(source, (ev) => {
|
|
@@ -7378,7 +7685,8 @@ var CloudBrowser = class {
|
|
|
7378
7685
|
*
|
|
7379
7686
|
* @returns ScriptFollow handle for stopping the subscription
|
|
7380
7687
|
*
|
|
7381
|
-
*
|
|
7688
|
+
* Rejects only on a transport failure: opening the subscription has no semantic
|
|
7689
|
+
* failure of its own.
|
|
7382
7690
|
*
|
|
7383
7691
|
* @example
|
|
7384
7692
|
* const follow = await browser.followScript(runId, (ev) => {
|
|
@@ -7414,7 +7722,9 @@ var CloudBrowser = class {
|
|
|
7414
7722
|
* @returns how many runs were cancelled; 0 when the id named nothing in
|
|
7415
7723
|
* flight
|
|
7416
7724
|
*
|
|
7417
|
-
*
|
|
7725
|
+
* Rejects only on a transport failure. Cancelling runs that have already
|
|
7726
|
+
* finished, or none at all, is a no-op - read the returned count to learn how
|
|
7727
|
+
* many were actually stopped.
|
|
7418
7728
|
*
|
|
7419
7729
|
* @example
|
|
7420
7730
|
* await browser.stopScripts(""); // abandon everything running
|
|
@@ -7439,7 +7749,9 @@ var CloudBrowser = class {
|
|
|
7439
7749
|
*
|
|
7440
7750
|
* @returns one entry per run still executing
|
|
7441
7751
|
*
|
|
7442
|
-
*
|
|
7752
|
+
* Rejects only on a transport failure - a dead session, a broken connection.
|
|
7753
|
+
* This call has no semantic failure of its own, so there are no error codes to
|
|
7754
|
+
* branch on.
|
|
7443
7755
|
*
|
|
7444
7756
|
* @example
|
|
7445
7757
|
* for (const run of await browser.listScriptRuns()) {
|
|
@@ -7775,6 +8087,11 @@ var BrowserConfig = class {
|
|
|
7775
8087
|
}
|
|
7776
8088
|
};
|
|
7777
8089
|
|
|
8090
|
+
// src/defaults.ts
|
|
8091
|
+
var DefaultWaitTimeoutMs = 3e4;
|
|
8092
|
+
var DefaultVisible = true;
|
|
8093
|
+
var DefaultSteadyMs = 500;
|
|
8094
|
+
|
|
7778
8095
|
// src/browser.ts
|
|
7779
8096
|
function createWebSocketBrowser(wsUrl, sessionId, apiKey, fingerprint = "") {
|
|
7780
8097
|
const transport = new WebSocketTransport(wsUrl);
|