@yorkie-js/react 0.7.12-rc → 0.7.13

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.
@@ -5790,7 +5790,7 @@ function createGrpcWebTransport(options) {
5790
5790
  }
5791
5791
  };
5792
5792
  }
5793
- const file_yorkie_v1_resources = /* @__PURE__ */ fileDesc("Chl5b3JraWUvdjEvcmVzb3VyY2VzLnByb3RvEgl5b3JraWUudjEirgEKCFNuYXBzaG90EiQKBHJvb3QYASABKAsyFi55b3JraWUudjEuSlNPTkVsZW1lbnQSNQoJcHJlc2VuY2VzGAIgAygLMiIueW9ya2llLnYxLlNuYXBzaG90LlByZXNlbmNlc0VudHJ5GkUKDlByZXNlbmNlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5QcmVzZW5jZToCOAEi+wEKCkNoYW5nZVBhY2sSFAoMZG9jdW1lbnRfa2V5GAEgASgJEikKCmNoZWNrcG9pbnQYAiABKAsyFS55b3JraWUudjEuQ2hlY2twb2ludBIQCghzbmFwc2hvdBgDIAEoDBIiCgdjaGFuZ2VzGAQgAygLMhEueW9ya2llLnYxLkNoYW5nZRIwChFtaW5fc3luY2VkX3RpY2tldBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYBiABKAgSMAoOdmVyc2lvbl92ZWN0b3IYByABKAsyGC55b3JraWUudjEuVmVyc2lvblZlY3RvciKYAQoGQ2hhbmdlEh8KAmlkGAEgASgLMhMueW9ya2llLnYxLkNoYW5nZUlEEg8KB21lc3NhZ2UYAiABKAkSKAoKb3BlcmF0aW9ucxgDIAMoCzIULnlvcmtpZS52MS5PcGVyYXRpb24SMgoPcHJlc2VuY2VfY2hhbmdlGAQgASgLMhkueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlIocBCghDaGFuZ2VJRBISCgpjbGllbnRfc2VxGAEgASgNEhIKCnNlcnZlcl9zZXEYAiABKAMSDwoHbGFtcG9ydBgDIAEoAxIQCghhY3Rvcl9pZBgEIAEoDBIwCg52ZXJzaW9uX3ZlY3RvchgFIAEoCzIYLnlvcmtpZS52MS5WZXJzaW9uVmVjdG9yInQKDVZlcnNpb25WZWN0b3ISNAoGdmVjdG9yGAEgAygLMiQueW9ya2llLnYxLlZlcnNpb25WZWN0b3IuVmVjdG9yRW50cnkaLQoLVmVjdG9yRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgDOgI4ASLZGgoJT3BlcmF0aW9uEicKA3NldBgBIAEoCzIYLnlvcmtpZS52MS5PcGVyYXRpb24uU2V0SAASJwoDYWRkGAIgASgLMhgueW9ya2llLnYxLk9wZXJhdGlvbi5BZGRIABIpCgRtb3ZlGAMgASgLMhkueW9ya2llLnYxLk9wZXJhdGlvbi5Nb3ZlSAASLQoGcmVtb3ZlGAQgASgLMhsueW9ya2llLnYxLk9wZXJhdGlvbi5SZW1vdmVIABIpCgRlZGl0GAUgASgLMhkueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0SAASKwoFc3R5bGUYByABKAsyGi55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlSAASMQoIaW5jcmVhc2UYCCABKAsyHS55b3JraWUudjEuT3BlcmF0aW9uLkluY3JlYXNlSAASMgoJdHJlZV9lZGl0GAkgASgLMh0ueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlRWRpdEgAEjQKCnRyZWVfc3R5bGUYCiABKAsyHi55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVTdHlsZUgAEjIKCWFycmF5X3NldBgLIAEoCzIdLnlvcmtpZS52MS5PcGVyYXRpb24uQXJyYXlTZXRIABqdAQoDU2V0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSCwoDa2V5GAIgASgJEisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQawAEKA0FkZBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Ei4KD3ByZXZfY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQavwEKBE1vdmUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIuCg9wcmV2X2NyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqRAQoGUmVtb3ZlEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2V4ZWN1dGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQa2QMKBEVkaXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIkCgRmcm9tGAIgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEiIKAnRvGAMgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zElMKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAQgAygLMjIueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0LkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRIPCgdjb250ZW50GAUgASgJEioKC2V4ZWN1dGVkX2F0GAYgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSPQoKYXR0cmlidXRlcxgHIAMoCzIpLnlvcmtpZS52MS5PcGVyYXRpb24uRWRpdC5BdHRyaWJ1dGVzRW50cnkaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARrpAwoFU3R5bGUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIkCgRmcm9tGAIgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEiIKAnRvGAMgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEj4KCmF0dHJpYnV0ZXMYBCADKAsyKi55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlLkF0dHJpYnV0ZXNFbnRyeRIqCgtleGVjdXRlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0ElQKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAYgAygLMjMueW9ya2llLnYxLk9wZXJhdGlvbi5TdHlsZS5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSHAoUYXR0cmlidXRlc190b19yZW1vdmUYByADKAkaMQoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARqkAQoISW5jcmVhc2USMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIrCgV2YWx1ZRgCIAEoCzIcLnlvcmtpZS52MS5KU09ORWxlbWVudFNpbXBsZRIqCgtleGVjdXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg0KBWFjdG9yGAQgASgJGpMDCghUcmVlRWRpdBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiAKBGZyb20YAiABKAsyEi55b3JraWUudjEuVHJlZVBvcxIeCgJ0bxgDIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zElcKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAQgAygLMjYueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlRWRpdC5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSJgoIY29udGVudHMYBSADKAsyFC55b3JraWUudjEuVHJlZU5vZGVzEhMKC3NwbGl0X2xldmVsGAcgASgFEioKC2V4ZWN1dGVkX2F0GAYgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARrtAwoJVHJlZVN0eWxlEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIAoEZnJvbRgCIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zEh4KAnRvGAMgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSQgoKYXR0cmlidXRlcxgEIAMoCzIuLnlvcmtpZS52MS5PcGVyYXRpb24uVHJlZVN0eWxlLkF0dHJpYnV0ZXNFbnRyeRIqCgtleGVjdXRlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhwKFGF0dHJpYnV0ZXNfdG9fcmVtb3ZlGAYgAygJElgKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAcgAygLMjcueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlU3R5bGUuQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5GjEKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGlEKGENyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRILCgNrZXkYASABKAkSJAoFdmFsdWUYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldDoCOAEawAEKCEFycmF5U2V0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXRCBgoEYm9keSLFAQoRSlNPTkVsZW1lbnRTaW1wbGUSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiIKBHR5cGUYBCABKA4yFC55b3JraWUudjEuVmFsdWVUeXBlEg0KBXZhbHVlGAUgASgMIp8LCgtKU09ORWxlbWVudBI4Cgtqc29uX29iamVjdBgBIAEoCzIhLnlvcmtpZS52MS5KU09ORWxlbWVudC5KU09OT2JqZWN0SAASNgoKanNvbl9hcnJheRgCIAEoCzIgLnlvcmtpZS52MS5KU09ORWxlbWVudC5KU09OQXJyYXlIABI1CglwcmltaXRpdmUYAyABKAsyIC55b3JraWUudjEuSlNPTkVsZW1lbnQuUHJpbWl0aXZlSAASKwoEdGV4dBgFIAEoCzIbLnlvcmtpZS52MS5KU09ORWxlbWVudC5UZXh0SAASMQoHY291bnRlchgGIAEoCzIeLnlvcmtpZS52MS5KU09ORWxlbWVudC5Db3VudGVySAASKwoEdHJlZRgHIAEoCzIbLnlvcmtpZS52MS5KU09ORWxlbWVudC5UcmVlSAAargEKCkpTT05PYmplY3QSIQoFbm9kZXMYASADKAsyEi55b3JraWUudjEuUkhUTm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQarQEKCUpTT05BcnJheRIhCgVub2RlcxgBIAMoCzISLnlvcmtpZS52MS5SR0FOb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBq9AQoJUHJpbWl0aXZlEiIKBHR5cGUYASABKA4yFC55b3JraWUudjEuVmFsdWVUeXBlEg0KBXZhbHVlGAIgASgMEikKCmNyZWF0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBSABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqpAQoEVGV4dBIiCgVub2RlcxgBIAMoCzITLnlvcmtpZS52MS5UZXh0Tm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQa2AEKB0NvdW50ZXISIgoEdHlwZRgBIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYAiABKAwSKQoKY3JlYXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhUKDWhsbF9yZWdpc3RlcnMYByABKAxKBAgGEAcaqQEKBFRyZWUSIgoFbm9kZXMYASADKAsyEy55b3JraWUudjEuVHJlZU5vZGUSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0QgYKBGJvZHkiPwoHUkhUTm9kZRILCgNrZXkYASABKAkSJwoHZWxlbWVudBgCIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudCLuAQoHUkdBTm9kZRIgCgRuZXh0GAEgASgLMhIueW9ya2llLnYxLlJHQU5vZGUSJwoHZWxlbWVudBgCIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudBIyChNwb3NpdGlvbl9jcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSMAoRcG9zaXRpb25fbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIyChNwb3NpdGlvbl9yZW1vdmVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQiWAoITm9kZUF0dHISDQoFdmFsdWUYASABKAkSKQoKdXBkYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYAyABKAgilAIKCFRleHROb2RlEiEKAmlkGAEgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSDQoFdmFsdWUYAiABKAkSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAQgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSNwoKYXR0cmlidXRlcxgFIAMoCzIjLnlvcmtpZS52MS5UZXh0Tm9kZS5BdHRyaWJ1dGVzRW50cnkaRgoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5Ob2RlQXR0cjoCOAEiRwoKVGV4dE5vZGVJRBIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDgoGb2Zmc2V0GAIgASgFIrMDCghUcmVlTm9kZRIhCgJpZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEgwKBHR5cGUYAiABKAkSDQoFdmFsdWUYAyABKAkSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAUgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSKgoLaW5zX25leHRfaWQYBiABKAsyFS55b3JraWUudjEuVHJlZU5vZGVJRBINCgVkZXB0aBgHIAEoBRI3CgphdHRyaWJ1dGVzGAggAygLMiMueW9ya2llLnYxLlRyZWVOb2RlLkF0dHJpYnV0ZXNFbnRyeRIqCgttZXJnZWRfZnJvbRgJIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEigKCW1lcmdlZF9hdBgKIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GkYKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuTm9kZUF0dHI6AjgBIjEKCVRyZWVOb2RlcxIkCgdjb250ZW50GAEgAygLMhMueW9ya2llLnYxLlRyZWVOb2RlIkcKClRyZWVOb2RlSUQSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBSJjCgdUcmVlUG9zEigKCXBhcmVudF9pZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEi4KD2xlZnRfc2libGluZ19pZBgCIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEImsKBFVzZXISCgoCaWQYASABKAkSFQoNYXV0aF9wcm92aWRlchgCIAEoCRIQCgh1c2VybmFtZRgDIAEoCRIuCgpjcmVhdGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKJAQoGTWVtYmVyEgoKAmlkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSDwoHdXNlcl9pZBgDIAEoCRIQCgh1c2VybmFtZRgEIAEoCRIMCgRyb2xlGAUgASgJEi4KCmludml0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIukGCgdQcm9qZWN0EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEgoKcHVibGljX2tleRgDIAEoCRISCgpzZWNyZXRfa2V5GAQgASgJEhgKEGF1dGhfd2ViaG9va191cmwYBSABKAkSHAoUYXV0aF93ZWJob29rX21ldGhvZHMYBiADKAkSIAoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGBEgASgEEiYKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgSIAEoCRImCh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYEyABKAkSJAocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgUIAEoCRIZChFldmVudF93ZWJob29rX3VybBgHIAEoCRIcChRldmVudF93ZWJob29rX2V2ZW50cxgIIAMoCRIhChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBUgASgEEicKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYFiABKAkSJwofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgXIAEoCRIlCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgYIAEoCRIjChtjbGllbnRfZGVhY3RpdmF0ZV90aHJlc2hvbGQYCSABKAkSGgoSc25hcHNob3RfdGhyZXNob2xkGBkgASgDEhkKEXNuYXBzaG90X2ludGVydmFsGBogASgDEiQKHG1heF9zdWJzY3JpYmVyc19wZXJfZG9jdW1lbnQYCiABKAUSJAocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgLIAEoBRIdChVtYXhfc2l6ZV9wZXJfZG9jdW1lbnQYDyABKAUSGAoQcmVtb3ZlX29uX2RldGFjaBgQIAEoCBIdChVhdXRvX3JldmlzaW9uX2VuYWJsZWQYGyABKAgSFwoPYWxsb3dlZF9vcmlnaW5zGA4gAygJEi4KCmNyZWF0ZWRfYXQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYDSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIi8KC01ldHJpY1BvaW50EhEKCXRpbWVzdGFtcBgBIAEoAxINCgV2YWx1ZRgCIAEoBSKjDAoWVXBkYXRhYmxlUHJvamVjdEZpZWxkcxIqCgRuYW1lGAEgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjYKEGF1dGhfd2ViaG9va191cmwYAiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSUgoUYXV0aF93ZWJob29rX21ldGhvZHMYAyABKAsyNC55b3JraWUudjEuVXBkYXRhYmxlUHJvamVjdEZpZWxkcy5BdXRoV2ViaG9va01ldGhvZHMSPgoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGAwgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkQKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgNIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJECh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYDiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSQgocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgPIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChFldmVudF93ZWJob29rX3VybBgEIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJSChRldmVudF93ZWJob29rX2V2ZW50cxgFIAEoCzI0LnlvcmtpZS52MS5VcGRhdGFibGVQcm9qZWN0RmllbGRzLkV2ZW50V2ViaG9va0V2ZW50cxI/ChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBAgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkUKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYESABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSRQofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgSIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJDCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgTIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChJzbmFwc2hvdF90aHJlc2hvbGQYFCABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZRI2ChFzbmFwc2hvdF9pbnRlcnZhbBgVIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEkEKG2NsaWVudF9kZWFjdGl2YXRlX3RocmVzaG9sZBgGIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJBChxtYXhfc3Vic2NyaWJlcnNfcGVyX2RvY3VtZW50GAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSQQocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgIIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjoKFW1heF9zaXplX3Blcl9kb2N1bWVudBgKIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjQKEHJlbW92ZV9vbl9kZXRhY2gYCyABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlEjkKFWF1dG9fcmV2aXNpb25fZW5hYmxlZBgWIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUSSQoPYWxsb3dlZF9vcmlnaW5zGAkgASgLMjAueW9ya2llLnYxLlVwZGF0YWJsZVByb2plY3RGaWVsZHMuQWxsb3dlZE9yaWdpbnMaJQoSQXV0aFdlYmhvb2tNZXRob2RzEg8KB21ldGhvZHMYASADKAkaJAoSRXZlbnRXZWJob29rRXZlbnRzEg4KBmV2ZW50cxgBIAMoCRohCg5BbGxvd2VkT3JpZ2lucxIPCgdvcmlnaW5zGAEgAygJIqcDCg9Eb2N1bWVudFN1bW1hcnkSCgoCaWQYASABKAkSCwoDa2V5GAIgASgJEgwKBHJvb3QYAyABKAkSGAoQYXR0YWNoZWRfY2xpZW50cxgHIAEoBRIpCg1kb2N1bWVudF9zaXplGAggASgLMhIueW9ya2llLnYxLkRvY1NpemUSEgoKc2NoZW1hX2tleRgJIAEoCRI8CglwcmVzZW5jZXMYCiADKAsyKS55b3JraWUudjEuRG9jdW1lbnRTdW1tYXJ5LlByZXNlbmNlc0VudHJ5Ei4KCmNyZWF0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KC2FjY2Vzc2VkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBpFCg5QcmVzZW5jZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2U6AjgBItoBCg5QcmVzZW5jZUNoYW5nZRIyCgR0eXBlGAEgASgOMiQueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlLkNoYW5nZVR5cGUSJQoIcHJlc2VuY2UYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2UibQoKQ2hhbmdlVHlwZRIbChdDSEFOR0VfVFlQRV9VTlNQRUNJRklFRBAAEhMKD0NIQU5HRV9UWVBFX1BVVBABEhYKEkNIQU5HRV9UWVBFX0RFTEVURRACEhUKEUNIQU5HRV9UWVBFX0NMRUFSEAMiZAoIUHJlc2VuY2USKwoEZGF0YRgBIAMoCzIdLnlvcmtpZS52MS5QcmVzZW5jZS5EYXRhRW50cnkaKwoJRGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiNAoOQ2hhbm5lbFN1bW1hcnkSCwoDa2V5GAEgASgJEhUKDXNlc3Npb25fY291bnQYAiABKAUiNAoKQ2hlY2twb2ludBISCgpzZXJ2ZXJfc2VxGAEgASgDEhIKCmNsaWVudF9zZXEYAiABKA0iYQoLVGV4dE5vZGVQb3MSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBRIXCg9yZWxhdGl2ZV9vZmZzZXQYAyABKAUiQgoKVGltZVRpY2tldBIPCgdsYW1wb3J0GAEgASgDEhEKCWRlbGltaXRlchgCIAEoDRIQCghhY3Rvcl9pZBgDIAEoDCIuCgxEb2NFdmVudEJvZHkSDQoFdG9waWMYASABKAkSDwoHcGF5bG9hZBgCIAEoDCJrCghEb2NFdmVudBIlCgR0eXBlGAEgASgOMhcueW9ya2llLnYxLkRvY0V2ZW50VHlwZRIRCglwdWJsaXNoZXIYAiABKAkSJQoEYm9keRgDIAEoCzIXLnlvcmtpZS52MS5Eb2NFdmVudEJvZHki1gEKDENoYW5uZWxFdmVudBIqCgR0eXBlGAEgASgOMhwueW9ya2llLnYxLkNoYW5uZWxFdmVudC5UeXBlEhEKCXB1Ymxpc2hlchgCIAEoCRIVCg1zZXNzaW9uX2NvdW50GAMgASgDEgsKA3NlcRgEIAEoAxINCgV0b3BpYxgFIAEoCRIPCgdwYXlsb2FkGAYgASgMIkMKBFR5cGUSFAoQVFlQRV9VTlNQRUNJRklFRBAAEhEKDVRZUEVfUFJFU0VOQ0UQARISCg5UWVBFX0JST0FEQ0FTVBACIiYKCERhdGFTaXplEgwKBGRhdGEYASABKAUSDAoEbWV0YRgCIAEoBSJNCgdEb2NTaXplEiEKBGxpdmUYASABKAsyEy55b3JraWUudjEuRGF0YVNpemUSHwoCZ2MYAiABKAsyEy55b3JraWUudjEuRGF0YVNpemUikQEKBlNjaGVtYRIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEg8KB3ZlcnNpb24YAyABKAUSDAoEYm9keRgEIAEoCRIeCgVydWxlcxgFIAMoCzIPLnlvcmtpZS52MS5SdWxlEi4KCmNyZWF0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIlAKDFRyZWVOb2RlUnVsZRIRCglub2RlX3R5cGUYASABKAkSDwoHY29udGVudBgCIAEoCRINCgVtYXJrcxgDIAEoCRINCgVncm91cBgEIAEoCSJPCgRSdWxlEgwKBHBhdGgYASABKAkSDAoEdHlwZRgCIAEoCRIrCgp0cmVlX25vZGVzGAMgAygLMhcueW9ya2llLnYxLlRyZWVOb2RlUnVsZSKDAQoPUmV2aXNpb25TdW1tYXJ5EgoKAmlkGAEgASgJEg0KBWxhYmVsGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEhAKCHNuYXBzaG90GAQgASgJEi4KCmNyZWF0ZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wKvwCCglWYWx1ZVR5cGUSEwoPVkFMVUVfVFlQRV9OVUxMEAASFgoSVkFMVUVfVFlQRV9CT09MRUFOEAESFgoSVkFMVUVfVFlQRV9JTlRFR0VSEAISEwoPVkFMVUVfVFlQRV9MT05HEAMSFQoRVkFMVUVfVFlQRV9ET1VCTEUQBBIVChFWQUxVRV9UWVBFX1NUUklORxAFEhQKEFZBTFVFX1RZUEVfQllURVMQBhITCg9WQUxVRV9UWVBFX0RBVEUQBxIaChZWQUxVRV9UWVBFX0pTT05fT0JKRUNUEAgSGQoVVkFMVUVfVFlQRV9KU09OX0FSUkFZEAkSEwoPVkFMVUVfVFlQRV9URVhUEAoSGgoWVkFMVUVfVFlQRV9JTlRFR0VSX0NOVBALEhcKE1ZBTFVFX1RZUEVfTE9OR19DTlQQDBITCg9WQUxVRV9UWVBFX1RSRUUQDRIgChxWQUxVRV9UWVBFX0lOVEVHRVJfREVEVVBfQ05UEA4iBAgPEA8qpgEKDERvY0V2ZW50VHlwZRIjCh9ET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9DSEFOR0VEEAASIwofRE9DX0VWRU5UX1RZUEVfRE9DVU1FTlRfV0FUQ0hFRBABEiUKIURPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX1VOV0FUQ0hFRBACEiUKIURPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX0JST0FEQ0FTVBADQkUKEWRldi55b3JraWUuYXBpLnYxUAFaLmdpdGh1Yi5jb20veW9ya2llLXRlYW0veW9ya2llL2FwaS95b3JraWUvdjE7djFiBnByb3RvMw", [file_google_protobuf_timestamp, file_google_protobuf_wrappers]);
5793
+ const file_yorkie_v1_resources = /* @__PURE__ */ fileDesc("Chl5b3JraWUvdjEvcmVzb3VyY2VzLnByb3RvEgl5b3JraWUudjEirgEKCFNuYXBzaG90EiQKBHJvb3QYASABKAsyFi55b3JraWUudjEuSlNPTkVsZW1lbnQSNQoJcHJlc2VuY2VzGAIgAygLMiIueW9ya2llLnYxLlNuYXBzaG90LlByZXNlbmNlc0VudHJ5GkUKDlByZXNlbmNlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5QcmVzZW5jZToCOAEi+wEKCkNoYW5nZVBhY2sSFAoMZG9jdW1lbnRfa2V5GAEgASgJEikKCmNoZWNrcG9pbnQYAiABKAsyFS55b3JraWUudjEuQ2hlY2twb2ludBIQCghzbmFwc2hvdBgDIAEoDBIiCgdjaGFuZ2VzGAQgAygLMhEueW9ya2llLnYxLkNoYW5nZRIwChFtaW5fc3luY2VkX3RpY2tldBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYBiABKAgSMAoOdmVyc2lvbl92ZWN0b3IYByABKAsyGC55b3JraWUudjEuVmVyc2lvblZlY3RvciKYAQoGQ2hhbmdlEh8KAmlkGAEgASgLMhMueW9ya2llLnYxLkNoYW5nZUlEEg8KB21lc3NhZ2UYAiABKAkSKAoKb3BlcmF0aW9ucxgDIAMoCzIULnlvcmtpZS52MS5PcGVyYXRpb24SMgoPcHJlc2VuY2VfY2hhbmdlGAQgASgLMhkueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlIocBCghDaGFuZ2VJRBISCgpjbGllbnRfc2VxGAEgASgNEhIKCnNlcnZlcl9zZXEYAiABKAMSDwoHbGFtcG9ydBgDIAEoAxIQCghhY3Rvcl9pZBgEIAEoDBIwCg52ZXJzaW9uX3ZlY3RvchgFIAEoCzIYLnlvcmtpZS52MS5WZXJzaW9uVmVjdG9yInQKDVZlcnNpb25WZWN0b3ISNAoGdmVjdG9yGAEgAygLMiQueW9ya2llLnYxLlZlcnNpb25WZWN0b3IuVmVjdG9yRW50cnkaLQoLVmVjdG9yRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgDOgI4ASLpGwoJT3BlcmF0aW9uEicKA3NldBgBIAEoCzIYLnlvcmtpZS52MS5PcGVyYXRpb24uU2V0SAASJwoDYWRkGAIgASgLMhgueW9ya2llLnYxLk9wZXJhdGlvbi5BZGRIABIpCgRtb3ZlGAMgASgLMhkueW9ya2llLnYxLk9wZXJhdGlvbi5Nb3ZlSAASLQoGcmVtb3ZlGAQgASgLMhsueW9ya2llLnYxLk9wZXJhdGlvbi5SZW1vdmVIABIpCgRlZGl0GAUgASgLMhkueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0SAASKwoFc3R5bGUYByABKAsyGi55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlSAASMQoIaW5jcmVhc2UYCCABKAsyHS55b3JraWUudjEuT3BlcmF0aW9uLkluY3JlYXNlSAASMgoJdHJlZV9lZGl0GAkgASgLMh0ueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlRWRpdEgAEjQKCnRyZWVfc3R5bGUYCiABKAsyHi55b3JraWUudjEuT3BlcmF0aW9uLlRyZWVTdHlsZUgAEjIKCWFycmF5X3NldBgLIAEoCzIdLnlvcmtpZS52MS5PcGVyYXRpb24uQXJyYXlTZXRIABqdAQoDU2V0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSCwoDa2V5GAIgASgJEisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQawAEKA0FkZBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Ei4KD3ByZXZfY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQavwEKBE1vdmUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIuCg9wcmV2X2NyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpjcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKgoLZXhlY3V0ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqRAQoGUmVtb3ZlEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2V4ZWN1dGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQa6QQKBEVkaXQSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIkCgRmcm9tGAIgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEiIKAnRvGAMgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zElMKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAQgAygLMjIueW9ya2llLnYxLk9wZXJhdGlvbi5FZGl0LkNyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRIPCgdjb250ZW50GAUgASgJEioKC2V4ZWN1dGVkX2F0GAYgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSPQoKYXR0cmlidXRlcxgHIAMoCzIpLnlvcmtpZS52MS5PcGVyYXRpb24uRWRpdC5BdHRyaWJ1dGVzRW50cnkSLQoNcmVzdG9yZV9zcGFucxgIIAMoCzIWLnlvcmtpZS52MS5SZXN0b3JlU3BhbhIsCgxyZXN0b3JlX21vZGUYCSABKA4yFi55b3JraWUudjEuUmVzdG9yZU1vZGUSMQoRcmV0b21ic3RvbmVfc3BhbnMYCiADKAsyFi55b3JraWUudjEuUmVzdG9yZVNwYW4aUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARrpAwoFU3R5bGUSMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIkCgRmcm9tGAIgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEiIKAnRvGAMgASgLMhYueW9ya2llLnYxLlRleHROb2RlUG9zEj4KCmF0dHJpYnV0ZXMYBCADKAsyKi55b3JraWUudjEuT3BlcmF0aW9uLlN0eWxlLkF0dHJpYnV0ZXNFbnRyeRIqCgtleGVjdXRlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0ElQKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAYgAygLMjMueW9ya2llLnYxLk9wZXJhdGlvbi5TdHlsZS5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSHAoUYXR0cmlidXRlc190b19yZW1vdmUYByADKAkaMQoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARqkAQoISW5jcmVhc2USMAoRcGFyZW50X2NyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIrCgV2YWx1ZRgCIAEoCzIcLnlvcmtpZS52MS5KU09ORWxlbWVudFNpbXBsZRIqCgtleGVjdXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg0KBWFjdG9yGAQgASgJGpMDCghUcmVlRWRpdBIwChFwYXJlbnRfY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiAKBGZyb20YAiABKAsyEi55b3JraWUudjEuVHJlZVBvcxIeCgJ0bxgDIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zElcKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAQgAygLMjYueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlRWRpdC5DcmVhdGVkQXRNYXBCeUFjdG9yRW50cnkSJgoIY29udGVudHMYBSADKAsyFC55b3JraWUudjEuVHJlZU5vZGVzEhMKC3NwbGl0X2xldmVsGAcgASgFEioKC2V4ZWN1dGVkX2F0GAYgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQaUQoYQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0OgI4ARrtAwoJVHJlZVN0eWxlEjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSIAoEZnJvbRgCIAEoCzISLnlvcmtpZS52MS5UcmVlUG9zEh4KAnRvGAMgASgLMhIueW9ya2llLnYxLlRyZWVQb3MSQgoKYXR0cmlidXRlcxgEIAMoCzIuLnlvcmtpZS52MS5PcGVyYXRpb24uVHJlZVN0eWxlLkF0dHJpYnV0ZXNFbnRyeRIqCgtleGVjdXRlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhwKFGF0dHJpYnV0ZXNfdG9fcmVtb3ZlGAYgAygJElgKF2NyZWF0ZWRfYXRfbWFwX2J5X2FjdG9yGAcgAygLMjcueW9ya2llLnYxLk9wZXJhdGlvbi5UcmVlU3R5bGUuQ3JlYXRlZEF0TWFwQnlBY3RvckVudHJ5GjEKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGlEKGENyZWF0ZWRBdE1hcEJ5QWN0b3JFbnRyeRILCgNrZXkYASABKAkSJAoFdmFsdWUYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldDoCOAEawAEKCEFycmF5U2V0EjAKEXBhcmVudF9jcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EisKBXZhbHVlGAMgASgLMhwueW9ya2llLnYxLkpTT05FbGVtZW50U2ltcGxlEioKC2V4ZWN1dGVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXRCBgoEYm9keSLFAQoRSlNPTkVsZW1lbnRTaW1wbGUSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EiIKBHR5cGUYBCABKA4yFC55b3JraWUudjEuVmFsdWVUeXBlEg0KBXZhbHVlGAUgASgMIp8LCgtKU09ORWxlbWVudBI4Cgtqc29uX29iamVjdBgBIAEoCzIhLnlvcmtpZS52MS5KU09ORWxlbWVudC5KU09OT2JqZWN0SAASNgoKanNvbl9hcnJheRgCIAEoCzIgLnlvcmtpZS52MS5KU09ORWxlbWVudC5KU09OQXJyYXlIABI1CglwcmltaXRpdmUYAyABKAsyIC55b3JraWUudjEuSlNPTkVsZW1lbnQuUHJpbWl0aXZlSAASKwoEdGV4dBgFIAEoCzIbLnlvcmtpZS52MS5KU09ORWxlbWVudC5UZXh0SAASMQoHY291bnRlchgGIAEoCzIeLnlvcmtpZS52MS5KU09ORWxlbWVudC5Db3VudGVySAASKwoEdHJlZRgHIAEoCzIbLnlvcmtpZS52MS5KU09ORWxlbWVudC5UcmVlSAAargEKCkpTT05PYmplY3QSIQoFbm9kZXMYASADKAsyEi55b3JraWUudjEuUkhUTm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQarQEKCUpTT05BcnJheRIhCgVub2RlcxgBIAMoCzISLnlvcmtpZS52MS5SR0FOb2RlEikKCmNyZWF0ZWRfYXQYAiABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBq9AQoJUHJpbWl0aXZlEiIKBHR5cGUYASABKA4yFC55b3JraWUudjEuVmFsdWVUeXBlEg0KBXZhbHVlGAIgASgMEikKCmNyZWF0ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBInCghtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EikKCnJlbW92ZWRfYXQYBSABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBqpAQoEVGV4dBIiCgVub2RlcxgBIAMoCzITLnlvcmtpZS52MS5UZXh0Tm9kZRIpCgpjcmVhdGVkX2F0GAIgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSJwoIbW92ZWRfYXQYAyABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIpCgpyZW1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQa2AEKB0NvdW50ZXISIgoEdHlwZRgBIAEoDjIULnlvcmtpZS52MS5WYWx1ZVR5cGUSDQoFdmFsdWUYAiABKAwSKQoKY3JlYXRlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAQgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgFIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhUKDWhsbF9yZWdpc3RlcnMYByABKAxKBAgGEAcaqQEKBFRyZWUSIgoFbm9kZXMYASADKAsyEy55b3JraWUudjEuVHJlZU5vZGUSKQoKY3JlYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EicKCG1vdmVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0QgYKBGJvZHkiPwoHUkhUTm9kZRILCgNrZXkYASABKAkSJwoHZWxlbWVudBgCIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudCLuAQoHUkdBTm9kZRIgCgRuZXh0GAEgASgLMhIueW9ya2llLnYxLlJHQU5vZGUSJwoHZWxlbWVudBgCIAEoCzIWLnlvcmtpZS52MS5KU09ORWxlbWVudBIyChNwb3NpdGlvbl9jcmVhdGVkX2F0GAMgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSMAoRcG9zaXRpb25fbW92ZWRfYXQYBCABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBIyChNwb3NpdGlvbl9yZW1vdmVkX2F0GAUgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQiWAoITm9kZUF0dHISDQoFdmFsdWUYASABKAkSKQoKdXBkYXRlZF9hdBgCIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EhIKCmlzX3JlbW92ZWQYAyABKAgilAIKCFRleHROb2RlEiEKAmlkGAEgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSDQoFdmFsdWUYAiABKAkSKQoKcmVtb3ZlZF9hdBgDIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAQgASgLMhUueW9ya2llLnYxLlRleHROb2RlSUQSNwoKYXR0cmlidXRlcxgFIAMoCzIjLnlvcmtpZS52MS5UZXh0Tm9kZS5BdHRyaWJ1dGVzRW50cnkaRgoPQXR0cmlidXRlc0VudHJ5EgsKA2tleRgBIAEoCRIiCgV2YWx1ZRgCIAEoCzITLnlvcmtpZS52MS5Ob2RlQXR0cjoCOAEiRwoKVGV4dE5vZGVJRBIpCgpjcmVhdGVkX2F0GAEgASgLMhUueW9ya2llLnYxLlRpbWVUaWNrZXQSDgoGb2Zmc2V0GAIgASgFIrMDCghUcmVlTm9kZRIhCgJpZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEgwKBHR5cGUYAiABKAkSDQoFdmFsdWUYAyABKAkSKQoKcmVtb3ZlZF9hdBgEIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0EioKC2luc19wcmV2X2lkGAUgASgLMhUueW9ya2llLnYxLlRyZWVOb2RlSUQSKgoLaW5zX25leHRfaWQYBiABKAsyFS55b3JraWUudjEuVHJlZU5vZGVJRBINCgVkZXB0aBgHIAEoBRI3CgphdHRyaWJ1dGVzGAggAygLMiMueW9ya2llLnYxLlRyZWVOb2RlLkF0dHJpYnV0ZXNFbnRyeRIqCgttZXJnZWRfZnJvbRgJIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEigKCW1lcmdlZF9hdBgKIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0GkYKD0F0dHJpYnV0ZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuTm9kZUF0dHI6AjgBIjEKCVRyZWVOb2RlcxIkCgdjb250ZW50GAEgAygLMhMueW9ya2llLnYxLlRyZWVOb2RlIkcKClRyZWVOb2RlSUQSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBSJjCgdUcmVlUG9zEigKCXBhcmVudF9pZBgBIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEEi4KD2xlZnRfc2libGluZ19pZBgCIAEoCzIVLnlvcmtpZS52MS5UcmVlTm9kZUlEImsKBFVzZXISCgoCaWQYASABKAkSFQoNYXV0aF9wcm92aWRlchgCIAEoCRIQCgh1c2VybmFtZRgDIAEoCRIuCgpjcmVhdGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKJAQoGTWVtYmVyEgoKAmlkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSDwoHdXNlcl9pZBgDIAEoCRIQCgh1c2VybmFtZRgEIAEoCRIMCgRyb2xlGAUgASgJEi4KCmludml0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIukGCgdQcm9qZWN0EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEgoKcHVibGljX2tleRgDIAEoCRISCgpzZWNyZXRfa2V5GAQgASgJEhgKEGF1dGhfd2ViaG9va191cmwYBSABKAkSHAoUYXV0aF93ZWJob29rX21ldGhvZHMYBiADKAkSIAoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGBEgASgEEiYKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgSIAEoCRImCh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYEyABKAkSJAocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgUIAEoCRIZChFldmVudF93ZWJob29rX3VybBgHIAEoCRIcChRldmVudF93ZWJob29rX2V2ZW50cxgIIAMoCRIhChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBUgASgEEicKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYFiABKAkSJwofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgXIAEoCRIlCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgYIAEoCRIjChtjbGllbnRfZGVhY3RpdmF0ZV90aHJlc2hvbGQYCSABKAkSGgoSc25hcHNob3RfdGhyZXNob2xkGBkgASgDEhkKEXNuYXBzaG90X2ludGVydmFsGBogASgDEiQKHG1heF9zdWJzY3JpYmVyc19wZXJfZG9jdW1lbnQYCiABKAUSJAocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgLIAEoBRIdChVtYXhfc2l6ZV9wZXJfZG9jdW1lbnQYDyABKAUSGAoQcmVtb3ZlX29uX2RldGFjaBgQIAEoCBIdChVhdXRvX3JldmlzaW9uX2VuYWJsZWQYGyABKAgSFwoPYWxsb3dlZF9vcmlnaW5zGA4gAygJEi4KCmNyZWF0ZWRfYXQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYDSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIi8KC01ldHJpY1BvaW50EhEKCXRpbWVzdGFtcBgBIAEoAxINCgV2YWx1ZRgCIAEoBSKjDAoWVXBkYXRhYmxlUHJvamVjdEZpZWxkcxIqCgRuYW1lGAEgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlEjYKEGF1dGhfd2ViaG9va191cmwYAiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSUgoUYXV0aF93ZWJob29rX21ldGhvZHMYAyABKAsyNC55b3JraWUudjEuVXBkYXRhYmxlUHJvamVjdEZpZWxkcy5BdXRoV2ViaG9va01ldGhvZHMSPgoYYXV0aF93ZWJob29rX21heF9yZXRyaWVzGAwgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkQKHmF1dGhfd2ViaG9va19taW5fd2FpdF9pbnRlcnZhbBgNIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJECh5hdXRoX3dlYmhvb2tfbWF4X3dhaXRfaW50ZXJ2YWwYDiABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSQgocYXV0aF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgPIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChFldmVudF93ZWJob29rX3VybBgEIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJSChRldmVudF93ZWJob29rX2V2ZW50cxgFIAEoCzI0LnlvcmtpZS52MS5VcGRhdGFibGVQcm9qZWN0RmllbGRzLkV2ZW50V2ViaG9va0V2ZW50cxI/ChlldmVudF93ZWJob29rX21heF9yZXRyaWVzGBAgASgLMhwuZ29vZ2xlLnByb3RvYnVmLlVJbnQ2NFZhbHVlEkUKH2V2ZW50X3dlYmhvb2tfbWluX3dhaXRfaW50ZXJ2YWwYESABKAsyHC5nb29nbGUucHJvdG9idWYuU3RyaW5nVmFsdWUSRQofZXZlbnRfd2ViaG9va19tYXhfd2FpdF9pbnRlcnZhbBgSIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJDCh1ldmVudF93ZWJob29rX3JlcXVlc3RfdGltZW91dBgTIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRI3ChJzbmFwc2hvdF90aHJlc2hvbGQYFCABKAsyGy5nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZRI2ChFzbmFwc2hvdF9pbnRlcnZhbBgVIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlEkEKG2NsaWVudF9kZWFjdGl2YXRlX3RocmVzaG9sZBgGIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZRJBChxtYXhfc3Vic2NyaWJlcnNfcGVyX2RvY3VtZW50GAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUSQQocbWF4X2F0dGFjaG1lbnRzX3Blcl9kb2N1bWVudBgIIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjoKFW1heF9zaXplX3Blcl9kb2N1bWVudBgKIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEjQKEHJlbW92ZV9vbl9kZXRhY2gYCyABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlEjkKFWF1dG9fcmV2aXNpb25fZW5hYmxlZBgWIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWUSSQoPYWxsb3dlZF9vcmlnaW5zGAkgASgLMjAueW9ya2llLnYxLlVwZGF0YWJsZVByb2plY3RGaWVsZHMuQWxsb3dlZE9yaWdpbnMaJQoSQXV0aFdlYmhvb2tNZXRob2RzEg8KB21ldGhvZHMYASADKAkaJAoSRXZlbnRXZWJob29rRXZlbnRzEg4KBmV2ZW50cxgBIAMoCRohCg5BbGxvd2VkT3JpZ2lucxIPCgdvcmlnaW5zGAEgAygJIqcDCg9Eb2N1bWVudFN1bW1hcnkSCgoCaWQYASABKAkSCwoDa2V5GAIgASgJEgwKBHJvb3QYAyABKAkSGAoQYXR0YWNoZWRfY2xpZW50cxgHIAEoBRIpCg1kb2N1bWVudF9zaXplGAggASgLMhIueW9ya2llLnYxLkRvY1NpemUSEgoKc2NoZW1hX2tleRgJIAEoCRI8CglwcmVzZW5jZXMYCiADKAsyKS55b3JraWUudjEuRG9jdW1lbnRTdW1tYXJ5LlByZXNlbmNlc0VudHJ5Ei4KCmNyZWF0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KC2FjY2Vzc2VkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBpFCg5QcmVzZW5jZXNFbnRyeRILCgNrZXkYASABKAkSIgoFdmFsdWUYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2U6AjgBItoBCg5QcmVzZW5jZUNoYW5nZRIyCgR0eXBlGAEgASgOMiQueW9ya2llLnYxLlByZXNlbmNlQ2hhbmdlLkNoYW5nZVR5cGUSJQoIcHJlc2VuY2UYAiABKAsyEy55b3JraWUudjEuUHJlc2VuY2UibQoKQ2hhbmdlVHlwZRIbChdDSEFOR0VfVFlQRV9VTlNQRUNJRklFRBAAEhMKD0NIQU5HRV9UWVBFX1BVVBABEhYKEkNIQU5HRV9UWVBFX0RFTEVURRACEhUKEUNIQU5HRV9UWVBFX0NMRUFSEAMiZAoIUHJlc2VuY2USKwoEZGF0YRgBIAMoCzIdLnlvcmtpZS52MS5QcmVzZW5jZS5EYXRhRW50cnkaKwoJRGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiNAoOQ2hhbm5lbFN1bW1hcnkSCwoDa2V5GAEgASgJEhUKDXNlc3Npb25fY291bnQYAiABKAUiNAoKQ2hlY2twb2ludBISCgpzZXJ2ZXJfc2VxGAEgASgDEhIKCmNsaWVudF9zZXEYAiABKA0iYQoLVGV4dE5vZGVQb3MSKQoKY3JlYXRlZF9hdBgBIAEoCzIVLnlvcmtpZS52MS5UaW1lVGlja2V0Eg4KBm9mZnNldBgCIAEoBRIXCg9yZWxhdGl2ZV9vZmZzZXQYAyABKAUi1AEKC1Jlc3RvcmVTcGFuEikKCmNyZWF0ZWRfYXQYASABKAsyFS55b3JraWUudjEuVGltZVRpY2tldBINCgVzdGFydBgCIAEoBRILCgNlbmQYAyABKAUSDwoHY29udGVudBgEIAEoCRI6CgphdHRyaWJ1dGVzGAUgAygLMiYueW9ya2llLnYxLlJlc3RvcmVTcGFuLkF0dHJpYnV0ZXNFbnRyeRoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJCCgpUaW1lVGlja2V0Eg8KB2xhbXBvcnQYASABKAMSEQoJZGVsaW1pdGVyGAIgASgNEhAKCGFjdG9yX2lkGAMgASgMIi4KDERvY0V2ZW50Qm9keRINCgV0b3BpYxgBIAEoCRIPCgdwYXlsb2FkGAIgASgMImsKCERvY0V2ZW50EiUKBHR5cGUYASABKA4yFy55b3JraWUudjEuRG9jRXZlbnRUeXBlEhEKCXB1Ymxpc2hlchgCIAEoCRIlCgRib2R5GAMgASgLMhcueW9ya2llLnYxLkRvY0V2ZW50Qm9keSLWAQoMQ2hhbm5lbEV2ZW50EioKBHR5cGUYASABKA4yHC55b3JraWUudjEuQ2hhbm5lbEV2ZW50LlR5cGUSEQoJcHVibGlzaGVyGAIgASgJEhUKDXNlc3Npb25fY291bnQYAyABKAMSCwoDc2VxGAQgASgDEg0KBXRvcGljGAUgASgJEg8KB3BheWxvYWQYBiABKAwiQwoEVHlwZRIUChBUWVBFX1VOU1BFQ0lGSUVEEAASEQoNVFlQRV9QUkVTRU5DRRABEhIKDlRZUEVfQlJPQURDQVNUEAIiJgoIRGF0YVNpemUSDAoEZGF0YRgBIAEoBRIMCgRtZXRhGAIgASgFIk0KB0RvY1NpemUSIQoEbGl2ZRgBIAEoCzITLnlvcmtpZS52MS5EYXRhU2l6ZRIfCgJnYxgCIAEoCzITLnlvcmtpZS52MS5EYXRhU2l6ZSKRAQoGU2NoZW1hEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDwoHdmVyc2lvbhgDIAEoBRIMCgRib2R5GAQgASgJEh4KBXJ1bGVzGAUgAygLMg8ueW9ya2llLnYxLlJ1bGUSLgoKY3JlYXRlZF9hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiUAoMVHJlZU5vZGVSdWxlEhEKCW5vZGVfdHlwZRgBIAEoCRIPCgdjb250ZW50GAIgASgJEg0KBW1hcmtzGAMgASgJEg0KBWdyb3VwGAQgASgJIk8KBFJ1bGUSDAoEcGF0aBgBIAEoCRIMCgR0eXBlGAIgASgJEisKCnRyZWVfbm9kZXMYAyADKAsyFy55b3JraWUudjEuVHJlZU5vZGVSdWxlIoMBCg9SZXZpc2lvblN1bW1hcnkSCgoCaWQYASABKAkSDQoFbGFiZWwYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSEAoIc25hcHNob3QYBCABKAkSLgoKY3JlYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAqYwoLUmVzdG9yZU1vZGUSHAoYUkVTVE9SRV9NT0RFX1VOU1BFQ0lGSUVEEAASGAoUUkVTVE9SRV9NT0RFX1JFU1RPUkUQARIcChhSRVNUT1JFX01PREVfUkVUT01CU1RPTkUQAir8AgoJVmFsdWVUeXBlEhMKD1ZBTFVFX1RZUEVfTlVMTBAAEhYKElZBTFVFX1RZUEVfQk9PTEVBThABEhYKElZBTFVFX1RZUEVfSU5URUdFUhACEhMKD1ZBTFVFX1RZUEVfTE9ORxADEhUKEVZBTFVFX1RZUEVfRE9VQkxFEAQSFQoRVkFMVUVfVFlQRV9TVFJJTkcQBRIUChBWQUxVRV9UWVBFX0JZVEVTEAYSEwoPVkFMVUVfVFlQRV9EQVRFEAcSGgoWVkFMVUVfVFlQRV9KU09OX09CSkVDVBAIEhkKFVZBTFVFX1RZUEVfSlNPTl9BUlJBWRAJEhMKD1ZBTFVFX1RZUEVfVEVYVBAKEhoKFlZBTFVFX1RZUEVfSU5URUdFUl9DTlQQCxIXChNWQUxVRV9UWVBFX0xPTkdfQ05UEAwSEwoPVkFMVUVfVFlQRV9UUkVFEA0SIAocVkFMVUVfVFlQRV9JTlRFR0VSX0RFRFVQX0NOVBAOIgQIDxAPKqYBCgxEb2NFdmVudFR5cGUSIwofRE9DX0VWRU5UX1RZUEVfRE9DVU1FTlRfQ0hBTkdFRBAAEiMKH0RPQ19FVkVOVF9UWVBFX0RPQ1VNRU5UX1dBVENIRUQQARIlCiFET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9VTldBVENIRUQQAhIlCiFET0NfRVZFTlRfVFlQRV9ET0NVTUVOVF9CUk9BRENBU1QQA0JFChFkZXYueW9ya2llLmFwaS52MVABWi5naXRodWIuY29tL3lvcmtpZS10ZWFtL3lvcmtpZS9hcGkveW9ya2llL3YxO3YxYgZwcm90bzM", [file_google_protobuf_timestamp, file_google_protobuf_wrappers]);
5794
5794
  const SnapshotSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 0);
5795
5795
  const ChangePackSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 1);
5796
5796
  const ChangeSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 2);
@@ -5835,13 +5835,20 @@ var PresenceChange_ChangeType = /* @__PURE__ */ ((PresenceChange_ChangeType2) =>
5835
5835
  const PresenceSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 24);
5836
5836
  const CheckpointSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 26);
5837
5837
  const TextNodePosSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 27);
5838
- const TimeTicketSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 28);
5838
+ const RestoreSpanSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 28);
5839
+ const TimeTicketSchema = /* @__PURE__ */ messageDesc(file_yorkie_v1_resources, 29);
5839
5840
  var ChannelEvent_Type = /* @__PURE__ */ ((ChannelEvent_Type2) => {
5840
5841
  ChannelEvent_Type2[ChannelEvent_Type2["UNSPECIFIED"] = 0] = "UNSPECIFIED";
5841
5842
  ChannelEvent_Type2[ChannelEvent_Type2["PRESENCE"] = 1] = "PRESENCE";
5842
5843
  ChannelEvent_Type2[ChannelEvent_Type2["BROADCAST"] = 2] = "BROADCAST";
5843
5844
  return ChannelEvent_Type2;
5844
5845
  })(ChannelEvent_Type || {});
5846
+ var RestoreMode = /* @__PURE__ */ ((RestoreMode2) => {
5847
+ RestoreMode2[RestoreMode2["UNSPECIFIED"] = 0] = "UNSPECIFIED";
5848
+ RestoreMode2[RestoreMode2["RESTORE"] = 1] = "RESTORE";
5849
+ RestoreMode2[RestoreMode2["RETOMBSTONE"] = 2] = "RETOMBSTONE";
5850
+ return RestoreMode2;
5851
+ })(RestoreMode || {});
5845
5852
  var ValueType = /* @__PURE__ */ ((ValueType2) => {
5846
5853
  ValueType2[ValueType2["NULL"] = 0] = "NULL";
5847
5854
  ValueType2[ValueType2["BOOLEAN"] = 1] = "BOOLEAN";
@@ -5867,7 +5874,7 @@ var DocEventType$1 = /* @__PURE__ */ ((DocEventType2) => {
5867
5874
  DocEventType2[DocEventType2["DOCUMENT_BROADCAST"] = 3] = "DOCUMENT_BROADCAST";
5868
5875
  return DocEventType2;
5869
5876
  })(DocEventType$1 || {});
5870
- const file_yorkie_v1_yorkie = /* @__PURE__ */ fileDesc("ChZ5b3JraWUvdjEveW9ya2llLnByb3RvEgl5b3JraWUudjEingEKFUFjdGl2YXRlQ2xpZW50UmVxdWVzdBISCgpjbGllbnRfa2V5GAEgASgJEkAKCG1ldGFkYXRhGAIgAygLMi4ueW9ya2llLnYxLkFjdGl2YXRlQ2xpZW50UmVxdWVzdC5NZXRhZGF0YUVudHJ5Gi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIrChZBY3RpdmF0ZUNsaWVudFJlc3BvbnNlEhEKCWNsaWVudF9pZBgBIAEoCSJBChdEZWFjdGl2YXRlQ2xpZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLc3luY2hyb25vdXMYAiABKAgiGgoYRGVhY3RpdmF0ZUNsaWVudFJlc3BvbnNlIn4KFUF0dGFjaERvY3VtZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSKgoLY2hhbmdlX3BhY2sYAiABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjaxISCgpzY2hlbWFfa2V5GAMgASgJEhIKCmRpc2FibGVfZ2MYBCABKAginwEKFkF0dGFjaERvY3VtZW50UmVzcG9uc2USEwoLZG9jdW1lbnRfaWQYASABKAkSKgoLY2hhbmdlX3BhY2sYAiABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjaxIdChVtYXhfc2l6ZV9wZXJfZG9jdW1lbnQYAyABKAUSJQoMc2NoZW1hX3J1bGVzGAQgAygLMg8ueW9ya2llLnYxLlJ1bGUiiwEKFURldGFjaERvY3VtZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSKgoLY2hhbmdlX3BhY2sYAyABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjaxIeChZyZW1vdmVfaWZfbm90X2F0dGFjaGVkGAQgASgIIkQKFkRldGFjaERvY3VtZW50UmVzcG9uc2USKgoLY2hhbmdlX3BhY2sYAiABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjayJTCgxXYXRjaFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEjAKCXJlc291cmNlcxgCIAMoCzIdLnlvcmtpZS52MS5SZXNvdXJjZURlc2NyaXB0b3IihAEKElJlc291cmNlRGVzY3JpcHRvchIxCghkb2N1bWVudBgBIAEoCzIdLnlvcmtpZS52MS5Eb2N1bWVudERlc2NyaXB0b3JIABIvCgdjaGFubmVsGAIgASgLMhwueW9ya2llLnYxLkNoYW5uZWxEZXNjcmlwdG9ySABCCgoIcmVzb3VyY2UiKQoSRG9jdW1lbnREZXNjcmlwdG9yEhMKC2RvY3VtZW50X2lkGAEgASgJIigKEUNoYW5uZWxEZXNjcmlwdG9yEhMKC2NoYW5uZWxfa2V5GAEgASgJInkKDVdhdGNoUmVzcG9uc2USOAoOaW5pdGlhbGl6YXRpb24YASABKAsyHi55b3JraWUudjEuV2F0Y2hJbml0aWFsaXphdGlvbkgAEiYKBWV2ZW50GAIgASgLMhUueW9ya2llLnYxLldhdGNoRXZlbnRIAEIGCgRib2R5IkYKE1dhdGNoSW5pdGlhbGl6YXRpb24SLwoOcmVzb3VyY2VfaW5pdHMYASADKAsyFy55b3JraWUudjEuUmVzb3VyY2VJbml0IngKDFJlc291cmNlSW5pdBIwCg1kb2N1bWVudF9pbml0GAEgASgLMhcueW9ya2llLnYxLkRvY3VtZW50SW5pdEgAEi4KDGNoYW5uZWxfaW5pdBgCIAEoCzIWLnlvcmtpZS52MS5DaGFubmVsSW5pdEgAQgYKBGluaXQiNwoMRG9jdW1lbnRJbml0EhMKC2RvY3VtZW50X2lkGAEgASgJEhIKCmNsaWVudF9pZHMYAiADKAkiRgoLQ2hhbm5lbEluaXQSEwoLY2hhbm5lbF9rZXkYASABKAkSFQoNc2Vzc2lvbl9jb3VudBgCIAEoAxILCgNzZXEYAyABKAMiewoKV2F0Y2hFdmVudBItCglkb2NfZXZlbnQYASABKAsyGC55b3JraWUudjEuRG9jV2F0Y2hFdmVudEgAEjUKDWNoYW5uZWxfZXZlbnQYAiABKAsyHC55b3JraWUudjEuQ2hhbm5lbFdhdGNoRXZlbnRIAEIHCgVldmVudCJICg1Eb2NXYXRjaEV2ZW50EhMKC2RvY3VtZW50X2lkGAEgASgJEiIKBWV2ZW50GAIgASgLMhMueW9ya2llLnYxLkRvY0V2ZW50IlAKEUNoYW5uZWxXYXRjaEV2ZW50EhMKC2NoYW5uZWxfa2V5GAEgASgJEiYKBWV2ZW50GAIgASgLMhcueW9ya2llLnYxLkNoYW5uZWxFdmVudCI+ChRXYXRjaERvY3VtZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkitgEKFVdhdGNoRG9jdW1lbnRSZXNwb25zZRJJCg5pbml0aWFsaXphdGlvbhgBIAEoCzIvLnlvcmtpZS52MS5XYXRjaERvY3VtZW50UmVzcG9uc2UuSW5pdGlhbGl6YXRpb25IABIkCgVldmVudBgCIAEoCzITLnlvcmtpZS52MS5Eb2NFdmVudEgAGiQKDkluaXRpYWxpemF0aW9uEhIKCmNsaWVudF9pZHMYASADKAlCBgoEYm9keSI9ChNXYXRjaENoYW5uZWxSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtjaGFubmVsX2tleRgCIAEoCSKDAQoUV2F0Y2hDaGFubmVsUmVzcG9uc2USOQoLaW5pdGlhbGl6ZWQYASABKAsyIi55b3JraWUudjEuV2F0Y2hDaGFubmVsSW5pdGlhbGl6ZWRIABIoCgVldmVudBgCIAEoCzIXLnlvcmtpZS52MS5DaGFubmVsRXZlbnRIAEIGCgRib2R5Ij0KF1dhdGNoQ2hhbm5lbEluaXRpYWxpemVkEhUKDXNlc3Npb25fY291bnQYASABKAMSCwoDc2VxGAIgASgDImsKFVJlbW92ZURvY3VtZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSKgoLY2hhbmdlX3BhY2sYAyABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjayJEChZSZW1vdmVEb2N1bWVudFJlc3BvbnNlEioKC2NoYW5nZV9wYWNrGAEgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2sikwEKFlB1c2hQdWxsQ2hhbmdlc1JlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEioKC2NoYW5nZV9wYWNrGAMgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2sSEQoJcHVzaF9vbmx5GAQgASgIEhIKCmRpc2FibGVfZ2MYBSABKAgiRQoXUHVzaFB1bGxDaGFuZ2VzUmVzcG9uc2USKgoLY2hhbmdlX3BhY2sYASABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjayJjChVDcmVhdGVSZXZpc2lvblJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEg0KBWxhYmVsGAMgASgJEhMKC2Rlc2NyaXB0aW9uGAQgASgJIkYKFkNyZWF0ZVJldmlzaW9uUmVzcG9uc2USLAoIcmV2aXNpb24YASABKAsyGi55b3JraWUudjEuUmV2aXNpb25TdW1tYXJ5IlEKEkdldFJldmlzaW9uUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSEwoLcmV2aXNpb25faWQYAyABKAkiQwoTR2V0UmV2aXNpb25SZXNwb25zZRIsCghyZXZpc2lvbhgBIAEoCzIaLnlvcmtpZS52MS5SZXZpc2lvblN1bW1hcnkidQoUTGlzdFJldmlzaW9uc1JlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEhEKCXBhZ2Vfc2l6ZRgDIAEoBRIOCgZvZmZzZXQYBCABKAUSEgoKaXNfZm9yd2FyZBgFIAEoCCJGChVMaXN0UmV2aXNpb25zUmVzcG9uc2USLQoJcmV2aXNpb25zGAEgAygLMhoueW9ya2llLnYxLlJldmlzaW9uU3VtbWFyeSJVChZSZXN0b3JlUmV2aXNpb25SZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRITCgtyZXZpc2lvbl9pZBgEIAEoCSIZChdSZXN0b3JlUmV2aXNpb25SZXNwb25zZSI+ChRBdHRhY2hDaGFubmVsUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLY2hhbm5lbF9rZXkYAiABKAkiQgoVQXR0YWNoQ2hhbm5lbFJlc3BvbnNlEhIKCnNlc3Npb25faWQYASABKAkSFQoNc2Vzc2lvbl9jb3VudBgCIAEoAyJSChREZXRhY2hDaGFubmVsUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLY2hhbm5lbF9rZXkYAiABKAkSEgoKc2Vzc2lvbl9pZBgDIAEoCSIuChVEZXRhY2hDaGFubmVsUmVzcG9uc2USFQoNc2Vzc2lvbl9jb3VudBgBIAEoAyLaAQoVUmVmcmVzaENoYW5uZWxSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtjaGFubmVsX2tleRgCIAEoCRISCgpzZXNzaW9uX2lkGAMgASgJEhIKCmNsaWVudF9rZXkYBCABKAkSQAoIbWV0YWRhdGEYBSADKAsyLi55b3JraWUudjEuUmVmcmVzaENoYW5uZWxSZXF1ZXN0Lk1ldGFkYXRhRW50cnkaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIlYKFlJlZnJlc2hDaGFubmVsUmVzcG9uc2USFQoNc2Vzc2lvbl9jb3VudBgBIAEoAxIRCgljbGllbnRfaWQYAiABKAkSEgoKc2Vzc2lvbl9pZBgDIAEoCSIpChJQZWVrQ2hhbm5lbFJlcXVlc3QSEwoLY2hhbm5lbF9rZXkYASABKAkiLAoTUGVla0NoYW5uZWxSZXNwb25zZRIVCg1zZXNzaW9uX2NvdW50GAEgASgDIloKEEJyb2FkY2FzdFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2NoYW5uZWxfa2V5GAIgASgJEg0KBXRvcGljGAMgASgJEg8KB3BheWxvYWQYBCABKAwiEwoRQnJvYWRjYXN0UmVzcG9uc2UylQwKDVlvcmtpZVNlcnZpY2USVwoOQWN0aXZhdGVDbGllbnQSIC55b3JraWUudjEuQWN0aXZhdGVDbGllbnRSZXF1ZXN0GiEueW9ya2llLnYxLkFjdGl2YXRlQ2xpZW50UmVzcG9uc2UiABJdChBEZWFjdGl2YXRlQ2xpZW50EiIueW9ya2llLnYxLkRlYWN0aXZhdGVDbGllbnRSZXF1ZXN0GiMueW9ya2llLnYxLkRlYWN0aXZhdGVDbGllbnRSZXNwb25zZSIAElcKDkF0dGFjaERvY3VtZW50EiAueW9ya2llLnYxLkF0dGFjaERvY3VtZW50UmVxdWVzdBohLnlvcmtpZS52MS5BdHRhY2hEb2N1bWVudFJlc3BvbnNlIgASVwoORGV0YWNoRG9jdW1lbnQSIC55b3JraWUudjEuRGV0YWNoRG9jdW1lbnRSZXF1ZXN0GiEueW9ya2llLnYxLkRldGFjaERvY3VtZW50UmVzcG9uc2UiABJXCg5SZW1vdmVEb2N1bWVudBIgLnlvcmtpZS52MS5SZW1vdmVEb2N1bWVudFJlcXVlc3QaIS55b3JraWUudjEuUmVtb3ZlRG9jdW1lbnRSZXNwb25zZSIAEloKD1B1c2hQdWxsQ2hhbmdlcxIhLnlvcmtpZS52MS5QdXNoUHVsbENoYW5nZXNSZXF1ZXN0GiIueW9ya2llLnYxLlB1c2hQdWxsQ2hhbmdlc1Jlc3BvbnNlIgASPgoFV2F0Y2gSFy55b3JraWUudjEuV2F0Y2hSZXF1ZXN0GhgueW9ya2llLnYxLldhdGNoUmVzcG9uc2UiADABElYKDVdhdGNoRG9jdW1lbnQSHy55b3JraWUudjEuV2F0Y2hEb2N1bWVudFJlcXVlc3QaIC55b3JraWUudjEuV2F0Y2hEb2N1bWVudFJlc3BvbnNlIgAwARJTCgxXYXRjaENoYW5uZWwSHi55b3JraWUudjEuV2F0Y2hDaGFubmVsUmVxdWVzdBofLnlvcmtpZS52MS5XYXRjaENoYW5uZWxSZXNwb25zZSIAMAESVwoOQ3JlYXRlUmV2aXNpb24SIC55b3JraWUudjEuQ3JlYXRlUmV2aXNpb25SZXF1ZXN0GiEueW9ya2llLnYxLkNyZWF0ZVJldmlzaW9uUmVzcG9uc2UiABJOCgtHZXRSZXZpc2lvbhIdLnlvcmtpZS52MS5HZXRSZXZpc2lvblJlcXVlc3QaHi55b3JraWUudjEuR2V0UmV2aXNpb25SZXNwb25zZSIAElQKDUxpc3RSZXZpc2lvbnMSHy55b3JraWUudjEuTGlzdFJldmlzaW9uc1JlcXVlc3QaIC55b3JraWUudjEuTGlzdFJldmlzaW9uc1Jlc3BvbnNlIgASWgoPUmVzdG9yZVJldmlzaW9uEiEueW9ya2llLnYxLlJlc3RvcmVSZXZpc2lvblJlcXVlc3QaIi55b3JraWUudjEuUmVzdG9yZVJldmlzaW9uUmVzcG9uc2UiABJUCg1BdHRhY2hDaGFubmVsEh8ueW9ya2llLnYxLkF0dGFjaENoYW5uZWxSZXF1ZXN0GiAueW9ya2llLnYxLkF0dGFjaENoYW5uZWxSZXNwb25zZSIAElQKDURldGFjaENoYW5uZWwSHy55b3JraWUudjEuRGV0YWNoQ2hhbm5lbFJlcXVlc3QaIC55b3JraWUudjEuRGV0YWNoQ2hhbm5lbFJlc3BvbnNlIgASVwoOUmVmcmVzaENoYW5uZWwSIC55b3JraWUudjEuUmVmcmVzaENoYW5uZWxSZXF1ZXN0GiEueW9ya2llLnYxLlJlZnJlc2hDaGFubmVsUmVzcG9uc2UiABJOCgtQZWVrQ2hhbm5lbBIdLnlvcmtpZS52MS5QZWVrQ2hhbm5lbFJlcXVlc3QaHi55b3JraWUudjEuUGVla0NoYW5uZWxSZXNwb25zZSIAEkgKCUJyb2FkY2FzdBIbLnlvcmtpZS52MS5Ccm9hZGNhc3RSZXF1ZXN0GhwueW9ya2llLnYxLkJyb2FkY2FzdFJlc3BvbnNlIgBCRQoRZGV2LnlvcmtpZS5hcGkudjFQAVouZ2l0aHViLmNvbS95b3JraWUtdGVhbS95b3JraWUvYXBpL3lvcmtpZS92MTt2MWIGcHJvdG8z", [file_yorkie_v1_resources]);
5877
+ const file_yorkie_v1_yorkie = /* @__PURE__ */ fileDesc("ChZ5b3JraWUvdjEveW9ya2llLnByb3RvEgl5b3JraWUudjEingEKFUFjdGl2YXRlQ2xpZW50UmVxdWVzdBISCgpjbGllbnRfa2V5GAEgASgJEkAKCG1ldGFkYXRhGAIgAygLMi4ueW9ya2llLnYxLkFjdGl2YXRlQ2xpZW50UmVxdWVzdC5NZXRhZGF0YUVudHJ5Gi8KDU1ldGFkYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASIrChZBY3RpdmF0ZUNsaWVudFJlc3BvbnNlEhEKCWNsaWVudF9pZBgBIAEoCSJBChdEZWFjdGl2YXRlQ2xpZW50UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLc3luY2hyb25vdXMYAiABKAgiGgoYRGVhY3RpdmF0ZUNsaWVudFJlc3BvbnNlIpgBChVBdHRhY2hEb2N1bWVudFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEioKC2NoYW5nZV9wYWNrGAIgASgLMhUueW9ya2llLnYxLkNoYW5nZVBhY2sSEgoKc2NoZW1hX2tleRgDIAEoCRISCgpkaXNhYmxlX2djGAQgASgIEhgKEGRpc2FibGVfcHJlc2VuY2UYBSABKAgiuQEKFkF0dGFjaERvY3VtZW50UmVzcG9uc2USEwoLZG9jdW1lbnRfaWQYASABKAkSKgoLY2hhbmdlX3BhY2sYAiABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjaxIdChVtYXhfc2l6ZV9wZXJfZG9jdW1lbnQYAyABKAUSJQoMc2NoZW1hX3J1bGVzGAQgAygLMg8ueW9ya2llLnYxLlJ1bGUSGAoQZGlzYWJsZV9wcmVzZW5jZRgFIAEoCCKLAQoVRGV0YWNoRG9jdW1lbnRSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRIqCgtjaGFuZ2VfcGFjaxgDIAEoCzIVLnlvcmtpZS52MS5DaGFuZ2VQYWNrEh4KFnJlbW92ZV9pZl9ub3RfYXR0YWNoZWQYBCABKAgiRAoWRGV0YWNoRG9jdW1lbnRSZXNwb25zZRIqCgtjaGFuZ2VfcGFjaxgCIAEoCzIVLnlvcmtpZS52MS5DaGFuZ2VQYWNrIlMKDFdhdGNoUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSMAoJcmVzb3VyY2VzGAIgAygLMh0ueW9ya2llLnYxLlJlc291cmNlRGVzY3JpcHRvciKEAQoSUmVzb3VyY2VEZXNjcmlwdG9yEjEKCGRvY3VtZW50GAEgASgLMh0ueW9ya2llLnYxLkRvY3VtZW50RGVzY3JpcHRvckgAEi8KB2NoYW5uZWwYAiABKAsyHC55b3JraWUudjEuQ2hhbm5lbERlc2NyaXB0b3JIAEIKCghyZXNvdXJjZSIpChJEb2N1bWVudERlc2NyaXB0b3ISEwoLZG9jdW1lbnRfaWQYASABKAkiKAoRQ2hhbm5lbERlc2NyaXB0b3ISEwoLY2hhbm5lbF9rZXkYASABKAkieQoNV2F0Y2hSZXNwb25zZRI4Cg5pbml0aWFsaXphdGlvbhgBIAEoCzIeLnlvcmtpZS52MS5XYXRjaEluaXRpYWxpemF0aW9uSAASJgoFZXZlbnQYAiABKAsyFS55b3JraWUudjEuV2F0Y2hFdmVudEgAQgYKBGJvZHkiRgoTV2F0Y2hJbml0aWFsaXphdGlvbhIvCg5yZXNvdXJjZV9pbml0cxgBIAMoCzIXLnlvcmtpZS52MS5SZXNvdXJjZUluaXQieAoMUmVzb3VyY2VJbml0EjAKDWRvY3VtZW50X2luaXQYASABKAsyFy55b3JraWUudjEuRG9jdW1lbnRJbml0SAASLgoMY2hhbm5lbF9pbml0GAIgASgLMhYueW9ya2llLnYxLkNoYW5uZWxJbml0SABCBgoEaW5pdCI3CgxEb2N1bWVudEluaXQSEwoLZG9jdW1lbnRfaWQYASABKAkSEgoKY2xpZW50X2lkcxgCIAMoCSJGCgtDaGFubmVsSW5pdBITCgtjaGFubmVsX2tleRgBIAEoCRIVCg1zZXNzaW9uX2NvdW50GAIgASgDEgsKA3NlcRgDIAEoAyJ7CgpXYXRjaEV2ZW50Ei0KCWRvY19ldmVudBgBIAEoCzIYLnlvcmtpZS52MS5Eb2NXYXRjaEV2ZW50SAASNQoNY2hhbm5lbF9ldmVudBgCIAEoCzIcLnlvcmtpZS52MS5DaGFubmVsV2F0Y2hFdmVudEgAQgcKBWV2ZW50IkgKDURvY1dhdGNoRXZlbnQSEwoLZG9jdW1lbnRfaWQYASABKAkSIgoFZXZlbnQYAiABKAsyEy55b3JraWUudjEuRG9jRXZlbnQiUAoRQ2hhbm5lbFdhdGNoRXZlbnQSEwoLY2hhbm5lbF9rZXkYASABKAkSJgoFZXZlbnQYAiABKAsyFy55b3JraWUudjEuQ2hhbm5lbEV2ZW50Ij4KFFdhdGNoRG9jdW1lbnRSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCSK2AQoVV2F0Y2hEb2N1bWVudFJlc3BvbnNlEkkKDmluaXRpYWxpemF0aW9uGAEgASgLMi8ueW9ya2llLnYxLldhdGNoRG9jdW1lbnRSZXNwb25zZS5Jbml0aWFsaXphdGlvbkgAEiQKBWV2ZW50GAIgASgLMhMueW9ya2llLnYxLkRvY0V2ZW50SAAaJAoOSW5pdGlhbGl6YXRpb24SEgoKY2xpZW50X2lkcxgBIAMoCUIGCgRib2R5Ij0KE1dhdGNoQ2hhbm5lbFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2NoYW5uZWxfa2V5GAIgASgJIoMBChRXYXRjaENoYW5uZWxSZXNwb25zZRI5Cgtpbml0aWFsaXplZBgBIAEoCzIiLnlvcmtpZS52MS5XYXRjaENoYW5uZWxJbml0aWFsaXplZEgAEigKBWV2ZW50GAIgASgLMhcueW9ya2llLnYxLkNoYW5uZWxFdmVudEgAQgYKBGJvZHkiPQoXV2F0Y2hDaGFubmVsSW5pdGlhbGl6ZWQSFQoNc2Vzc2lvbl9jb3VudBgBIAEoAxILCgNzZXEYAiABKAMiawoVUmVtb3ZlRG9jdW1lbnRSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRIqCgtjaGFuZ2VfcGFjaxgDIAEoCzIVLnlvcmtpZS52MS5DaGFuZ2VQYWNrIkQKFlJlbW92ZURvY3VtZW50UmVzcG9uc2USKgoLY2hhbmdlX3BhY2sYASABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjayKTAQoWUHVzaFB1bGxDaGFuZ2VzUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSKgoLY2hhbmdlX3BhY2sYAyABKAsyFS55b3JraWUudjEuQ2hhbmdlUGFjaxIRCglwdXNoX29ubHkYBCABKAgSEgoKZGlzYWJsZV9nYxgFIAEoCCJFChdQdXNoUHVsbENoYW5nZXNSZXNwb25zZRIqCgtjaGFuZ2VfcGFjaxgBIAEoCzIVLnlvcmtpZS52MS5DaGFuZ2VQYWNrImMKFUNyZWF0ZVJldmlzaW9uUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSDQoFbGFiZWwYAyABKAkSEwoLZGVzY3JpcHRpb24YBCABKAkiRgoWQ3JlYXRlUmV2aXNpb25SZXNwb25zZRIsCghyZXZpc2lvbhgBIAEoCzIaLnlvcmtpZS52MS5SZXZpc2lvblN1bW1hcnkiUQoSR2V0UmV2aXNpb25SZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtkb2N1bWVudF9pZBgCIAEoCRITCgtyZXZpc2lvbl9pZBgDIAEoCSJDChNHZXRSZXZpc2lvblJlc3BvbnNlEiwKCHJldmlzaW9uGAEgASgLMhoueW9ya2llLnYxLlJldmlzaW9uU3VtbWFyeSJ1ChRMaXN0UmV2aXNpb25zUmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLZG9jdW1lbnRfaWQYAiABKAkSEQoJcGFnZV9zaXplGAMgASgFEg4KBm9mZnNldBgEIAEoBRISCgppc19mb3J3YXJkGAUgASgIIkYKFUxpc3RSZXZpc2lvbnNSZXNwb25zZRItCglyZXZpc2lvbnMYASADKAsyGi55b3JraWUudjEuUmV2aXNpb25TdW1tYXJ5IlUKFlJlc3RvcmVSZXZpc2lvblJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2RvY3VtZW50X2lkGAIgASgJEhMKC3JldmlzaW9uX2lkGAQgASgJIhkKF1Jlc3RvcmVSZXZpc2lvblJlc3BvbnNlIj4KFEF0dGFjaENoYW5uZWxSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtjaGFubmVsX2tleRgCIAEoCSJCChVBdHRhY2hDaGFubmVsUmVzcG9uc2USEgoKc2Vzc2lvbl9pZBgBIAEoCRIVCg1zZXNzaW9uX2NvdW50GAIgASgDIlIKFERldGFjaENoYW5uZWxSZXF1ZXN0EhEKCWNsaWVudF9pZBgBIAEoCRITCgtjaGFubmVsX2tleRgCIAEoCRISCgpzZXNzaW9uX2lkGAMgASgJIi4KFURldGFjaENoYW5uZWxSZXNwb25zZRIVCg1zZXNzaW9uX2NvdW50GAEgASgDItoBChVSZWZyZXNoQ2hhbm5lbFJlcXVlc3QSEQoJY2xpZW50X2lkGAEgASgJEhMKC2NoYW5uZWxfa2V5GAIgASgJEhIKCnNlc3Npb25faWQYAyABKAkSEgoKY2xpZW50X2tleRgEIAEoCRJACghtZXRhZGF0YRgFIAMoCzIuLnlvcmtpZS52MS5SZWZyZXNoQ2hhbm5lbFJlcXVlc3QuTWV0YWRhdGFFbnRyeRovCg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiVgoWUmVmcmVzaENoYW5uZWxSZXNwb25zZRIVCg1zZXNzaW9uX2NvdW50GAEgASgDEhEKCWNsaWVudF9pZBgCIAEoCRISCgpzZXNzaW9uX2lkGAMgASgJIikKElBlZWtDaGFubmVsUmVxdWVzdBITCgtjaGFubmVsX2tleRgBIAEoCSIsChNQZWVrQ2hhbm5lbFJlc3BvbnNlEhUKDXNlc3Npb25fY291bnQYASABKAMiWgoQQnJvYWRjYXN0UmVxdWVzdBIRCgljbGllbnRfaWQYASABKAkSEwoLY2hhbm5lbF9rZXkYAiABKAkSDQoFdG9waWMYAyABKAkSDwoHcGF5bG9hZBgEIAEoDCITChFCcm9hZGNhc3RSZXNwb25zZTKVDAoNWW9ya2llU2VydmljZRJXCg5BY3RpdmF0ZUNsaWVudBIgLnlvcmtpZS52MS5BY3RpdmF0ZUNsaWVudFJlcXVlc3QaIS55b3JraWUudjEuQWN0aXZhdGVDbGllbnRSZXNwb25zZSIAEl0KEERlYWN0aXZhdGVDbGllbnQSIi55b3JraWUudjEuRGVhY3RpdmF0ZUNsaWVudFJlcXVlc3QaIy55b3JraWUudjEuRGVhY3RpdmF0ZUNsaWVudFJlc3BvbnNlIgASVwoOQXR0YWNoRG9jdW1lbnQSIC55b3JraWUudjEuQXR0YWNoRG9jdW1lbnRSZXF1ZXN0GiEueW9ya2llLnYxLkF0dGFjaERvY3VtZW50UmVzcG9uc2UiABJXCg5EZXRhY2hEb2N1bWVudBIgLnlvcmtpZS52MS5EZXRhY2hEb2N1bWVudFJlcXVlc3QaIS55b3JraWUudjEuRGV0YWNoRG9jdW1lbnRSZXNwb25zZSIAElcKDlJlbW92ZURvY3VtZW50EiAueW9ya2llLnYxLlJlbW92ZURvY3VtZW50UmVxdWVzdBohLnlvcmtpZS52MS5SZW1vdmVEb2N1bWVudFJlc3BvbnNlIgASWgoPUHVzaFB1bGxDaGFuZ2VzEiEueW9ya2llLnYxLlB1c2hQdWxsQ2hhbmdlc1JlcXVlc3QaIi55b3JraWUudjEuUHVzaFB1bGxDaGFuZ2VzUmVzcG9uc2UiABI+CgVXYXRjaBIXLnlvcmtpZS52MS5XYXRjaFJlcXVlc3QaGC55b3JraWUudjEuV2F0Y2hSZXNwb25zZSIAMAESVgoNV2F0Y2hEb2N1bWVudBIfLnlvcmtpZS52MS5XYXRjaERvY3VtZW50UmVxdWVzdBogLnlvcmtpZS52MS5XYXRjaERvY3VtZW50UmVzcG9uc2UiADABElMKDFdhdGNoQ2hhbm5lbBIeLnlvcmtpZS52MS5XYXRjaENoYW5uZWxSZXF1ZXN0Gh8ueW9ya2llLnYxLldhdGNoQ2hhbm5lbFJlc3BvbnNlIgAwARJXCg5DcmVhdGVSZXZpc2lvbhIgLnlvcmtpZS52MS5DcmVhdGVSZXZpc2lvblJlcXVlc3QaIS55b3JraWUudjEuQ3JlYXRlUmV2aXNpb25SZXNwb25zZSIAEk4KC0dldFJldmlzaW9uEh0ueW9ya2llLnYxLkdldFJldmlzaW9uUmVxdWVzdBoeLnlvcmtpZS52MS5HZXRSZXZpc2lvblJlc3BvbnNlIgASVAoNTGlzdFJldmlzaW9ucxIfLnlvcmtpZS52MS5MaXN0UmV2aXNpb25zUmVxdWVzdBogLnlvcmtpZS52MS5MaXN0UmV2aXNpb25zUmVzcG9uc2UiABJaCg9SZXN0b3JlUmV2aXNpb24SIS55b3JraWUudjEuUmVzdG9yZVJldmlzaW9uUmVxdWVzdBoiLnlvcmtpZS52MS5SZXN0b3JlUmV2aXNpb25SZXNwb25zZSIAElQKDUF0dGFjaENoYW5uZWwSHy55b3JraWUudjEuQXR0YWNoQ2hhbm5lbFJlcXVlc3QaIC55b3JraWUudjEuQXR0YWNoQ2hhbm5lbFJlc3BvbnNlIgASVAoNRGV0YWNoQ2hhbm5lbBIfLnlvcmtpZS52MS5EZXRhY2hDaGFubmVsUmVxdWVzdBogLnlvcmtpZS52MS5EZXRhY2hDaGFubmVsUmVzcG9uc2UiABJXCg5SZWZyZXNoQ2hhbm5lbBIgLnlvcmtpZS52MS5SZWZyZXNoQ2hhbm5lbFJlcXVlc3QaIS55b3JraWUudjEuUmVmcmVzaENoYW5uZWxSZXNwb25zZSIAEk4KC1BlZWtDaGFubmVsEh0ueW9ya2llLnYxLlBlZWtDaGFubmVsUmVxdWVzdBoeLnlvcmtpZS52MS5QZWVrQ2hhbm5lbFJlc3BvbnNlIgASSAoJQnJvYWRjYXN0EhsueW9ya2llLnYxLkJyb2FkY2FzdFJlcXVlc3QaHC55b3JraWUudjEuQnJvYWRjYXN0UmVzcG9uc2UiAEJFChFkZXYueW9ya2llLmFwaS52MVABWi5naXRodWIuY29tL3lvcmtpZS10ZWFtL3lvcmtpZS9hcGkveW9ya2llL3YxO3YxYgZwcm90bzM", [file_yorkie_v1_resources]);
5871
5878
  const YorkieService = /* @__PURE__ */ serviceDesc(file_yorkie_v1_yorkie, 0);
5872
5879
  const file_google_rpc_error_details = /* @__PURE__ */ fileDesc("Ch5nb29nbGUvcnBjL2Vycm9yX2RldGFpbHMucHJvdG8SCmdvb2dsZS5ycGMikwEKCUVycm9ySW5mbxIOCgZyZWFzb24YASABKAkSDgoGZG9tYWluGAIgASgJEjUKCG1ldGFkYXRhGAMgAygLMiMuZ29vZ2xlLnJwYy5FcnJvckluZm8uTWV0YWRhdGFFbnRyeRovCg1NZXRhZGF0YUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiOwoJUmV0cnlJbmZvEi4KC3JldHJ5X2RlbGF5GAEgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIjIKCURlYnVnSW5mbxIVCg1zdGFja19lbnRyaWVzGAEgAygJEg4KBmRldGFpbBgCIAEoCSKPAwoMUXVvdGFGYWlsdXJlEjYKCnZpb2xhdGlvbnMYASADKAsyIi5nb29nbGUucnBjLlF1b3RhRmFpbHVyZS5WaW9sYXRpb24axgIKCVZpb2xhdGlvbhIPCgdzdWJqZWN0GAEgASgJEhMKC2Rlc2NyaXB0aW9uGAIgASgJEhMKC2FwaV9zZXJ2aWNlGAMgASgJEhQKDHF1b3RhX21ldHJpYxgEIAEoCRIQCghxdW90YV9pZBgFIAEoCRJRChBxdW90YV9kaW1lbnNpb25zGAYgAygLMjcuZ29vZ2xlLnJwYy5RdW90YUZhaWx1cmUuVmlvbGF0aW9uLlF1b3RhRGltZW5zaW9uc0VudHJ5EhMKC3F1b3RhX3ZhbHVlGAcgASgDEh8KEmZ1dHVyZV9xdW90YV92YWx1ZRgIIAEoA0gAiAEBGjYKFFF1b3RhRGltZW5zaW9uc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAFCFQoTX2Z1dHVyZV9xdW90YV92YWx1ZSKVAQoTUHJlY29uZGl0aW9uRmFpbHVyZRI9Cgp2aW9sYXRpb25zGAEgAygLMikuZ29vZ2xlLnJwYy5QcmVjb25kaXRpb25GYWlsdXJlLlZpb2xhdGlvbho/CglWaW9sYXRpb24SDAoEdHlwZRgBIAEoCRIPCgdzdWJqZWN0GAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJIswBCgpCYWRSZXF1ZXN0Ej8KEGZpZWxkX3Zpb2xhdGlvbnMYASADKAsyJS5nb29nbGUucnBjLkJhZFJlcXVlc3QuRmllbGRWaW9sYXRpb24afQoORmllbGRWaW9sYXRpb24SDQoFZmllbGQYASABKAkSEwoLZGVzY3JpcHRpb24YAiABKAkSDgoGcmVhc29uGAMgASgJEjcKEWxvY2FsaXplZF9tZXNzYWdlGAQgASgLMhwuZ29vZ2xlLnJwYy5Mb2NhbGl6ZWRNZXNzYWdlIjcKC1JlcXVlc3RJbmZvEhIKCnJlcXVlc3RfaWQYASABKAkSFAoMc2VydmluZ19kYXRhGAIgASgJImAKDFJlc291cmNlSW5mbxIVCg1yZXNvdXJjZV90eXBlGAEgASgJEhUKDXJlc291cmNlX25hbWUYAiABKAkSDQoFb3duZXIYAyABKAkSEwoLZGVzY3JpcHRpb24YBCABKAkiVgoESGVscBIkCgVsaW5rcxgBIAMoCzIVLmdvb2dsZS5ycGMuSGVscC5MaW5rGigKBExpbmsSEwoLZGVzY3JpcHRpb24YASABKAkSCwoDdXJsGAIgASgJIjMKEExvY2FsaXplZE1lc3NhZ2USDgoGbG9jYWxlGAEgASgJEg8KB21lc3NhZ2UYAiABKAlCbAoOY29tLmdvb2dsZS5ycGNCEUVycm9yRGV0YWlsc1Byb3RvUAFaP2dvb2dsZS5nb2xhbmcub3JnL2dlbnByb3RvL2dvb2dsZWFwaXMvcnBjL2VycmRldGFpbHM7ZXJyZGV0YWlsc6ICA1JQQ2IGcHJvdG8z", [file_google_protobuf_duration]);
5873
5880
  const ErrorInfoSchema = /* @__PURE__ */ messageDesc(file_google_rpc_error_details, 0);
@@ -9686,10 +9693,20 @@ class RGATreeSplit {
9686
9693
  head;
9687
9694
  treeByIndex;
9688
9695
  treeByID;
9696
+ /**
9697
+ * `pendingGCPairs` buffers GC pairs for nodes that were created
9698
+ * already-tombstoned by splitting a removed node. Such pieces inherit
9699
+ * `removedAt` without ever passing through `remove()`, so they would
9700
+ * otherwise never be registered for GC. Callers that split nodes
9701
+ * (`edit`, `CRDTText.setStyle`, `CRDTText.removeStyle`) drain this
9702
+ * buffer into their returned GC pairs.
9703
+ */
9704
+ pendingGCPairs;
9689
9705
  constructor() {
9690
9706
  this.head = RGATreeSplitNode.create(InitialRGATreeSplitNodeID);
9691
9707
  this.treeByIndex = new SplayTree();
9692
9708
  this.treeByID = new LLRBTree(RGATreeSplitNode.createComparator());
9709
+ this.pendingGCPairs = [];
9693
9710
  this.treeByIndex.insert(this.head);
9694
9711
  this.treeByID.put(this.head.getID(), this.head);
9695
9712
  }
@@ -9722,7 +9739,7 @@ class RGATreeSplit {
9722
9739
  );
9723
9740
  addDataSizes(diff, diffTo, diffFrom);
9724
9741
  const nodesToDelete = this.findBetween(fromRight, toRight);
9725
- const [changes, removedNodes] = this.deleteNodes(
9742
+ const [changes, removedNodes, alreadyRemovedIDs] = this.deleteNodes(
9726
9743
  nodesToDelete,
9727
9744
  editedAt,
9728
9745
  versionVector
@@ -9753,11 +9770,285 @@ class RGATreeSplit {
9753
9770
  }
9754
9771
  const pairs = [];
9755
9772
  const removedValues = [];
9756
- for (const [, removedNode] of removedNodes) {
9757
- pairs.push({ parent: this, child: removedNode });
9773
+ const removedSpans = [];
9774
+ for (const [id, removedNode] of removedNodes) {
9775
+ if (!alreadyRemovedIDs.has(id)) {
9776
+ pairs.push({ parent: this, child: removedNode });
9777
+ }
9758
9778
  removedValues.push(removedNode.getValue());
9779
+ removedSpans.push({
9780
+ createdAt: removedNode.getCreatedAt(),
9781
+ start: removedNode.getID().getOffset(),
9782
+ end: removedNode.getID().getOffset() + removedNode.getContentLength(),
9783
+ value: removedNode.getValue().substring(0)
9784
+ });
9785
+ }
9786
+ pairs.push(...this.drainPendingGCPairs());
9787
+ return [caretPos, pairs, diff, changes, removedValues, removedSpans];
9788
+ }
9789
+ /**
9790
+ * `restore` re-establishes the characters described by `spans` under
9791
+ * their ORIGINAL identities. For each span, per overlapping region:
9792
+ * - live piece exists → skip (idempotent; another undo restored it)
9793
+ * - tombstoned piece exists → clear removedAt (un-tombstone)
9794
+ * - no piece exists (GC'd) → recreate a node with the original ID
9795
+ *
9796
+ * Returns [untombstonedNodes, recreatedNodes, changes, liveDiff,
9797
+ * pendingGCPairs]. `changes` describes the revived content as insertions
9798
+ * (ascending index) so editor bindings and remote sync can be driven
9799
+ * the same way as a normal edit.
9800
+ *
9801
+ * The caller must, in order: (1) register every pair in `pendingGCPairs`
9802
+ * — these are fragments `splitNode` buffered while isolating a target
9803
+ * range out of a larger tombstoned piece (see `drainPendingGCPairs`);
9804
+ * (2) unregister GC pairs for `untombstonedNodes`. Registering first is
9805
+ * required for `untombstonedNodes` entries whose node was itself one of
9806
+ * those split-born fragments (a target isolated from the interior of a
9807
+ * tombstone) — such a node was never registered under its own id, so
9808
+ * step (1) creates the entry that step (2) then correctly walks from gc
9809
+ * back to live; entries that remain tombstoned (siblings of the
9810
+ * restored target) simply stay registered. Finally, `root.acc(liveDiff)`
9811
+ * accounts the size of any nodes recreated from scratch (the GC'd-away
9812
+ * case), which `splitNode`'s buffering does not cover.
9813
+ */
9814
+ restore(spans, executedAt, fallbackAnchor) {
9815
+ const untombstoned = [];
9816
+ const recreated = [];
9817
+ const liveDiff = { data: 0, meta: 0 };
9818
+ for (const span of spans) {
9819
+ const pieces = this.findPiecesOverlapping(
9820
+ span.createdAt,
9821
+ span.start,
9822
+ span.end
9823
+ );
9824
+ let cursor = span.start;
9825
+ let pieceIdx = 0;
9826
+ while (cursor < span.end) {
9827
+ const piece = pieces[pieceIdx];
9828
+ const pieceStart = piece ? piece.getID().getOffset() : Infinity;
9829
+ const pieceEnd = piece ? pieceStart + piece.getContentLength() : Infinity;
9830
+ if (piece && pieceStart <= cursor) {
9831
+ const overlapEnd = Math.min(pieceEnd, span.end);
9832
+ if (piece.isRemoved()) {
9833
+ const [target] = this.isolateRange(piece, cursor, overlapEnd);
9834
+ target.setRemovedAt(void 0);
9835
+ this.treeByIndex.splayNode(target);
9836
+ untombstoned.push(target);
9837
+ }
9838
+ cursor = overlapEnd;
9839
+ if (overlapEnd >= pieceEnd) {
9840
+ pieceIdx++;
9841
+ }
9842
+ } else {
9843
+ const gapEnd = Math.min(pieceStart, span.end);
9844
+ const value = span.value.substring(
9845
+ cursor - span.start,
9846
+ gapEnd - span.start
9847
+ );
9848
+ const newNode = RGATreeSplitNode.create(
9849
+ RGATreeSplitNodeID.of(span.createdAt, cursor),
9850
+ value
9851
+ );
9852
+ addDataSizes(liveDiff, newNode.getDataSize());
9853
+ const prev = this.findRestoreAnchor(
9854
+ span.createdAt,
9855
+ cursor,
9856
+ gapEnd,
9857
+ executedAt,
9858
+ fallbackAnchor
9859
+ );
9860
+ this.insertAfter(prev, newNode);
9861
+ recreated.push(newNode);
9862
+ cursor = gapEnd;
9863
+ }
9864
+ }
9865
+ }
9866
+ const pendingGCPairs = this.drainPendingGCPairs();
9867
+ const changes = [];
9868
+ for (const node of [...untombstoned, ...recreated]) {
9869
+ const [from] = this.findIndexesFromRange(node.createPosRange());
9870
+ changes.push({
9871
+ actor: executedAt.getActorID(),
9872
+ from,
9873
+ to: from,
9874
+ value: node.getValue()
9875
+ });
9876
+ }
9877
+ changes.sort((a, b) => a.from - b.from);
9878
+ return [untombstoned, recreated, changes, liveDiff, pendingGCPairs];
9879
+ }
9880
+ /**
9881
+ * `retombstone` re-deletes the characters described by `spans` (redo of
9882
+ * an identity-preserving undo). Only live pieces are affected; already
9883
+ * removed or purged regions are skipped (idempotent).
9884
+ *
9885
+ * Returns [pairs, changes, diff]: GCPairs for the newly tombstoned
9886
+ * nodes, the removed regions as deletions so editor bindings and remote
9887
+ * sync can be driven the same way as a normal edit, and the
9888
+ * metadata-size overhead from splitting the (live) pieces to isolate the
9889
+ * target range. The caller must `root.acc(diff)` before registering
9890
+ * `pairs`, mirroring how a normal edit's boundary splits are accounted
9891
+ * before its resulting tombstones are registered. Indices are captured
9892
+ * before each removal, so applying them in emission order stays
9893
+ * consistent.
9894
+ */
9895
+ retombstone(spans, executedAt) {
9896
+ const pairs = [];
9897
+ const changes = [];
9898
+ const diff = { data: 0, meta: 0 };
9899
+ for (const span of spans) {
9900
+ const pieces = this.findPiecesOverlapping(
9901
+ span.createdAt,
9902
+ span.start,
9903
+ span.end
9904
+ );
9905
+ for (const piece of pieces) {
9906
+ if (piece.isRemoved()) {
9907
+ continue;
9908
+ }
9909
+ const pieceStart = piece.getID().getOffset();
9910
+ const pieceEnd = pieceStart + piece.getContentLength();
9911
+ const [target, splitDiff] = this.isolateRange(
9912
+ piece,
9913
+ Math.max(pieceStart, span.start),
9914
+ Math.min(pieceEnd, span.end)
9915
+ );
9916
+ addDataSizes(diff, splitDiff);
9917
+ const [from, to] = this.findIndexesFromRange(target.createPosRange());
9918
+ target.remove(executedAt);
9919
+ this.treeByIndex.splayNode(target);
9920
+ pairs.push({ parent: this, child: target });
9921
+ if (from < to) {
9922
+ changes.push({ actor: executedAt.getActorID(), from, to });
9923
+ }
9924
+ }
9925
+ }
9926
+ pairs.push(...this.drainPendingGCPairs());
9927
+ return [pairs, changes, diff];
9928
+ }
9929
+ /**
9930
+ * `findPiecesOverlapping` collects existing nodes (live or tombstoned)
9931
+ * belonging to the insertion `createdAt` that overlap the absolute-offset
9932
+ * interval [start, end), in ascending offset order. Works by descending
9933
+ * floorEntry probes over treeByID.
9934
+ */
9935
+ findPiecesOverlapping(createdAt, start, end) {
9936
+ const pieces = [];
9937
+ let probe = end - 1;
9938
+ while (probe >= 0) {
9939
+ const key = RGATreeSplitNodeID.of(createdAt, probe);
9940
+ const entry = this.treeByID.floorEntry(key);
9941
+ if (!entry || !entry.key.hasSameCreatedAt(key)) {
9942
+ break;
9943
+ }
9944
+ const node = entry.value;
9945
+ const nodeStart = node.getID().getOffset();
9946
+ const nodeEnd = nodeStart + node.getContentLength();
9947
+ if (nodeEnd <= start) {
9948
+ break;
9949
+ }
9950
+ if (nodeStart < end && nodeEnd > start) {
9951
+ pieces.push(node);
9952
+ }
9953
+ if (nodeStart <= start) {
9954
+ break;
9955
+ }
9956
+ probe = nodeStart - 1;
9957
+ }
9958
+ return pieces.reverse();
9959
+ }
9960
+ /**
9961
+ * `findPieceCovering` returns the node of insertion `createdAt` whose
9962
+ * absolute-offset range covers `offset`, if present.
9963
+ */
9964
+ findPieceCovering(createdAt, offset) {
9965
+ const key = RGATreeSplitNodeID.of(createdAt, offset);
9966
+ const entry = this.treeByID.floorEntry(key);
9967
+ if (!entry || !entry.key.hasSameCreatedAt(key)) {
9968
+ return;
9969
+ }
9970
+ const node = entry.value;
9971
+ const nodeStart = node.getID().getOffset();
9972
+ const nodeEnd = nodeStart + node.getContentLength();
9973
+ if (nodeStart <= offset && offset < nodeEnd) {
9974
+ return node;
9975
+ }
9976
+ return;
9977
+ }
9978
+ /**
9979
+ * `findRestoreAnchor` returns the physical node to insert a recreated
9980
+ * fragment [gapStart, gapEnd) of insertion `createdAt` AFTER.
9981
+ *
9982
+ * Resolution ladder (all rules key on op-carried data + ID lookups only):
9983
+ * (a) a piece covering gapEnd exists → directly before it
9984
+ * (originally-adjacent successor; exact original slot)
9985
+ * (b) nearest surviving piece of the same insertion left of gapStart
9986
+ * → directly after it
9987
+ * (c) rightmost surviving piece of the same insertion (must be right
9988
+ * of the gap) → directly before it
9989
+ * (d) the operation's fallback anchor (refined) — same exposure as the
9990
+ * current implementation's fromPos; see design-doc caveat
9991
+ * (e) head (deterministic last resort)
9992
+ */
9993
+ findRestoreAnchor(createdAt, gapStart, gapEnd, executedAt, fallbackAnchor) {
9994
+ const succ = this.findPieceCovering(createdAt, gapEnd);
9995
+ if (succ) {
9996
+ return succ.getPrev();
9997
+ }
9998
+ if (gapStart > 0) {
9999
+ const key = RGATreeSplitNodeID.of(createdAt, gapStart - 1);
10000
+ const entry = this.treeByID.floorEntry(key);
10001
+ if (entry && entry.key.hasSameCreatedAt(key)) {
10002
+ return entry.value;
10003
+ }
10004
+ }
10005
+ const rightmostKey = RGATreeSplitNodeID.of(
10006
+ createdAt,
10007
+ Number.MAX_SAFE_INTEGER
10008
+ );
10009
+ const rightmost = this.treeByID.floorEntry(rightmostKey);
10010
+ if (rightmost && rightmost.key.hasSameCreatedAt(rightmostKey) && rightmost.value.getID().getOffset() >= gapEnd) {
10011
+ return rightmost.value.getPrev();
10012
+ }
10013
+ if (fallbackAnchor) {
10014
+ try {
10015
+ const refined = this.refinePos(fallbackAnchor);
10016
+ const [left] = this.findNodeWithSplit(refined, executedAt);
10017
+ return left;
10018
+ } catch {
10019
+ }
9759
10020
  }
9760
- return [caretPos, pairs, diff, changes, removedValues];
10021
+ return this.head;
10022
+ }
10023
+ /**
10024
+ * `isolateRange` splits `piece` so that a node exactly covering the
10025
+ * absolute-offset interval [from, to) exists, and returns it along with
10026
+ * the net metadata-size overhead the split(s) introduced.
10027
+ *
10028
+ * When `piece` is live, this overhead is a normal live-bucket cost (same
10029
+ * as any other boundary split) and the caller should `root.acc` it.
10030
+ * When `piece` is tombstoned, `splitNode` itself buffers the overhead of
10031
+ * any born-removed fragment via `pendingGCPairs` (see `drainPendingGCPairs`),
10032
+ * so the returned diff is zero in that case — the caller must still
10033
+ * drain and register those pairs.
10034
+ *
10035
+ * Requires: pieceStart <= from < to <= pieceEnd.
10036
+ */
10037
+ isolateRange(piece, from, to) {
10038
+ const diff = { data: 0, meta: 0 };
10039
+ let node = piece;
10040
+ const nodeStart = node.getID().getOffset();
10041
+ if (from > nodeStart) {
10042
+ const [right, splitDiff] = this.splitNode(node, from - nodeStart);
10043
+ addDataSizes(diff, splitDiff);
10044
+ node = right;
10045
+ }
10046
+ const newStart = node.getID().getOffset();
10047
+ if (to < newStart + node.getContentLength()) {
10048
+ const [, splitDiff] = this.splitNode(node, to - newStart);
10049
+ addDataSizes(diff, splitDiff);
10050
+ }
10051
+ return [node, diff];
9761
10052
  }
9762
10053
  /**
9763
10054
  * `indexToPos` finds RGATreeSplitPos of given offset.
@@ -10027,11 +10318,28 @@ class RGATreeSplit {
10027
10318
  splitNode.setInsPrev(node);
10028
10319
  addDataSizes(diff, node.getDataSize(), splitNode.getDataSize());
10029
10320
  subDataSize(diff, prvSize);
10321
+ if (splitNode.isRemoved()) {
10322
+ this.pendingGCPairs.push({
10323
+ parent: this,
10324
+ child: splitNode,
10325
+ gcOnlySize: diff
10326
+ });
10327
+ return [splitNode, { data: 0, meta: 0 }];
10328
+ }
10030
10329
  return [splitNode, diff];
10031
10330
  }
10331
+ /**
10332
+ * `drainPendingGCPairs` returns the GC pairs buffered for born-tombstoned
10333
+ * split pieces and clears the buffer.
10334
+ */
10335
+ drainPendingGCPairs() {
10336
+ const pairs = this.pendingGCPairs;
10337
+ this.pendingGCPairs = [];
10338
+ return pairs;
10339
+ }
10032
10340
  deleteNodes(candidates, editedAt, vector) {
10033
10341
  if (!candidates.length) {
10034
- return [[], /* @__PURE__ */ new Map()];
10342
+ return [[], /* @__PURE__ */ new Map(), /* @__PURE__ */ new Set()];
10035
10343
  }
10036
10344
  const isLocal = vector === void 0 || vector.size() === 0;
10037
10345
  const nodesToRemove = [];
@@ -10066,12 +10374,17 @@ class RGATreeSplit {
10066
10374
  nodesToKeep.push(rightEdge);
10067
10375
  const changes = this.makeChanges(nodesToKeep, editedAt);
10068
10376
  const removedNodes = /* @__PURE__ */ new Map();
10377
+ const alreadyRemovedIDs = /* @__PURE__ */ new Set();
10069
10378
  for (const node of nodesToRemove) {
10070
- removedNodes.set(node.getID().toIDString(), node);
10379
+ const id = node.getID().toIDString();
10380
+ if (node.isRemoved()) {
10381
+ alreadyRemovedIDs.add(id);
10382
+ }
10383
+ removedNodes.set(id, node);
10071
10384
  node.remove(editedAt);
10072
10385
  }
10073
10386
  this.deleteIndexNodes(nodesToKeep);
10074
- return [changes, removedNodes];
10387
+ return [changes, removedNodes, alreadyRemovedIDs];
10075
10388
  }
10076
10389
  /**
10077
10390
  * `findEdgesOfCandidates` finds the edges outside `candidates`,
@@ -10543,7 +10856,7 @@ class CRDTText extends CRDTElement {
10543
10856
  crdtTextValue.setAttr(k, v, editedAt);
10544
10857
  }
10545
10858
  }
10546
- const [caretPos, pairs, diff, valueChanges, removedValues] = this.rgaTreeSplit.edit(range, editedAt, crdtTextValue, versionVector);
10859
+ const [caretPos, pairs, diff, valueChanges, removedValues, removedSpans] = this.rgaTreeSplit.edit(range, editedAt, crdtTextValue, versionVector);
10547
10860
  const changes = valueChanges.map((change) => ({
10548
10861
  ...change,
10549
10862
  value: change.value ? {
@@ -10556,7 +10869,56 @@ class CRDTText extends CRDTElement {
10556
10869
  type: "content"
10557
10870
  /* Content */
10558
10871
  }));
10559
- return [changes, pairs, diff, [caretPos, caretPos], removedValues];
10872
+ return [
10873
+ changes,
10874
+ pairs,
10875
+ diff,
10876
+ [caretPos, caretPos],
10877
+ removedValues,
10878
+ removedSpans
10879
+ ];
10880
+ }
10881
+ /**
10882
+ * `restore` re-establishes removed characters under their original
10883
+ * identities (identity-preserving undo of a deletion).
10884
+ */
10885
+ restore(spans, executedAt, fallbackAnchor) {
10886
+ const [untombstoned, recreated, valueChanges, liveDiff, pendingGCPairs] = this.rgaTreeSplit.restore(spans, executedAt, fallbackAnchor);
10887
+ return [
10888
+ untombstoned,
10889
+ recreated,
10890
+ this.toTextChanges(valueChanges),
10891
+ liveDiff,
10892
+ pendingGCPairs
10893
+ ];
10894
+ }
10895
+ /**
10896
+ * `retombstone` re-deletes previously restored characters (redo).
10897
+ */
10898
+ retombstone(spans, executedAt) {
10899
+ const [pairs, valueChanges, diff] = this.rgaTreeSplit.retombstone(
10900
+ spans,
10901
+ executedAt
10902
+ );
10903
+ return [pairs, this.toTextChanges(valueChanges), diff];
10904
+ }
10905
+ /**
10906
+ * `toTextChanges` wraps raw RGATreeSplit value changes into `TextChange`s,
10907
+ * mirroring the mapping used by `edit`.
10908
+ */
10909
+ toTextChanges(valueChanges) {
10910
+ return valueChanges.map((change) => ({
10911
+ ...change,
10912
+ value: change.value ? {
10913
+ attributes: parseObjectValues(change.value.getAttributes()),
10914
+ content: change.value.getContent()
10915
+ } : {
10916
+ attributes: void 0,
10917
+ content: ""
10918
+ },
10919
+ type: "content"
10920
+ /* Content */
10921
+ }));
10560
10922
  }
10561
10923
  /**
10562
10924
  * `setStyle` applies the style of the given range.
@@ -10633,6 +10995,7 @@ class CRDTText extends CRDTElement {
10633
10995
  }
10634
10996
  }
10635
10997
  }
10998
+ pairs.push(...this.rgaTreeSplit.drainPendingGCPairs());
10636
10999
  return [pairs, diff, changes, prevAttributes, attributesToRemove];
10637
11000
  }
10638
11001
  /**
@@ -10703,6 +11066,7 @@ class CRDTText extends CRDTElement {
10703
11066
  }
10704
11067
  }
10705
11068
  }
11069
+ pairs.push(...this.rgaTreeSplit.drainPendingGCPairs());
10706
11070
  return [pairs, diff, changes, prevAttributes];
10707
11071
  }
10708
11072
  /**
@@ -10857,10 +11221,16 @@ class CRDTText extends CRDTElement {
10857
11221
  const pairs = [];
10858
11222
  for (const node of this.rgaTreeSplit) {
10859
11223
  if (node.getRemovedAt()) {
10860
- pairs.push({ parent: this.rgaTreeSplit, child: node });
11224
+ pairs.push({
11225
+ parent: this.rgaTreeSplit,
11226
+ child: node,
11227
+ gcOnlySize: node.getDataSize()
11228
+ });
10861
11229
  }
10862
11230
  for (const p of node.getValue().getGCPairs()) {
10863
- pairs.push(p);
11231
+ pairs.push(
11232
+ node.getRemovedAt() ? { ...p, gcOnlySize: p.child.getDataSize() } : p
11233
+ );
10864
11234
  }
10865
11235
  }
10866
11236
  return pairs;
@@ -10872,18 +11242,33 @@ class EditOperation extends Operation {
10872
11242
  content;
10873
11243
  attributes;
10874
11244
  isUndoOp;
10875
- constructor(parentCreatedAt, fromPos, toPos, content, attributes, executedAt, isUndoOp) {
11245
+ restoreSpans;
11246
+ restoreMode;
11247
+ // `retombstoneSpans` is the companion span set for an identity-preserving
11248
+ // reverse op. `restoreSpans` describes content the reversed edit removed;
11249
+ // `retombstoneSpans` describes content the reversed edit inserted (non-empty
11250
+ // only for the reverse of a replace). `restoreMode` picks the direction:
11251
+ // 'restore' revives restoreSpans and re-removes retombstoneSpans; a
11252
+ // 'retombstone' op (the redo) does the opposite. Reversing an edit that both
11253
+ // inserts and deletes as two identity operations — rather than
11254
+ // copy-reinserting the deleted text as a fresh node — keeps a later revived
11255
+ // neighbour in its original relative order.
11256
+ retombstoneSpans;
11257
+ constructor(parentCreatedAt, fromPos, toPos, content, attributes, executedAt, isUndoOp, restoreSpans, restoreMode, retombstoneSpans) {
10876
11258
  super(parentCreatedAt, executedAt);
10877
11259
  this.fromPos = fromPos;
10878
11260
  this.toPos = toPos;
10879
11261
  this.content = content;
10880
11262
  this.attributes = attributes;
10881
11263
  this.isUndoOp = isUndoOp;
11264
+ this.restoreSpans = restoreSpans;
11265
+ this.restoreMode = restoreMode;
11266
+ this.retombstoneSpans = retombstoneSpans;
10882
11267
  }
10883
11268
  /**
10884
11269
  * `create` creates a new instance of EditOperation.
10885
11270
  */
10886
- static create(parentCreatedAt, fromPos, toPos, content, attributes, executedAt, isUndoOp) {
11271
+ static create(parentCreatedAt, fromPos, toPos, content, attributes, executedAt, isUndoOp, restoreSpans, restoreMode, retombstoneSpans) {
10887
11272
  return new EditOperation(
10888
11273
  parentCreatedAt,
10889
11274
  fromPos,
@@ -10891,7 +11276,10 @@ class EditOperation extends Operation {
10891
11276
  content,
10892
11277
  attributes,
10893
11278
  executedAt,
10894
- isUndoOp
11279
+ isUndoOp,
11280
+ restoreSpans,
11281
+ restoreMode,
11282
+ retombstoneSpans
10895
11283
  );
10896
11284
  }
10897
11285
  /**
@@ -10912,11 +11300,71 @@ class EditOperation extends Operation {
10912
11300
  );
10913
11301
  }
10914
11302
  const text = parentObject;
11303
+ if (this.restoreSpans || this.retombstoneSpans) {
11304
+ const isRetombstone = this.restoreMode === "retombstone";
11305
+ const toRestore = (isRetombstone ? this.retombstoneSpans : this.restoreSpans) ?? [];
11306
+ const toRetombstone = (isRetombstone ? this.restoreSpans : this.retombstoneSpans) ?? [];
11307
+ const opInfos = [];
11308
+ const totalDiff = { data: 0, meta: 0 };
11309
+ const toOpInfo = (c) => ({
11310
+ type: "edit",
11311
+ from: c.from,
11312
+ to: c.to,
11313
+ value: c.value,
11314
+ path: root.createPath(this.getParentCreatedAt())
11315
+ });
11316
+ if (toRetombstone.length) {
11317
+ const [pairs2, changes2, diff2] = text.retombstone(
11318
+ toRetombstone,
11319
+ this.getExecutedAt()
11320
+ );
11321
+ addDataSizes(totalDiff, diff2);
11322
+ for (const pair of pairs2) {
11323
+ root.registerGCPair(pair);
11324
+ }
11325
+ for (const c of changes2) {
11326
+ opInfos.push(toOpInfo(c));
11327
+ }
11328
+ }
11329
+ if (toRestore.length) {
11330
+ const [untombstoned, , changes2, liveDiff, pendingGCPairs] = text.restore(toRestore, this.getExecutedAt(), this.fromPos);
11331
+ for (const pair of pendingGCPairs) {
11332
+ root.registerGCPair(pair);
11333
+ }
11334
+ for (const node of untombstoned) {
11335
+ root.unregisterGCPair({
11336
+ parent: text.getRGATreeSplit(),
11337
+ child: node
11338
+ });
11339
+ }
11340
+ addDataSizes(totalDiff, liveDiff);
11341
+ for (const c of changes2) {
11342
+ opInfos.push(toOpInfo(c));
11343
+ }
11344
+ }
11345
+ root.acc(totalDiff);
11346
+ return {
11347
+ opInfos,
11348
+ // Reverse keeps the same span sets and flips the direction.
11349
+ reverseOp: EditOperation.create(
11350
+ this.getParentCreatedAt(),
11351
+ this.fromPos,
11352
+ this.toPos,
11353
+ "",
11354
+ /* @__PURE__ */ new Map(),
11355
+ void 0,
11356
+ true,
11357
+ this.restoreSpans,
11358
+ isRetombstone ? "restore" : "retombstone",
11359
+ this.retombstoneSpans
11360
+ )
11361
+ };
11362
+ }
10915
11363
  if (this.isUndoOp) {
10916
11364
  this.fromPos = text.refinePos(this.fromPos);
10917
11365
  this.toPos = text.refinePos(this.toPos);
10918
11366
  }
10919
- const [changes, pairs, diff, , removedValues] = text.edit(
11367
+ const [changes, pairs, diff, , removedValues, removedSpans] = text.edit(
10920
11368
  [this.fromPos, this.toPos],
10921
11369
  this.content,
10922
11370
  this.getExecutedAt(),
@@ -10925,7 +11373,8 @@ class EditOperation extends Operation {
10925
11373
  );
10926
11374
  const reverseOp = this.toReverseOperation(
10927
11375
  removedValues,
10928
- text.normalizePos(this.fromPos)
11376
+ text.normalizePos(this.fromPos),
11377
+ removedSpans
10929
11378
  );
10930
11379
  root.acc(diff);
10931
11380
  for (const pair of pairs) {
@@ -10944,7 +11393,33 @@ class EditOperation extends Operation {
10944
11393
  reverseOp
10945
11394
  };
10946
11395
  }
10947
- toReverseOperation(removedValues, fromPos) {
11396
+ toReverseOperation(removedValues, fromPos, removedSpans) {
11397
+ if (removedSpans.length || this.content?.length) {
11398
+ let insertedSpans;
11399
+ if (this.content?.length) {
11400
+ const value = CRDTTextValue.create(this.content);
11401
+ insertedSpans = [
11402
+ {
11403
+ createdAt: this.getExecutedAt(),
11404
+ start: 0,
11405
+ end: value.length,
11406
+ value
11407
+ }
11408
+ ];
11409
+ }
11410
+ return EditOperation.create(
11411
+ this.getParentCreatedAt(),
11412
+ fromPos,
11413
+ fromPos,
11414
+ "",
11415
+ /* @__PURE__ */ new Map(),
11416
+ void 0,
11417
+ true,
11418
+ removedSpans.length ? removedSpans : void 0,
11419
+ "restore",
11420
+ insertedSpans
11421
+ );
11422
+ }
10948
11423
  const content = removedValues?.length ? removedValues.map((v) => v.getContent()).join("") : "";
10949
11424
  let attrs;
10950
11425
  if (removedValues.length === 1) {
@@ -11082,6 +11557,26 @@ class EditOperation extends Operation {
11082
11557
  getAttributes() {
11083
11558
  return this.attributes || /* @__PURE__ */ new Map();
11084
11559
  }
11560
+ /**
11561
+ * `getRestoreSpans` returns the identity-preserving restore payload, if
11562
+ * this is a restore/retombstone operation.
11563
+ */
11564
+ getRestoreSpans() {
11565
+ return this.restoreSpans;
11566
+ }
11567
+ /**
11568
+ * `getRestoreMode` returns the identity-preserving mode of this Edit.
11569
+ */
11570
+ getRestoreMode() {
11571
+ return this.restoreMode;
11572
+ }
11573
+ /**
11574
+ * `getRetombstoneSpans` returns the companion span set (content the reversed
11575
+ * edit inserted) for an identity-preserving reverse op, if any.
11576
+ */
11577
+ getRetombstoneSpans() {
11578
+ return this.retombstoneSpans;
11579
+ }
11085
11580
  }
11086
11581
  class StyleOperation extends Operation {
11087
11582
  fromPos;
@@ -12382,6 +12877,10 @@ class CRDTTreeNode extends IndexTreeNode {
12382
12877
  }
12383
12878
  this.insNextID = split.id;
12384
12879
  tree.registerNode(split);
12880
+ if (split.removedAt) {
12881
+ tree.registerPendingGCPair(split, diff);
12882
+ return [split, { data: 0, meta: 0 }];
12883
+ }
12385
12884
  }
12386
12885
  return [split, diff];
12387
12886
  }
@@ -12479,7 +12978,11 @@ class CRDTTreeNode extends IndexTreeNode {
12479
12978
  }
12480
12979
  for (const node of this.attrs) {
12481
12980
  if (node.getRemovedAt()) {
12482
- pairs.push({ parent: this, child: node });
12981
+ pairs.push({
12982
+ parent: this,
12983
+ child: node,
12984
+ gcOnlySize: node.getDataSize()
12985
+ });
12483
12986
  }
12484
12987
  }
12485
12988
  return pairs;
@@ -12546,10 +13049,19 @@ function toTestTreeNode(node) {
12546
13049
  class CRDTTree extends CRDTElement {
12547
13050
  indexTree;
12548
13051
  nodeMapByID;
13052
+ /**
13053
+ * `pendingGCPairs` buffers GC pairs for nodes that were created
13054
+ * already-tombstoned by splitting a removed node. Such pieces inherit
13055
+ * `removedAt` without ever passing through `remove()`, so they would
13056
+ * otherwise never be registered for GC. `edit` and `style` drain this
13057
+ * buffer into their returned GC pairs.
13058
+ */
13059
+ pendingGCPairs;
12549
13060
  constructor(root, createdAt) {
12550
13061
  super(createdAt);
12551
13062
  this.indexTree = new IndexTree(root);
12552
13063
  this.nodeMapByID = new LLRBTree(CRDTTreeNodeID.createComparator());
13064
+ this.pendingGCPairs = [];
12553
13065
  this.indexTree.traverseAll((node) => {
12554
13066
  this.nodeMapByID.put(node.id, node);
12555
13067
  });
@@ -12651,6 +13163,25 @@ class CRDTTree extends CRDTElement {
12651
13163
  registerNode(node) {
12652
13164
  this.nodeMapByID.put(node.id, node);
12653
13165
  }
13166
+ /**
13167
+ * `registerPendingGCPair` buffers a GC pair for a node that was born
13168
+ * tombstoned (split off an already-removed node). The pair is picked up
13169
+ * by the next `edit` or `style` call via `drainPendingGCPairs`. `size`
13170
+ * is the net-new size created by the split; it is accounted to
13171
+ * docSize.gc at registration since the node was never live.
13172
+ */
13173
+ registerPendingGCPair(node, size) {
13174
+ this.pendingGCPairs.push({ parent: this, child: node, gcOnlySize: size });
13175
+ }
13176
+ /**
13177
+ * `drainPendingGCPairs` returns the buffered GC pairs and clears the
13178
+ * buffer.
13179
+ */
13180
+ drainPendingGCPairs() {
13181
+ const pairs = this.pendingGCPairs;
13182
+ this.pendingGCPairs = [];
13183
+ return pairs;
13184
+ }
12654
13185
  /**
12655
13186
  * `findNodesAndSplitText` finds `TreePos` of the given `CRDTTreeNodeID` and
12656
13187
  * splits nodes if the position is in the middle of a text node.
@@ -12837,6 +13368,7 @@ class CRDTTree extends CRDTElement {
12837
13368
  }
12838
13369
  }
12839
13370
  );
13371
+ pairs.push(...this.drainPendingGCPairs());
12840
13372
  return [pairs, changes, diff, prevAttributes, newAttrKeys];
12841
13373
  }
12842
13374
  /**
@@ -12940,6 +13472,7 @@ class CRDTTree extends CRDTElement {
12940
13472
  }
12941
13473
  }
12942
13474
  );
13475
+ pairs.push(...this.drainPendingGCPairs());
12943
13476
  return [pairs, changes, diff, prevAttributes];
12944
13477
  }
12945
13478
  /**
@@ -13103,6 +13636,9 @@ class CRDTTree extends CRDTElement {
13103
13636
  parent = left.parent;
13104
13637
  }
13105
13638
  }
13639
+ if (!parent.parent) {
13640
+ break;
13641
+ }
13106
13642
  parent.split(
13107
13643
  this,
13108
13644
  left !== parent ? parent.findOffset(left, true) + 1 : 0,
@@ -13162,6 +13698,7 @@ class CRDTTree extends CRDTElement {
13162
13698
  }
13163
13699
  }
13164
13700
  }
13701
+ pairs.push(...this.drainPendingGCPairs());
13165
13702
  return [
13166
13703
  changes,
13167
13704
  pairs,
@@ -13226,9 +13763,13 @@ class CRDTTree extends CRDTElement {
13226
13763
  */
13227
13764
  getGCPairs() {
13228
13765
  const pairs = [];
13229
- this.indexTree.traverse((node) => {
13766
+ this.indexTree.traverseAll((node) => {
13230
13767
  if (node.getRemovedAt()) {
13231
- pairs.push({ parent: this, child: node });
13768
+ pairs.push({
13769
+ parent: this,
13770
+ child: node,
13771
+ gcOnlySize: node.getDataSize()
13772
+ });
13232
13773
  }
13233
13774
  for (const p of node.getGCPairs()) {
13234
13775
  pairs.push(p);
@@ -15677,6 +16218,25 @@ function toOperation(operation) {
15677
16218
  pbAttributes[key] = value;
15678
16219
  }
15679
16220
  pbEditOperation.executedAt = toTimeTicket(editOperation.getExecutedAt());
16221
+ const toPbSpan = (span) => {
16222
+ const pbSpan = create(RestoreSpanSchema);
16223
+ pbSpan.createdAt = toTimeTicket(span.createdAt);
16224
+ pbSpan.start = span.start;
16225
+ pbSpan.end = span.end;
16226
+ pbSpan.content = span.value.getContent();
16227
+ const pbSpanAttrs = pbSpan.attributes;
16228
+ for (const [key, value] of Object.entries(span.value.getAttributes())) {
16229
+ pbSpanAttrs[key] = value;
16230
+ }
16231
+ return pbSpan;
16232
+ };
16233
+ const restoreSpans = editOperation.getRestoreSpans();
16234
+ const retombstoneSpans = editOperation.getRetombstoneSpans();
16235
+ if (restoreSpans && restoreSpans.length || retombstoneSpans && retombstoneSpans.length) {
16236
+ pbEditOperation.restoreSpans = (restoreSpans ?? []).map(toPbSpan);
16237
+ pbEditOperation.retombstoneSpans = (retombstoneSpans ?? []).map(toPbSpan);
16238
+ pbEditOperation.restoreMode = editOperation.getRestoreMode() === "retombstone" ? RestoreMode.RETOMBSTONE : RestoreMode.RESTORE;
16239
+ }
15680
16240
  pbOperation.body.case = "edit";
15681
16241
  pbOperation.body.value = pbEditOperation;
15682
16242
  } else if (operation instanceof StyleOperation) {
@@ -16336,13 +16896,38 @@ function fromOperation(pbOperation) {
16336
16896
  Object.entries(pbEditOperation.attributes).forEach(([key, value]) => {
16337
16897
  attributes.set(key, value);
16338
16898
  });
16899
+ const executedAt = fromTimeTicket(pbEditOperation.executedAt);
16900
+ const fromPbSpan = (pbSpan) => {
16901
+ const value = CRDTTextValue.create(pbSpan.content);
16902
+ for (const [key, attr] of Object.entries(pbSpan.attributes)) {
16903
+ value.setAttr(key, attr, executedAt);
16904
+ }
16905
+ return {
16906
+ createdAt: fromTimeTicket(pbSpan.createdAt),
16907
+ start: pbSpan.start,
16908
+ end: pbSpan.end,
16909
+ value
16910
+ };
16911
+ };
16912
+ let restoreSpans;
16913
+ let retombstoneSpans;
16914
+ let restoreMode;
16915
+ if (pbEditOperation.restoreSpans.length || pbEditOperation.retombstoneSpans.length) {
16916
+ restoreSpans = pbEditOperation.restoreSpans.map(fromPbSpan);
16917
+ retombstoneSpans = pbEditOperation.retombstoneSpans.map(fromPbSpan);
16918
+ restoreMode = pbEditOperation.restoreMode === RestoreMode.RETOMBSTONE ? "retombstone" : "restore";
16919
+ }
16339
16920
  return EditOperation.create(
16340
16921
  fromTimeTicket(pbEditOperation.parentCreatedAt),
16341
16922
  fromTextNodePos(pbEditOperation.from),
16342
16923
  fromTextNodePos(pbEditOperation.to),
16343
16924
  pbEditOperation.content,
16344
16925
  attributes,
16345
- fromTimeTicket(pbEditOperation.executedAt)
16926
+ executedAt,
16927
+ restoreMode ? true : void 0,
16928
+ restoreSpans,
16929
+ restoreMode,
16930
+ retombstoneSpans
16346
16931
  );
16347
16932
  } else if (pbOperation.body.case === "style") {
16348
16933
  const pbStyleOperation = pbOperation.body.value;
@@ -17025,6 +17610,25 @@ class ChangeContext {
17025
17610
  setPresenceChange(presenceChange) {
17026
17611
  this.presenceChange = presenceChange;
17027
17612
  }
17613
+ /**
17614
+ * `hasPresenceChange` returns whether a presence change was registered
17615
+ * during this context. Used by `Document.update` to detect a presence
17616
+ * emit when the document was attached with `disablePresence: true`.
17617
+ */
17618
+ hasPresenceChange() {
17619
+ return this.presenceChange !== void 0;
17620
+ }
17621
+ /**
17622
+ * `dropPresenceChange` clears any presence change registered during
17623
+ * this context. Used by `Document.update` to silently drop presence
17624
+ * emits on documents attached with `disablePresence: true`. After
17625
+ * dropping, the change carries only its operations (if any); when
17626
+ * the context was presence-only the resulting `hasChange()` returns
17627
+ * false and no `Change` is enqueued.
17628
+ */
17629
+ dropPresenceChange() {
17630
+ this.presenceChange = void 0;
17631
+ }
17028
17632
  /**
17029
17633
  * `setReversePresence` registers the previous presence to undo presence updates.
17030
17634
  */
@@ -17048,6 +17652,16 @@ class ChangeContext {
17048
17652
  }
17049
17653
  return reversePresence;
17050
17654
  }
17655
+ /**
17656
+ * `clearReversePresence` discards any reverse-presence keys recorded
17657
+ * during this context. Used by `Document.update` alongside
17658
+ * `dropPresenceChange` for documents attached with
17659
+ * `disablePresence: true`, so the dropped presence emit does not push
17660
+ * a no-op undo entry onto the history stack.
17661
+ */
17662
+ clearReversePresence() {
17663
+ this.reversePresenceKeys.clear();
17664
+ }
17051
17665
  /**
17052
17666
  * `issueTimeTicket` creates a time ticket to be used to create a new operation.
17053
17667
  */
@@ -18949,7 +19563,9 @@ class Tree {
18949
19563
  CRDTTreePos.fromStruct(range[0]),
18950
19564
  CRDTTreePos.fromStruct(range[1])
18951
19565
  ];
18952
- return this.tree.posRangeToIndexRange(posRange);
19566
+ const indexRange = this.tree.posRangeToIndexRange(posRange);
19567
+ this.registerPendingGCPairs();
19568
+ return indexRange;
18953
19569
  }
18954
19570
  /**
18955
19571
  * `posRangeToPathRange` converts the position range into the path range.
@@ -18965,7 +19581,23 @@ class Tree {
18965
19581
  CRDTTreePos.fromStruct(range[0]),
18966
19582
  CRDTTreePos.fromStruct(range[1])
18967
19583
  ];
18968
- return this.tree.posRangeToPathRange(posRange);
19584
+ const pathRange = this.tree.posRangeToPathRange(posRange);
19585
+ this.registerPendingGCPairs();
19586
+ return pathRange;
19587
+ }
19588
+ /**
19589
+ * `registerPendingGCPairs` registers with the root any GC pairs the tree
19590
+ * buffered while resolving a position. `posRangeToIndexRange` and
19591
+ * `posRangeToPathRange` split text nodes to locate a position; when the
19592
+ * position lands inside a tombstoned node the split produces a
19593
+ * born-removed piece. Unlike edit/style/removeStyle, these read-path
19594
+ * conversions emit no operation, so the buffered pairs would otherwise
19595
+ * never reach the root and the piece would leak (invisible to GC).
19596
+ */
19597
+ registerPendingGCPairs() {
19598
+ for (const pair of this.tree.drainPendingGCPairs()) {
19599
+ this.context.registerGCPair(pair);
19600
+ }
18969
19601
  }
18970
19602
  }
18971
19603
  function createJSON(context, target) {
@@ -19208,6 +19840,10 @@ class CRDTRoot {
19208
19840
  return;
19209
19841
  }
19210
19842
  this.gcPairMap.set(pair.child.toIDString(), pair);
19843
+ if (pair.gcOnlySize) {
19844
+ addDataSizes(this.docSize.gc, pair.gcOnlySize);
19845
+ return;
19846
+ }
19211
19847
  const size = this.gcPairMap.get(pair.child.toIDString()).child.getDataSize();
19212
19848
  addDataSizes(this.docSize.gc, size);
19213
19849
  subDataSize(this.docSize.live, size);
@@ -19215,6 +19851,28 @@ class CRDTRoot {
19215
19851
  this.docSize.live.meta += TimeTicketSize;
19216
19852
  }
19217
19853
  }
19854
+ /**
19855
+ * `unregisterGCPair` removes the given pair from the hash table. Called
19856
+ * when a tombstoned node is revived (un-tombstoned) by an
19857
+ * identity-preserving undo, so that a later re-registration (redo) is
19858
+ * not swallowed by the toggle in `registerGCPair`.
19859
+ *
19860
+ * NOTE: must be called AFTER the node's removedAt has been cleared, so
19861
+ * `getDataSize()` no longer includes the tombstone ticket.
19862
+ */
19863
+ unregisterGCPair(pair) {
19864
+ const registered = this.gcPairMap.get(pair.child.toIDString());
19865
+ if (!registered) {
19866
+ return;
19867
+ }
19868
+ this.gcPairMap.delete(pair.child.toIDString());
19869
+ const size = pair.child.getDataSize();
19870
+ subDataSize(this.docSize.gc, size);
19871
+ addDataSizes(this.docSize.live, size);
19872
+ if (!(pair.child instanceof RHTNode)) {
19873
+ this.docSize.gc.meta -= TimeTicketSize;
19874
+ }
19875
+ }
19218
19876
  /**
19219
19877
  * `getElementMapSize` returns the size of element map.
19220
19878
  */
@@ -19277,6 +19935,10 @@ class CRDTRoot {
19277
19935
  }
19278
19936
  for (const [, pair] of this.gcPairMap) {
19279
19937
  const removedAt = pair.child.getRemovedAt();
19938
+ if (!removedAt) {
19939
+ this.unregisterGCPair(pair);
19940
+ continue;
19941
+ }
19280
19942
  if (removedAt && minSyncedVersionVector?.afterOrEqual(removedAt)) {
19281
19943
  pair.parent.purge(pair.child);
19282
19944
  subDataSize(this.docSize.gc, pair.child.getDataSize());
@@ -20099,6 +20761,17 @@ class Document {
20099
20761
  // remote actors' version vectors into changeID, keeping each subsequent
20100
20762
  // local Change's VV at O(1) for high-fan-out Counter workloads.
20101
20763
  disableGC;
20764
+ // `disablePresence`, when true, declares that this document does not use
20765
+ // presence. The client sets it from the local option on construction and
20766
+ // overwrites it from the server-fixated value in the attach response. While
20767
+ // true, `Document.update`'s `presence.set` calls are silently dropped on
20768
+ // the way out (server enforcement is authoritative for the wire side).
20769
+ disablePresence;
20770
+ // `presenceDropWarned` ensures the silent-drop warning emitted by
20771
+ // `Document.update` for opt-in documents fires only once per document
20772
+ // lifetime. Otherwise long-lived counter-only documents would spam the
20773
+ // console on every well-meaning `presence.set` call.
20774
+ presenceDropWarned;
20102
20775
  /**
20103
20776
  * `history` is exposed to the user to manage undo/redo operations.
20104
20777
  */
@@ -20113,6 +20786,8 @@ class Document {
20113
20786
  this.checkpoint = InitialCheckpoint;
20114
20787
  this.localChanges = [];
20115
20788
  this.disableGC = false;
20789
+ this.disablePresence = !!opts?.disablePresence;
20790
+ this.presenceDropWarned = false;
20116
20791
  this.root = CRDTRoot.create();
20117
20792
  this.presences = /* @__PURE__ */ new Map();
20118
20793
  this.onlineClients = /* @__PURE__ */ new Set();
@@ -20160,6 +20835,16 @@ class Document {
20160
20835
  } finally {
20161
20836
  this.isUpdating = false;
20162
20837
  }
20838
+ if (this.disablePresence && ctx.hasPresenceChange()) {
20839
+ ctx.dropPresenceChange();
20840
+ ctx.clearReversePresence();
20841
+ if (!this.presenceDropWarned) {
20842
+ this.presenceDropWarned = true;
20843
+ logger.warn(
20844
+ `[Document] "${this.key}" was attached with disablePresence=true; presence updates from Document.update are silently dropped.`
20845
+ );
20846
+ }
20847
+ }
20163
20848
  const rules = this.getSchemaRules();
20164
20849
  if (!ctx.isPresenceOnlyChange() && rules.length) {
20165
20850
  const result = validateYorkieRuleset(this.clone?.root.getObject(), rules);
@@ -20529,6 +21214,24 @@ class Document {
20529
21214
  setDisableGC(disableGC) {
20530
21215
  this.disableGC = disableGC;
20531
21216
  }
21217
+ /**
21218
+ * `setDisablePresence` records the server-fixated presence-disabled state
21219
+ * of this document. The client calls this on attach (before
21220
+ * `applyChangePack`) so any subsequent `Document.update` invocation sees
21221
+ * the gating state already settled. Flipping the flag at runtime is
21222
+ * supported: the next `update` honours the new value.
21223
+ */
21224
+ setDisablePresence(disablePresence) {
21225
+ this.disablePresence = disablePresence;
21226
+ }
21227
+ /**
21228
+ * `isPresenceDisabled` returns the current presence-disabled state of
21229
+ * this document. Reflects the server-fixated value once attached;
21230
+ * before attach it reflects the local construction option.
21231
+ */
21232
+ isPresenceDisabled() {
21233
+ return this.disablePresence;
21234
+ }
20532
21235
  /**
20533
21236
  * `isEnableDevtools` returns whether devtools is enabled or not.
20534
21237
  */
@@ -21266,6 +21969,14 @@ class Attachment {
21266
21969
  * omit the response VersionVector. Documents only.
21267
21970
  */
21268
21971
  disableGC;
21972
+ /**
21973
+ * `disablePresence` mirrors the server-fixated value returned by the
21974
+ * attach response. `pushPullChanges` does **not** read this — the
21975
+ * `disable_presence` wire field is request-only (set on the first
21976
+ * attach, ignored thereafter on the server side). Carried here for
21977
+ * devtools / debugging visibility. Documents only.
21978
+ */
21979
+ disablePresence;
21269
21980
  /**
21270
21981
  * `unsubscribeLocalBroadcast` is set by `attachChannel` when it forwards
21271
21982
  * a Channel's `local-broadcast` events to the RPC client, and consumed
@@ -21281,7 +21992,7 @@ class Attachment {
21281
21992
  watchAbortController;
21282
21993
  syncPromise;
21283
21994
  _detaching = false;
21284
- constructor(reconnectStreamDelay, resource, resourceID = "", syncMode, pollInterval = 0, pollIntervalPinned = false, disableGC = false) {
21995
+ constructor(reconnectStreamDelay, resource, resourceID = "", syncMode, pollInterval = 0, pollIntervalPinned = false, disableGC = false, disablePresence = false) {
21285
21996
  this.reconnectStreamDelay = reconnectStreamDelay;
21286
21997
  this.resource = resource;
21287
21998
  this.resourceID = resourceID;
@@ -21291,6 +22002,7 @@ class Attachment {
21291
22002
  this.pollInterval = pollInterval;
21292
22003
  this.pollIntervalPinned = pollIntervalPinned;
21293
22004
  this.disableGC = disableGC;
22005
+ this.disablePresence = disablePresence;
21294
22006
  this.cancelled = false;
21295
22007
  }
21296
22008
  /**
@@ -21450,7 +22162,7 @@ function createAuthInterceptor(apiKey, token) {
21450
22162
  };
21451
22163
  }
21452
22164
  const name$1 = "@yorkie-js/sdk";
21453
- const version$1 = "0.7.12-rc";
22165
+ const version$1 = "0.7.13";
21454
22166
  const pkg$1 = {
21455
22167
  name: name$1,
21456
22168
  version: version$1
@@ -21751,7 +22463,8 @@ const DefaultClientOptions = {
21751
22463
  syncLoopDuration: 50,
21752
22464
  retrySyncLoopDelay: 1e3,
21753
22465
  reconnectStreamDelay: 1e3,
21754
- channelHeartbeatInterval: DefaultChannelHeartbeatMs
22466
+ channelHeartbeatInterval: DefaultChannelHeartbeatMs,
22467
+ deactivateOnUnload: true
21755
22468
  };
21756
22469
  const DefaultBroadcastOptions = {
21757
22470
  maxRetries: Infinity,
@@ -21771,6 +22484,7 @@ class Client {
21771
22484
  reconnectStreamDelay;
21772
22485
  retrySyncLoopDelay;
21773
22486
  channelHeartbeatInterval;
22487
+ deactivateOnUnload;
21774
22488
  rpcClient;
21775
22489
  setAuthToken;
21776
22490
  taskQueue;
@@ -21804,6 +22518,7 @@ class Client {
21804
22518
  this.reconnectStreamDelay = opts.reconnectStreamDelay ?? DefaultClientOptions.reconnectStreamDelay;
21805
22519
  this.retrySyncLoopDelay = opts.retrySyncLoopDelay ?? DefaultClientOptions.retrySyncLoopDelay;
21806
22520
  this.channelHeartbeatInterval = opts.channelHeartbeatInterval ?? DefaultClientOptions.channelHeartbeatInterval;
22521
+ this.deactivateOnUnload = opts.deactivateOnUnload ?? DefaultClientOptions.deactivateOnUnload;
21807
22522
  const { authInterceptor, setToken } = createAuthInterceptor(this.apiKey);
21808
22523
  this.setAuthToken = setToken;
21809
22524
  const transportOptions = {
@@ -21882,9 +22597,14 @@ class Client {
21882
22597
  this.deactivating = false;
21883
22598
  this.runSyncLoop();
21884
22599
  logger.info(`[AC] c:"${this.getKey()}" activated, id:"${this.id}"`);
21885
- if (typeof window !== "undefined") {
21886
- window.addEventListener("beforeunload", async () => {
21887
- await this.deactivate({ keepalive: true });
22600
+ if (typeof window !== "undefined" && this.deactivateOnUnload) {
22601
+ window.addEventListener("beforeunload", () => {
22602
+ void this.deactivate({ keepalive: true }).catch((err) => {
22603
+ logger.debug(
22604
+ `[DC] c:"${this.getKey()}" beforeunload deactivate failed:`,
22605
+ err
22606
+ );
22607
+ });
21888
22608
  });
21889
22609
  }
21890
22610
  } catch (err) {
@@ -21972,7 +22692,10 @@ class Client {
21972
22692
  );
21973
22693
  }
21974
22694
  doc.setActor(this.id);
21975
- doc.update((_, p) => p.set(opts.initialPresence || {}));
22695
+ const resolvedDisablePresence = opts.disablePresence ?? doc.isPresenceDisabled() ?? false;
22696
+ if (!resolvedDisablePresence) {
22697
+ doc.update((_, p) => p.set(opts.initialPresence || {}));
22698
+ }
21976
22699
  const syncMode = opts.syncMode ?? "realtime";
21977
22700
  if (opts.documentPollInterval !== void 0 && opts.documentPollInterval <= 0) {
21978
22701
  throw new YorkieError(
@@ -21989,7 +22712,8 @@ class Client {
21989
22712
  clientId: this.id,
21990
22713
  changePack: converter.toChangePack(doc.createChangePack()),
21991
22714
  schemaKey: opts.schema,
21992
- disableGc: opts.disableGC ?? false
22715
+ disableGc: opts.disableGC ?? false,
22716
+ disablePresence: resolvedDisablePresence
21993
22717
  },
21994
22718
  { headers: { "x-shard-key": `${this.apiKey}/${doc.getKey()}` } }
21995
22719
  );
@@ -22002,6 +22726,7 @@ class Client {
22002
22726
  }
22003
22727
  const pack = converter.fromChangePack(res.changePack);
22004
22728
  doc.setDisableGC(opts.disableGC ?? false);
22729
+ doc.setDisablePresence(res.disablePresence);
22005
22730
  doc.applyChangePack(pack);
22006
22731
  if (doc.getStatus() === DocStatus.Removed) {
22007
22732
  return doc;
@@ -22016,7 +22741,8 @@ class Client {
22016
22741
  syncMode,
22017
22742
  pollInterval,
22018
22743
  pollIntervalPinned,
22019
- opts.disableGC ?? false
22744
+ opts.disableGC ?? false,
22745
+ res.disablePresence
22020
22746
  )
22021
22747
  );
22022
22748
  if (syncMode !== "manual" && syncMode !== "polling") {
@@ -23534,7 +24260,7 @@ if (typeof globalThis !== "undefined") {
23534
24260
  };
23535
24261
  }
23536
24262
  const name = "@yorkie-js/react";
23537
- const version = "0.7.12-rc";
24263
+ const version = "0.7.13";
23538
24264
  const pkg = {
23539
24265
  name,
23540
24266
  version
@@ -23575,7 +24301,7 @@ function useYorkieClient(opts, activate = true) {
23575
24301
  }
23576
24302
  activateClient();
23577
24303
  return () => {
23578
- if (activate && client?.isActive()) {
24304
+ if (activate && client?.isActive() && opts.deactivateOnUnload !== false) {
23579
24305
  client.deactivate({ keepalive: true });
23580
24306
  }
23581
24307
  };
@@ -23723,7 +24449,7 @@ function shallowEqual(valueA, valueB) {
23723
24449
  valueB
23724
24450
  );
23725
24451
  }
23726
- function useYorkieDocument(client, clientLoading, clientError, docKey, initialRoot, initialPresence, enableDevtools, syncMode, documentPollInterval, disableGC, docStore) {
24452
+ function useYorkieDocument(client, clientLoading, clientError, docKey, initialRoot, initialPresence, enableDevtools, syncMode, documentPollInterval, disableGC, disablePresence, docStore) {
23727
24453
  const initialRootRef = useRef(initialRoot);
23728
24454
  const initialPresenceRef = useRef(initialPresence);
23729
24455
  const [didMount, setDidMount] = useState(false);
@@ -23751,7 +24477,10 @@ function useYorkieDocument(client, clientLoading, clientError, docKey, initialRo
23751
24477
  loading: true,
23752
24478
  error: void 0
23753
24479
  }));
23754
- const newDoc = new Document(docKey, { enableDevtools });
24480
+ const newDoc = new Document(docKey, {
24481
+ enableDevtools,
24482
+ disablePresence
24483
+ });
23755
24484
  const unsubs = [];
23756
24485
  unsubs.push(
23757
24486
  newDoc.subscribe(() => {
@@ -23784,7 +24513,8 @@ function useYorkieDocument(client, clientLoading, clientError, docKey, initialRo
23784
24513
  initialPresence: initialPresenceRef.current,
23785
24514
  syncMode,
23786
24515
  documentPollInterval,
23787
- disableGC
24516
+ disableGC,
24517
+ disablePresence
23788
24518
  });
23789
24519
  const update = (callback) => {
23790
24520
  try {
@@ -23833,7 +24563,8 @@ function useYorkieDocument(client, clientLoading, clientError, docKey, initialRo
23833
24563
  didMount,
23834
24564
  syncMode,
23835
24565
  documentPollInterval,
23836
- disableGC
24566
+ disableGC,
24567
+ disablePresence
23837
24568
  ]);
23838
24569
  }
23839
24570
  const DocumentContext = createContext(void 0);
@@ -23845,6 +24576,7 @@ const DocumentProvider = ({
23845
24576
  syncMode,
23846
24577
  documentPollInterval,
23847
24578
  disableGC,
24579
+ disablePresence,
23848
24580
  children
23849
24581
  }) => {
23850
24582
  const { client, loading: clientLoading, error: clientError } = useYorkie();
@@ -23873,6 +24605,7 @@ const DocumentProvider = ({
23873
24605
  syncMode,
23874
24606
  documentPollInterval,
23875
24607
  disableGC,
24608
+ disablePresence,
23876
24609
  documentStore
23877
24610
  );
23878
24611
  return /* @__PURE__ */ jsx(DocumentContext.Provider, { value: documentStore, children });
@@ -23948,6 +24681,17 @@ const useRevisions = () => {
23948
24681
  );
23949
24682
  return { createRevision, listRevisions, getRevision, restoreRevision };
23950
24683
  };
24684
+ const useRemoveDocument = () => {
24685
+ const { client } = useYorkie();
24686
+ const documentStore = useDocumentStore("useRemoveDocument");
24687
+ const doc = useSelector(documentStore, (store) => store.doc);
24688
+ return useCallback(async () => {
24689
+ if (!client || !doc) {
24690
+ throw new Error("Client or document is not ready");
24691
+ }
24692
+ await client.remove(doc);
24693
+ }, [client, doc]);
24694
+ };
23951
24695
  const useDocumentStore = (hookName) => {
23952
24696
  const documentStore = useContext(DocumentContext);
23953
24697
  if (!documentStore) {
@@ -23993,6 +24737,7 @@ function useYorkieDoc(apiKey, docKey, opts) {
23993
24737
  opts?.syncMode,
23994
24738
  opts?.documentPollInterval,
23995
24739
  opts?.disableGC,
24740
+ opts?.disablePresence,
23996
24741
  documentStore
23997
24742
  );
23998
24743
  const documentState = useSelector(documentStore);
@@ -24260,6 +25005,7 @@ export {
24260
25005
  useDocument,
24261
25006
  usePeekChannel,
24262
25007
  usePresences,
25008
+ useRemoveDocument,
24263
25009
  useRevisions,
24264
25010
  useRoot,
24265
25011
  useYorkie,