pax_global_header00006660000000000000000000000064145461365020014520gustar00rootroot0000000000000052 comment=51d65dedbb41c502412dc1925cf83f14e2292829 golang-github-azure-go-amqp-1.0.2/000077500000000000000000000000001454613650200167325ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/.gitattributes000066400000000000000000000001271454613650200216250ustar00rootroot00000000000000# Binary files (no line-ending conversions), diff using hexdump *.bin binary diff=hex golang-github-azure-go-amqp-1.0.2/.github/000077500000000000000000000000001454613650200202725ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/.github/CODEOWNERS000066400000000000000000000007701454613650200216710ustar00rootroot00000000000000# Instructions for CODEOWNERS file format and automatic build failure notifications: # https://github.com/Azure/azure-sdk/blob/master/docs/policies/opensource.md#codeowners ################ # Automation ################ # Git Hub integration and bot rules /.github/ @richardpark-msft @jhendrixMSFT @rickwinter ############# # go-amqp ############# # Catch all for non-code project files and unowned files | folders * @richardpark-msft @jhendrixMSFT @rickwinter golang-github-azure-go-amqp-1.0.2/.github/pull_request_template.md000066400000000000000000000006451454613650200252400ustar00rootroot00000000000000 - [ ] The purpose of this PR is explained in this or a referenced issue. - [ ] Tests are included and/or updated for code changes. - [ ] Updates to [CHANGELOG.md][] are included. - [ ] MIT license headers are included in each file. [CHANGELOG.md]: https://github.com/Azure/go-amqp/blob/main/CHANGELOG.md golang-github-azure-go-amqp-1.0.2/.gitignore000066400000000000000000000001521454613650200207200ustar00rootroot00000000000000amqp.test /fuzz/*/* !/fuzz/*/corpus /fuzz/*.zip *.log /cmd cover.out .envrc recordings .vscode .idea *.envgolang-github-azure-go-amqp-1.0.2/CHANGELOG.md000066400000000000000000000224371454613650200205530ustar00rootroot00000000000000# Release History ## 1.0.2 (2023-09-05) ### Bugs Fixed * Fixed an issue that could cause frames to be sent even when the provided `context.Context` was cancelled. * Fixed a potential hang in `Sender.Send()` that could happen in rare circumstances. * Ensure that `Sender`'s delivery count and link credit are updated when a transfer fails to send due to context cancellation/timeout. ## 1.0.1 (2023-06-08) ### Bugs Fixed * Fixed an issue that could cause links to terminate with error "received disposition frame with unknown link handle X". ## 1.0.0 (2023-05-04) ### Features Added * Added `ConnOptions.WriteTimeout` to control the write deadline when writing to `net.Conn`. ### Bugs Fixed * Calling `Dial()` with a cancelled context doesn't create a connection. * Context cancellation is properly honored in calls to `Dial()` and `NewConn()`. * Fixed potential race during `Conn.Close()`. * Disable sending frames when closing `Session`, `Sender`, and `Receiver`. * Don't leak in-flight messages when a message settlement API is cancelled or times out waiting for acknowledgement. * `Sender.Send()` will return an `*amqp.Error` with condition `amqp.ErrCondTransferLimitExceeded` when attempting to send a transfer on a link with no credit. * `Sender.Send()` will return an `*amqp.Error` with condition `amqp.ErrCondMessageSizeExceeded` if the message or delivery tag size exceeds the maximum allowed size for the link. ### Other Changes * Debug logging includes the address of the object that's writing a log entry. * Context expiration or cancellation when creating instances of `Session`, `Receiver`, and `Sender` no longer result in the potential for `Conn` to unexpectedly terminate. * Session channel and link handle exhaustion will now return `*ConnError` and `*SessionError` respectively, closing the respective `Conn` or `Session`. * If a `context.Context` contains a deadline/timeout, that value will be used as the write deadline when writing to `net.Conn`. ## 0.19.1 (2023-03-31) ### Bugs Fixed * Fixed a race closing a `Session`, `Receiver`, or `Sender` in succession when the first attempt times out. * Check the `LinkError.RemoteErr` field when determining if a link was cleanly closed. ## 0.19.0 (2023-03-30) ### Breaking Changes * `Dial()` and `NewConn()` now require a `context.Context` as their first parameter. * As a result, the `ConnOptions.Timeout` field has been removed. * Methods `Sender.Send()` and `Receiver.Receive()` now take their respective options-type as the final argument. * The `ManualCredits` field in `ReceiverOptions` has been consolidated into field `Credit`. * Renamed fields in the `ReceiverOptions` for configuring options on the source. * Renamed `DetachError` to `LinkError` as "detach" has a specific meaning which doesn't equate to the returned link errors. * The `Receiver.DrainCredit()` API has been removed. * Removed fields `Batching` and `BatchMaxAge` in `ReceiverOptions`. * The `IncomingWindow` and `OutgoingWindow` fields in `SessionOptions` have been removed. * The field `SenderOptions.IgnoreDispositionErrors` has been removed. * By default, messages that are rejected by the peer no longer close the `Sender`. * The field `SendSettled` in type `Message` has been moved to type `SendOptions` and renamed as `Settled`. * The following type aliases have been removed. * `Address`, `Binary`, `MessageID`, `SequenceNumber`, `Symbol` * Method `Message.LinkName()` has been removed. ### Bugs Fixed * Don't discard incoming frames while closing a Session. * Client-side termination of a Session due to invalid state will wait for the peer to acknowledge the Session's end. * Fixed an issue that could cause `creditor.Drain()` to return the wrong error when a link is terminated. * Ensure that `Receiver.Receive()` drains prefetched messages when the link closed. * Fixed an issue that could cause closing a `Receiver` to hang under certain circumstances. * In `Receiver.Drain()`, wake up `Receiver.mux()` after the drain bit has been set. ### Other Changes * Debug logging has been cleaned up to reduce the number of redundant entries and consolidate the entry format. * DEBUG_LEVEL 1 now captures all sent/received frames along with basic flow control information. * Higher debug levels add entries when a frame transitions across mux boundaries and other diagnostics info. * Document default values for incoming and outgoing windows. * Refactored handling of incoming frames to eliminate potential deadlocks due to "mux pumping". * Disallow sending of frames once the end performative has been sent. * Clean up client-side state when a `context.Context` expires or is cancelled and document the potential side-effects. * Unexpected frames will now terminate a `Session`, `Receiver`, or `Sender` as required. * Cleaned up tests that triggered the race detector. ## 0.18.1 (2023-01-17) ### Bugs Fixed * Fixed an issue that could cause `Conn.connReader()` to become blocked in rare circumstances. * Fixed an issue that could cause outgoing transfers to be rejected by some brokers due to out-of-sequence delivery IDs. * Fixed an issue that could cause senders and receivers within the same session to deadlock if the receiver was configured with `ReceiverSettleModeFirst`. * Enabled support for senders in an at-most-once configuration. ### Other Changes * The connection mux goroutine has been removed, eliminating a potential source of deadlocks. * Automatic link flow control is built on the manual creditor. * Clarified docs that messages received from a sender configured in a mode other than `SenderSettleModeSettled` must be acknowledged. * Clarified default value for `Conn.IdleTimeout` and removed unit prefix. ## 0.18.0 (2022-12-06) ### Features Added * Added `ConnError` type that's returned when a connection is no longer functional. * Added `SessionError` type that's returned when a session has been closed. * Added `SASLType` used when configuring the SASL authentication mechanism. * Added `Ptr()` method to `SenderSettleMode` and `ReceiverSettleMode` types. ### Breaking Changes * The minimum version of Go required to build this module is now 1.18. * The type `Client` has been renamed to `Conn`, and its constructor `New()` renamed to `NewConn()`. * Removed `ErrConnClosed`, `ErrSessionClosed`, `ErrLinkClosed`, and `ErrTimeout` sentinel error types. * The following methods now require a `context.Context` as their first parameter. * `Conn.NewSession()`, `Session.NewReceiver()`, `Session.NewSender()` * Removed `context.Context` parameter and `error` return from method `Receiver.Prefetched()`. * The following type names had the prefix `AMQP` removed to prevent stuttering. * `AMQPAddress`, `AMQPMessageID`, `AMQPSymbol`, `AMQPSequenceNumber`, `AMQPBinary` * Various `Default*` constants are no longer exported. * The args to `Receiver.ModifyMessage()` have changed. * The "variadic config" pattern for `Conn`, `Session`, `Sender`, and `Receiver` constructors has been replaced with a struct-based config. * This removes the `ConnOption`, `SessionOption`, and `LinkOption` types and all of the associated configuration funcs. * The sender and receiver specific link options have been moved into their respective options types. * The `ConnTLS()` option was removed as part of this change. * The `Dial()` and `New()` constructors now require an `*ConnOptions` parameter. * `Conn.NewSession()` now requires a `*SessionOptions` parameter. * `Session.NewSender()` now requires `target` address and `*SenderOptions` parameters. * `Session.NewReceiver()` now requires `source` address and `*ReceiverOptions` parameters. * The various SASL configuration funcs have been slightly renamed. * The following constant types had their values renamed in accordance with the SDK design guidelines. * `SenderSettleMode`, `ReceiverSettleMode`, `ExpiryPolicy` * Constant type `ErrorCondition` has been renamed to `ErrCond`. * The `ErrCond` values have had their names updated to include the `ErrCond` prefix. * `LinkFilterSource` and `LinkFilterSelector` have been renamed to `NewLinkFilter` and `NewSelectorFilter` respectively. * The `RemoteError` field in `DetachError` has been renamed. ### Bugs Fixed * Fixed potential panic in `muxHandleFrame()` when checking for manual creditor. * Fixed potential panic in `attachLink()` when copying source filters. * `NewConn()` will no longer return a broken `*Conn` in some instances. * Incoming transfer frames received during initial link detach are no longer discarded. * Session will no longer flood peer with flow frames when half its incoming window is consumed. * Newly created `Session` won't leak if the context passed to `Conn.NewSession()` expires before exit. * Newly created `link` won't leak if the context passed to `link.attach()` expires before exit. * Fixed an issue causing dispositions to hang indefinitely with batching enabled when the receiver link is detached. ### Other Changes * Errors when reading/writing to the underlying `net.Conn` are now wrapped in a `ConnError` type. * Disambiguate error message for distinct cases where a session wasn't found for the specified remote channel. * Removed `link.Paused` as it didn't add much value and was broken in some cases. * Only send one flow frame when a drain has been requested. * Session window size increased to 5000. * Creation and deletion of `Session` instances have been made deterministic. * Allocation and deallocation of link handles has been made deterministic. golang-github-azure-go-amqp-1.0.2/CODE_OF_CONDUCT.md000066400000000000000000000007051454613650200215330ustar00rootroot00000000000000# Microsoft Open Source Code of Conduct This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). Resources: - [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) - [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) - Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns golang-github-azure-go-amqp-1.0.2/CONTRIBUTING.md000066400000000000000000000126671454613650200211770ustar00rootroot00000000000000# Azure/go-amqp Contributing Guide Thank you for your interest in contributing to go-amqp. - For reporting bugs, requesting features, or asking for support, please file an issue in the [issues](https://github.com/Azure/go-amqp/issues) section of the project. - If you would like to become an active contributor to this project please follow the instructions provided in [Microsoft Azure Projects Contribution Guidelines](https://azure.github.io/azure-sdk/policies_opensource.html). - To make code changes, or contribute something new, please follow the [GitHub Forks / Pull requests model](https://help.github.com/articles/fork-a-repo/): Fork the repo, make the change and propose it back by submitting a pull request. ## Pull Requests - **DO** follow the API design and implementation [Go Guidelines](https://azure.github.io/azure-sdk/golang_introduction.html). - When submitting large changes or features, **DO** have an issue or spec doc that describes the design, usage, and motivating scenario. - **DO** submit all code changes via pull requests (PRs) rather than through a direct commit. PRs will be reviewed and potentially merged by the repo maintainers after a peer review that includes at least one maintainer. - **DO** review your own PR to make sure there are no unintended changes or commits before submitting it. - **DO NOT** submit "work in progress" PRs. A PR should only be submitted when it is considered ready for review and subsequent merging by the contributor. - If the change is work-in-progress or an experiment, **DO** start off as a temporary draft PR. - **DO** give PRs short-but-descriptive names (e.g. "Improve code coverage for sender by 10%", not "Fix #1234") and add a description which explains why the change is being made. - **DO** refer to any relevant issues, and include [keywords](https://help.github.com/articles/closing-issues-via-commit-messages/) that automatically close issues when the PR is merged. - **DO** tag any users that should know about and/or review the change. - **DO** ensure each commit successfully builds. The entire PR must pass all tests in the Continuous Integration (CI) system before it'll be merged. - **DO** address PR feedback in an additional commit(s) rather than amending the existing commits, and only rebase/squash them when necessary. This makes it easier for reviewers to track changes. - **DO** assume that ["Squash and Merge"](https://github.com/blog/2141-squash-your-commits) will be used to merge your commit unless you request otherwise in the PR. - **DO NOT** mix independent, unrelated changes in one PR. Separate real product/test code changes from larger code formatting/dead code removal changes. Separate unrelated fixes into separate PRs, especially if they are in different modules or files that otherwise wouldn't be changed. - **DO** comment your code focusing on "why", where necessary. Otherwise, aim to keep it self-documenting with appropriate names and style. - **DO** add [GoDoc style comments](https://azure.github.io/azure-sdk/golang_introduction.html#documentation-style) when adding new APIs or modifying header files. - **DO** make sure there are no typos or spelling errors, especially in user-facing documentation. - **DO** verify if your changes have impact elsewhere. For instance, do you need to update other docs or exiting markdown files that might be impacted? - **DO** add relevant unit tests to ensure CI will catch future regressions. ## Merging Pull Requests (for project contributors with write access) - **DO** use ["Squash and Merge"](https://github.com/blog/2141-squash-your-commits) by default for individual contributions unless requested by the PR author. Do so, even if the PR contains only one commit. It creates a simpler history than "Create a Merge Commit". Reasons that PR authors may request "Merge and Commit" may include (but are not limited to): - The change is easier to understand as a series of focused commits. Each commit in the series must be buildable so as not to break `git bisect`. - Contributor is using an e-mail address other than the primary GitHub address and wants that preserved in the history. Contributor must be willing to squash the commits manually before acceptance. ## Developer Guide ### Logging To enable debug logging, build with `-tags debug`. This enables debug level 1 by default. You can increase the level by setting the `DEBUG_LEVEL` environment variable to 2 or higher. (Debug logging is disabled entirely without `-tags debug`, regardless of `DEBUG_LEVEL` setting.) To add additional logging, use the `debug.Log(level int, format string, v ...any)` function, which is similar to `fmt.Printf` but takes a level as its first argument. ### Packet Capture Wireshark can be very helpful in diagnosing interactions between client and server. If the connection is not encrypted Wireshark can natively decode AMQP 1.0. If the connection is encrypted with TLS you'll need to log out the keys. Example of logging the TLS keys: ```go // Create the file f, err := os.OpenFile("key.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) // Configure TLS tlsConfig := &tls.Config{ KeyLogWriter: f, } // Dial the host const host = "my.amqp.server" conn, err := tls.Dial("tcp", host+":5671", tlsConfig) // Create the connections client, err := amqp.New(conn, amqp.ConnSASLPlain("username", "password"), amqp.ConnServerHostname(host), ) ``` You'll need to configure Wireshark to read the key.log file in Preferences > Protocols > SSL > (Pre)-Master-Secret log filename. golang-github-azure-go-amqp-1.0.2/LICENSE000066400000000000000000000022731454613650200177430ustar00rootroot00000000000000 MIT License Copyright (C) 2017 Kale Blankenship Portions Copyright (C) Microsoft Corporation Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE golang-github-azure-go-amqp-1.0.2/Makefile000066400000000000000000000013141454613650200203710ustar00rootroot00000000000000PACKAGE := github.com/Azure/go-amqp FUZZ_DIR := ./fuzz all: test fuzzconn: go-fuzz-build -o $(FUZZ_DIR)/conn.zip -func FuzzConn $(PACKAGE) go-fuzz -bin $(FUZZ_DIR)/conn.zip -workdir $(FUZZ_DIR)/conn fuzzmarshal: go-fuzz-build -o $(FUZZ_DIR)/marshal.zip -func FuzzUnmarshal $(PACKAGE) go-fuzz -bin $(FUZZ_DIR)/marshal.zip -workdir $(FUZZ_DIR)/marshal fuzzclean: rm -f $(FUZZ_DIR)/**/{crashers,suppressions}/* rm -f $(FUZZ_DIR)/*.zip test: TEST_CORPUS=1 go test -race -run=Corpus go test -v -race ./... #integration: #go test -tags "integration" -count=1 -v -race . test386: TEST_CORPUS=1 go test -count=1 -v . ci: test386 coverage coverage: TEST_CORPUS=1 go test -cover -coverprofile=cover.out -v golang-github-azure-go-amqp-1.0.2/NOTICE.txt000066400000000000000000000020321454613650200204510ustar00rootroot00000000000000NOTICES AND INFORMATION Do Not Translate or Localize This software incorporates material from third parties. Microsoft makes certain open source code available at https://3rdpartysource.microsoft.com, or you may send a check or money order for US $5.00, including the product name, the open source component name, and version number, to: Source Code Compliance Team Microsoft Corporation One Microsoft Way Redmond, WA 98052 USA Notwithstanding any other terms, you may reverse engineer this software to the extent required to debug changes to any libraries licensed under the GNU Lesser General Public License. ------------------------------------------------------------------------------ go-amqp uses third-party libraries or other resources that may be distributed under licenses different than the go-amqp software. In the event that we accidentally failed to list a required notice, please bring it to our attention. Post an issue or email us: azgosdkhelp@microsoft.com The attached notices are provided for information only. golang-github-azure-go-amqp-1.0.2/README.md000066400000000000000000000214371454613650200202200ustar00rootroot00000000000000# AMQP 1.0 Client Module for Go [![PkgGoDev](https://pkg.go.dev/badge/github.com/Azure/go-amqp)](https://pkg.go.dev/github.com/Azure/go-amqp) [![Build Status](https://dev.azure.com/azure-sdk/public/_apis/build/status/go/Azure.go-amqp?branchName=main)](https://dev.azure.com/azure-sdk/public/_build/latest?definitionId=1292&branchName=main) [![Go Report Card](https://goreportcard.com/badge/github.com/Azure/go-amqp)](https://goreportcard.com/report/github.com/Azure/go-amqp) [![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/Azure/go-amqp/main/LICENSE) The [amqp][godoc_amqp] module is an AMQP 1.0 client implementation for Go. [AMQP 1.0][amqp_spec] is not compatible with AMQP 0-9-1 or 0-10. ## Getting Started ### Prerequisites - Go 1.18 or later - An AMQP 1.0 compliant [broker][broker_listing] ### Install the module ```sh go get github.com/Azure/go-amqp ``` ### Connect to a broker Call [amqp.Dial()][godoc_dial] to connect to an AMQP broker. This creates an [*amqp.Conn][godoc_conn]. ```go conn, err := amqp.Dial(context.TODO(), "amqp[s]://", nil) if err != nil { // handle error } ``` ### Sending and receiving messages In order to send or receive messages, first create an [*amqp.Session][godoc_session] from the [*amqp.Conn][godoc_conn] by calling [Conn.NewSession()][godoc_conn_session]. ```go session, err := conn.NewSession(context.TODO(), nil) if err != nil { // handle error } ``` Once the session has been created, create an [*amqp.Sender][godoc_sender] to send messages and/or an [*amqp.Receiver][godoc_receiver] to receive messages by calling [Session.NewSender()][godoc_session_sender] and/or [Session.NewReceiver()][godoc_session_receiver] respectively. ```go // create a new sender sender, err := session.NewSender(context.TODO(), "", nil) if err != nil { // handle error } // send a message err = sender.Send(context.TODO(), amqp.NewMessage([]byte("Hello!")), nil) if err != nil { // handle error } // create a new receiver receiver, err := session.NewReceiver(context.TODO(), "", nil) if err != nil { // handle error } // receive the next message msg, err := receiver.Receive(context.TODO(), nil) if err != nil { // handle error } ``` ## Key concepts - An [*amqp.Conn][godoc_conn] connects a client to a broker (e.g. Azure Service Bus). - Once a connection has been established, create one or more [*amqp.Session][godoc_session] instances. - From an [*amqp.Session][godoc_session] instance, create one or more senders and/or receivers. - An [*amqp.Sender][godoc_sender] is used to send messages from the client to a broker. - An [*amqp.Receiver][godoc_receiver] is used to receive messages from a broker to the client. For a complete overview of AMQP's conceptual model, please consult section [2.1 Transport][section_2_1] of the AMQP 1.0 specification. ## Examples The following examples cover common scenarios for sending and receiving messages: - [Create a message](#create-a-message) - [Send message](#send-message) - [Receive messages](#receive-messages) ### Create a message A message can be created in two different ways. The first is to simply instantiate a new instance of the [*amqp.Message][godoc_message] type, populating the required fields. ```go msg := &amqp.Message{ // populate fields (Data is the most common) } ``` The second is the [amqp.NewMessage][godoc_message_ctor] constructor. It passes the provided `[]byte` to the first entry in the `*amqp.Message.Data` slice. ```go msg := amqp.NewMessage(/* some []byte */) ``` This is purely a convenience constructor as many AMQP brokers expect a message's data in the `Data` field. ### Send message Once an [*amqp.Session][godoc_session] has been created, create an [*amqp.Sender][godoc_sender] in order to send messages. ```go sender, err := session.NewSender(context.TODO(), "", nil) ``` Once the [*amqp.Sender][godoc_sender] has been created, call [Sender.Send()][godoc_sender_send] to send an [*amqp.Message][godoc_message]. ```go err := sender.Send(context.TODO(), msg, nil) ``` Depending on the sender's configuration, the call to [Sender.Send()][godoc_sender_send] will block until the peer has acknowledged the message was received. The amount of time the call will block is dependent upon network latency and the peer's load, but is usually in a few dozen milliseconds. ### Receive messages Once an [*amqp.Session][godoc_session] has been created, create an [*amqp.Receiver][godoc_receiver] in order to receive messages. ```go receiver, err := session.NewReceiver(context.TODO(), "", nil) ``` Once the [*amqp.Receiver][godoc_receiver] has been created, call [Receiver.Receive()][godoc_receiver_receive] to wait for an incoming message. ```go msg, err := receiver.Receive(context.TODO(), nil) ``` Note that calls to [Receiver.Receive()][godoc_receiver_receive] will block until either a message has been received or, if applicable, the provided [context.Context][godoc_context] has been cancelled and/or its deadline exceeded. After an [*amqp.Message][godoc_message] message has been received and processed, as the final step it's **imperative** that the [*amqp.Message][godoc_message] is passed to one of the acknowledgement methods on the [*amqp.Receiver][godoc_receiver]. - [Receiver.AcceptMessage][godoc_receiver_accept] - the client has accepted the message and no redelivery is required (most common) - [Receiver.ModifyMessage][godoc_receiver_modify] - the client has modified the message and released it for redelivery with the specified modifications - [Receiver.RejectMessage][godoc_receiver_reject] - the message is invalid and therefore cannot be processed - [Receiver.ReleaseMessage][godoc_receiver_release] - the client has released the message for redelivery without any modifications ```go err := receiver.AcceptMessage(context.TODO(), msg) ``` ## Next steps See the [examples][godoc_examples] for complete end-to-end examples on how to use this module. ## Contributing This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. When you submit a pull request, a CLA bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA. This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. [amqp_spec]: http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-overview-v1.0-os.html [broker_listing]: https://github.com/xinchen10/awesome-amqp [section_2_1]: http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-transport-v1.0-os.html#section-transport [godoc_amqp]: https://pkg.go.dev/github.com/Azure/go-amqp [godoc_examples]: https://pkg.go.dev/github.com/Azure/go-amqp#pkg-examples [godoc_conn]: https://pkg.go.dev/github.com/Azure/go-amqp#Conn [godoc_conn_session]: https://pkg.go.dev/github.com/Azure/go-amqp#Conn.NewSession [godoc_dial]: https://pkg.go.dev/github.com/Azure/go-amqp#Dial [godoc_context]: https://pkg.go.dev/context#Context [godoc_message]: https://pkg.go.dev/github.com/Azure/go-amqp#Message [godoc_message_ctor]: https://pkg.go.dev/github.com/Azure/go-amqp#NewMessage [godoc_session]: https://pkg.go.dev/github.com/Azure/go-amqp#Session [godoc_session_sender]: https://pkg.go.dev/github.com/Azure/go-amqp#Session.NewSender [godoc_session_receiver]: https://pkg.go.dev/github.com/Azure/go-amqp#Session.NewReceiver [godoc_sender]: https://pkg.go.dev/github.com/Azure/go-amqp#Sender [godoc_sender_send]: https://pkg.go.dev/github.com/Azure/go-amqp#Sender.Send [godoc_receiver]: https://pkg.go.dev/github.com/Azure/go-amqp#Receiver [godoc_receiver_accept]: https://pkg.go.dev/github.com/Azure/go-amqp#Receiver.AcceptMessage [godoc_receiver_modify]: https://pkg.go.dev/github.com/Azure/go-amqp#Receiver.ModifyMessage [godoc_receiver_reject]: https://pkg.go.dev/github.com/Azure/go-amqp#Receiver.RejectMessage [godoc_receiver_release]: https://pkg.go.dev/github.com/Azure/go-amqp#Receiver.ReleaseMessage [godoc_receiver_receive]: https://pkg.go.dev/github.com/Azure/go-amqp#Receiver.Receive golang-github-azure-go-amqp-1.0.2/SECURITY.md000066400000000000000000000054611454613650200205310ustar00rootroot00000000000000 ## Security Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). If you believe you have found a security vulnerability in any Microsoft-owned repository that meets Microsoft's [Microsoft's definition of a security vulnerability](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)) of a security vulnerability, please report it to us as described below. ## Reporting Security Issues **Please do not report security vulnerabilities through public GitHub issues.** Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) * Full paths of source file(s) related to the manifestation of the issue * The location of the affected source code (tag/branch/commit or direct URL) * Any special configuration required to reproduce the issue * Step-by-step instructions to reproduce the issue * Proof-of-concept or exploit code (if possible) * Impact of the issue, including how an attacker might exploit the issue This information will help us triage your report more quickly. If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs. ## Preferred Languages We prefer all communications to be in English. ## Policy Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd). golang-github-azure-go-amqp-1.0.2/azure-pipelines.yml000066400000000000000000000065641454613650200226040ustar00rootroot00000000000000variables: GO111MODULE: 'on' AMQP_BROKER_ADDR: 'amqp://127.0.0.1:25672' jobs: - job: 'goamqp' displayName: 'Run go-amqp CI Checks' strategy: matrix: Linux_Go118: pool.name: 'azsdk-pool-mms-ubuntu-2004-general' vm.image: 'ubuntu-20.04' go.version: '1.18.10' Linux_Go120: pool.name: 'azsdk-pool-mms-ubuntu-2004-general' vm.image: 'ubuntu-20.04' go.version: '1.20.7' Linux_Go121: pool.name: 'azsdk-pool-mms-ubuntu-2004-general' vm.image: 'ubuntu-20.04' go.version: '1.21.0' pool: name: '$(pool.name)' vmImage: '$(vm.image)' steps: - task: GoTool@0 inputs: version: '$(go.version)' displayName: "Select Go Version" - script: | set -e export gopathbin=$(go env GOPATH)/bin echo "##vso[task.prependpath]$gopathbin" go install github.com/jstemmer/go-junit-report@v0.9.1 go install github.com/axw/gocov/gocov@v1.1.0 go install github.com/AlekSi/gocov-xml@v1.0.0 go install github.com/matm/gocov-html/cmd/gocov-html@v1.2.0 displayName: 'Install Dependencies' - script: | curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.54.2 golangci-lint --version golangci-lint run displayName: 'Install and Run GoLintCLI.' - script: | go build -v ./... displayName: 'Build' - script: | go vet ./... displayName: 'Vet' - task: UseDotNet@2 displayName: 'Use .NET sdk' inputs: packageType: sdk version: 6.0.x installationPath: $(Agent.ToolsDirectory)/dotnet - script: | git clone https://github.com/Azure/azure-amqp $(Pipeline.Workspace)/azure-amqp git checkout v2.6.0 pushd $(Pipeline.Workspace)/azure-amqp/test/TestAmqpBroker dotnet restore dotnet build chmod +x $(Pipeline.Workspace)/azure-amqp/bin/Debug/TestAmqpBroker/net462/TestAmqpBroker.exe displayName: 'Clone and Build Broker' - script: | set -e export TEST_CORPUS=1 echo '##[command]Starting broker at $(AMQP_BROKER_ADDR)' $(Pipeline.Workspace)/azure-amqp/bin/Debug/TestAmqpBroker/net462/TestAmqpBroker.exe $AMQP_BROKER_ADDR /headless & brokerPID=$! echo '##[section]Starting tests' go test -race -v -coverprofile=coverage.txt -covermode atomic ./... 2>&1 | tee gotestoutput.log go-junit-report < gotestoutput.log > report.xml kill $brokerPID gocov convert coverage.txt > coverage.json gocov-xml < coverage.json > coverage.xml gocov-html < coverage.json > coverage.html displayName: 'Run Tests' - script: | gofmt -s -l -w . >&2 displayName: 'Format Check' failOnStderr: true condition: succeededOrFailed() - task: PublishTestResults@2 inputs: testRunner: JUnit testResultsFiles: report.xml failTaskOnFailedTests: true - task: PublishCodeCoverageResults@1 inputs: codeCoverageTool: Cobertura summaryFileLocation: coverage.xml additionalCodeCoverageFiles: coverage.html golang-github-azure-go-amqp-1.0.2/benchmark_test.go000066400000000000000000000032751454613650200222610ustar00rootroot00000000000000package amqp_test import ( "context" "fmt" "math/rand" "testing" "time" amqp "github.com/Azure/go-amqp" ) func BenchmarkSimple(b *testing.B) { if localBrokerAddr == "" { b.Skip() } ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := amqp.Dial(ctx, localBrokerAddr, nil) cancel() if err != nil { b.Fatal(err) } defer client.Close() ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() if err != nil { b.Fatal(err) } // add a random suffix to the link name so the test broker always creates a new node targetName := fmt.Sprintf("BenchmarkSimple %d", rand.Uint64()) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) sender, err := session.NewSender(ctx, targetName, nil) cancel() if err != nil { b.Fatal(err) } ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) receiver, err := session.NewReceiver(ctx, targetName, nil) cancel() if err != nil { b.Fatal(err) } msg := amqp.NewMessage([]byte("test message")) for i := 0; i < b.N; i++ { // simple send and receive message, no concurrency for j := 0; j < 10000; j++ { ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) if err := sender.Send(ctx, msg, nil); err != nil { b.Fatal(err) } cancel() ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) msg, err := receiver.Receive(ctx, nil) cancel() if err != nil { b.Fatal(err) } ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) err = receiver.AcceptMessage(ctx, msg) cancel() if err != nil { b.Fatal(err) } } } } golang-github-azure-go-amqp-1.0.2/benchmarks_test.go000066400000000000000000000164271454613650200224470ustar00rootroot00000000000000package amqp import ( "context" "fmt" "testing" "time" "github.com/Azure/go-amqp/internal/encoding" "github.com/Azure/go-amqp/internal/fake" "github.com/Azure/go-amqp/internal/frames" "github.com/stretchr/testify/require" ) func BenchmarkSenderSendSSMUnsettled(b *testing.B) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := senderFrameHandler(0, SenderSettleModeUnsettled)(remoteChannel, req) if resp.Payload != nil || err != nil { return resp, err } switch tt := req.(type) { case *frames.PerformFlow: return fake.Response{}, nil case *frames.PerformDisposition: return fake.Response{}, nil case *frames.PerformTransfer: return newResponse(fake.PerformDisposition(encoding.RoleReceiver, 0, *tt.DeliveryID, nil, &encoding.StateAccepted{})) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(b, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(b, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) sndr, err := session.NewSender(ctx, "target", &SenderOptions{ SettlementMode: SenderSettleModeUnsettled.Ptr(), }) cancel() require.NoError(b, err) sendInitialFlowFrame(b, 0, conn, 0, 1000000) b.ResetTimer() b.ReportAllocs() msg := NewMessage([]byte("test")) for i := 0; i < b.N; i++ { ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) err = sndr.Send(ctx, msg, nil) cancel() require.NoError(b, err) } } func BenchmarkSenderSendSSMSettled(b *testing.B) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := senderFrameHandler(0, SenderSettleModeSettled)(remoteChannel, req) if resp.Payload != nil || err != nil { return resp, err } switch req.(type) { case *frames.PerformFlow: return fake.Response{}, nil case *frames.PerformDisposition: return fake.Response{}, nil case *frames.PerformTransfer: return fake.Response{}, nil default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(b, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(b, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) sndr, err := session.NewSender(ctx, "target", &SenderOptions{ SettlementMode: SenderSettleModeSettled.Ptr(), }) cancel() require.NoError(b, err) sendInitialFlowFrame(b, 0, conn, 0, 1000000) b.ResetTimer() b.ReportAllocs() msg := NewMessage([]byte("test")) for i := 0; i < b.N; i++ { ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) err = sndr.Send(ctx, msg, nil) cancel() require.NoError(b, err) } } func BenchmarkReceiverReceiveRSMFirst(b *testing.B) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := receiverFrameHandler(0, ReceiverSettleModeFirst)(remoteChannel, req) if resp.Payload != nil || err != nil { return resp, err } switch req.(type) { case *frames.PerformFlow: return fake.Response{}, nil case *frames.PerformDisposition: return fake.Response{}, nil default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(b, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(b, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) rcvr, err := session.NewReceiver(ctx, "source", &ReceiverOptions{ SettlementMode: ReceiverSettleModeFirst.Ptr(), }) cancel() require.NoError(b, err) transfers := make([][]byte, b.N) for i := 0; i < b.N; i++ { fr, err := fake.PerformTransfer(0, 0, uint32(i), []byte{}) require.NoError(b, err) transfers[i] = fr } b.ResetTimer() b.ReportAllocs() for i := 0; i < b.N; i++ { conn.SendFrame(transfers[i]) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) _, err = rcvr.Receive(ctx, nil) cancel() require.NoError(b, err) } } func BenchmarkReceiverReceiveRSMSecond(b *testing.B) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := receiverFrameHandler(0, ReceiverSettleModeSecond)(remoteChannel, req) if resp.Payload != nil || err != nil { return resp, err } switch req.(type) { case *frames.PerformFlow: return fake.Response{}, nil case *frames.PerformDisposition: return fake.Response{}, nil default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(b, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(b, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) rcvr, err := session.NewReceiver(ctx, "source", &ReceiverOptions{ SettlementMode: ReceiverSettleModeSecond.Ptr(), }) cancel() require.NoError(b, err) transfers := make([][]byte, b.N) for i := 0; i < b.N; i++ { fr, err := fake.PerformTransfer(0, 0, uint32(i), []byte{}) require.NoError(b, err) transfers[i] = fr } b.ResetTimer() b.ReportAllocs() for i := 0; i < b.N; i++ { conn.SendFrame(transfers[i]) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) _, err = rcvr.Receive(ctx, nil) cancel() require.NoError(b, err) } } func BenchmarkReceiverSettleMessage(b *testing.B) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := receiverFrameHandler(0, ReceiverSettleModeFirst)(remoteChannel, req) if resp.Payload != nil || err != nil { return resp, err } switch req.(type) { case *frames.PerformFlow: return fake.Response{}, nil case *frames.PerformDisposition: return fake.Response{}, nil default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(b, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(b, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) rcvr, err := session.NewReceiver(ctx, "source", nil) cancel() require.NoError(b, err) b.ResetTimer() b.ReportAllocs() for i := 0; i < b.N; i++ { ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) require.NoError(b, rcvr.AcceptMessage(ctx, &Message{deliveryID: 0})) cancel() } } golang-github-azure-go-amqp-1.0.2/conn.go000066400000000000000000001003521454613650200202170ustar00rootroot00000000000000package amqp import ( "bytes" "context" "crypto/tls" "errors" "fmt" "math" "net" "net/url" "sync" "time" "github.com/Azure/go-amqp/internal/bitmap" "github.com/Azure/go-amqp/internal/buffer" "github.com/Azure/go-amqp/internal/debug" "github.com/Azure/go-amqp/internal/encoding" "github.com/Azure/go-amqp/internal/frames" "github.com/Azure/go-amqp/internal/shared" ) // Default connection options const ( defaultIdleTimeout = 1 * time.Minute defaultMaxFrameSize = 65536 defaultMaxSessions = 65536 defaultWriteTimeout = 30 * time.Second ) // ConnOptions contains the optional settings for configuring an AMQP connection. type ConnOptions struct { // ContainerID sets the container-id to use when opening the connection. // // A container ID will be randomly generated if this option is not used. ContainerID string // HostName sets the hostname sent in the AMQP // Open frame and TLS ServerName (if not otherwise set). HostName string // IdleTimeout specifies the maximum period between // receiving frames from the peer. // // Specify a value less than zero to disable idle timeout. // // Default: 1 minute (60000000000). IdleTimeout time.Duration // MaxFrameSize sets the maximum frame size that // the connection will accept. // // Must be 512 or greater. // // Default: 512. MaxFrameSize uint32 // MaxSessions sets the maximum number of channels. // The value must be greater than zero. // // Default: 65535. MaxSessions uint16 // Properties sets an entry in the connection properties map sent to the server. Properties map[string]any // SASLType contains the specified SASL authentication mechanism. SASLType SASLType // TLSConfig sets the tls.Config to be used during // TLS negotiation. // // This option is for advanced usage, in most scenarios // providing a URL scheme of "amqps://" is sufficient. TLSConfig *tls.Config // WriteTimeout controls the write deadline when writing AMQP frames to the // underlying net.Conn and no caller provided context.Context is available or // the context contains no deadline (e.g. context.Background()). // The timeout is set per write. // // Setting to a value less than zero means no timeout is set, so writes // defer to the underlying behavior of net.Conn with no write deadline. // // Default: 30s WriteTimeout time.Duration // test hook dialer dialer } // Dial connects to an AMQP broker. // // If the addr includes a scheme, it must be "amqp", "amqps", or "amqp+ssl". // If no port is provided, 5672 will be used for "amqp" and 5671 for "amqps" or "amqp+ssl". // // If username and password information is not empty it's used as SASL PLAIN // credentials, equal to passing ConnSASLPlain option. // // opts: pass nil to accept the default values. func Dial(ctx context.Context, addr string, opts *ConnOptions) (*Conn, error) { c, err := dialConn(ctx, addr, opts) if err != nil { return nil, err } err = c.start(ctx) if err != nil { return nil, err } return c, nil } // NewConn establishes a new AMQP client connection over conn. // NOTE: [Conn] takes ownership of the provided [net.Conn] and will close it as required. // opts: pass nil to accept the default values. func NewConn(ctx context.Context, conn net.Conn, opts *ConnOptions) (*Conn, error) { c, err := newConn(conn, opts) if err != nil { return nil, err } err = c.start(ctx) if err != nil { return nil, err } return c, nil } // Conn is an AMQP connection. type Conn struct { net net.Conn // underlying connection dialer dialer // used for testing purposes, it allows faking dialing TCP/TLS endpoints writeTimeout time.Duration // controls write deadline in absense of a context // TLS tlsNegotiation bool // negotiate TLS tlsComplete bool // TLS negotiation complete tlsConfig *tls.Config // TLS config, default used if nil (ServerName set to Client.hostname) // SASL saslHandlers map[encoding.Symbol]stateFunc // map of supported handlers keyed by SASL mechanism, SASL not negotiated if nil saslComplete bool // SASL negotiation complete; internal *except* for SASL auth methods // local settings maxFrameSize uint32 // max frame size to accept channelMax uint16 // maximum number of channels to allow hostname string // hostname of remote server (set explicitly or parsed from URL) idleTimeout time.Duration // maximum period between receiving frames properties map[encoding.Symbol]any // additional properties sent upon connection open containerID string // set explicitly or randomly generated // peer settings peerIdleTimeout time.Duration // maximum period between sending frames peerMaxFrameSize uint32 // maximum frame size peer will accept // conn state done chan struct{} // indicates the connection has terminated doneErr error // contains the error state returned from Close(); DO NOT TOUCH outside of conn.go until done has been closed! // connReader and connWriter management rxtxExit chan struct{} // signals connReader and connWriter to exit closeOnce sync.Once // ensures that close() is only called once // session tracking channels *bitmap.Bitmap sessionsByChannel map[uint16]*Session sessionsByChannelMu sync.RWMutex abandonedSessionsMu sync.Mutex abandonedSessions []*Session // connReader rxBuf buffer.Buffer // incoming bytes buffer rxDone chan struct{} // closed when connReader exits rxErr error // contains last error reading from c.net; DO NOT TOUCH outside of connReader until rxDone has been closed! // connWriter txFrame chan frameEnvelope // AMQP frames to be sent by connWriter txBuf buffer.Buffer // buffer for marshaling frames before transmitting txDone chan struct{} // closed when connWriter exits txErr error // contains last error writing to c.net; DO NOT TOUCH outside of connWriter until txDone has been closed! } // used to abstract the underlying dialer for testing purposes type dialer interface { NetDialerDial(ctx context.Context, c *Conn, host, port string) error TLSDialWithDialer(ctx context.Context, c *Conn, host, port string) error } // implements the dialer interface type defaultDialer struct{} func (defaultDialer) NetDialerDial(ctx context.Context, c *Conn, host, port string) (err error) { dialer := &net.Dialer{} c.net, err = dialer.DialContext(ctx, "tcp", net.JoinHostPort(host, port)) return } func (defaultDialer) TLSDialWithDialer(ctx context.Context, c *Conn, host, port string) (err error) { dialer := &tls.Dialer{Config: c.tlsConfig} c.net, err = dialer.DialContext(ctx, "tcp", net.JoinHostPort(host, port)) return } func dialConn(ctx context.Context, addr string, opts *ConnOptions) (*Conn, error) { u, err := url.Parse(addr) if err != nil { return nil, err } host, port := u.Hostname(), u.Port() if port == "" { port = "5672" if u.Scheme == "amqps" || u.Scheme == "amqp+ssl" { port = "5671" } } var cp ConnOptions if opts != nil { cp = *opts } // prepend SASL credentials when the user/pass segment is not empty if u.User != nil { pass, _ := u.User.Password() cp.SASLType = SASLTypePlain(u.User.Username(), pass) } if cp.HostName == "" { cp.HostName = host } c, err := newConn(nil, &cp) if err != nil { return nil, err } switch u.Scheme { case "amqp", "": err = c.dialer.NetDialerDial(ctx, c, host, port) case "amqps", "amqp+ssl": c.initTLSConfig() c.tlsNegotiation = false err = c.dialer.TLSDialWithDialer(ctx, c, host, port) default: err = fmt.Errorf("unsupported scheme %q", u.Scheme) } if err != nil { return nil, err } return c, nil } func newConn(netConn net.Conn, opts *ConnOptions) (*Conn, error) { c := &Conn{ dialer: defaultDialer{}, net: netConn, maxFrameSize: defaultMaxFrameSize, peerMaxFrameSize: defaultMaxFrameSize, channelMax: defaultMaxSessions - 1, // -1 because channel-max starts at zero idleTimeout: defaultIdleTimeout, containerID: shared.RandString(40), done: make(chan struct{}), rxtxExit: make(chan struct{}), rxDone: make(chan struct{}), txFrame: make(chan frameEnvelope), txDone: make(chan struct{}), sessionsByChannel: map[uint16]*Session{}, writeTimeout: defaultWriteTimeout, } // apply options if opts == nil { opts = &ConnOptions{} } if opts.WriteTimeout > 0 { c.writeTimeout = opts.WriteTimeout } else if opts.WriteTimeout < 0 { c.writeTimeout = 0 } if opts.ContainerID != "" { c.containerID = opts.ContainerID } if opts.HostName != "" { c.hostname = opts.HostName } if opts.IdleTimeout > 0 { c.idleTimeout = opts.IdleTimeout } else if opts.IdleTimeout < 0 { c.idleTimeout = 0 } if opts.MaxFrameSize > 0 && opts.MaxFrameSize < 512 { return nil, fmt.Errorf("invalid MaxFrameSize value %d", opts.MaxFrameSize) } else if opts.MaxFrameSize > 512 { c.maxFrameSize = opts.MaxFrameSize } if opts.MaxSessions > 0 { c.channelMax = opts.MaxSessions } if opts.SASLType != nil { if err := opts.SASLType(c); err != nil { return nil, err } } if opts.Properties != nil { c.properties = make(map[encoding.Symbol]any) for key, val := range opts.Properties { c.properties[encoding.Symbol(key)] = val } } if opts.TLSConfig != nil { c.tlsConfig = opts.TLSConfig.Clone() } if opts.dialer != nil { c.dialer = opts.dialer } return c, nil } func (c *Conn) initTLSConfig() { // create a new config if not already set if c.tlsConfig == nil { c.tlsConfig = new(tls.Config) } // TLS config must have ServerName or InsecureSkipVerify set if c.tlsConfig.ServerName == "" && !c.tlsConfig.InsecureSkipVerify { c.tlsConfig.ServerName = c.hostname } } // start establishes the connection and begins multiplexing network IO. // It is an error to call Start() on a connection that's been closed. func (c *Conn) start(ctx context.Context) (err error) { // if the context has a deadline or is cancellable, start the interruptor goroutine. // this will close the underlying net.Conn in response to the context. if ctx.Done() != nil { done := make(chan struct{}) interruptRes := make(chan error, 1) defer func() { close(done) if ctxErr := <-interruptRes; ctxErr != nil { // return context error to caller err = ctxErr } }() go func() { select { case <-ctx.Done(): c.closeDuringStart() interruptRes <- ctx.Err() case <-done: interruptRes <- nil } }() } if err = c.startImpl(ctx); err != nil { return err } // we can't create the channel bitmap until the connection has been established. // this is because our peer can tell us the max channels they support. c.channels = bitmap.New(uint32(c.channelMax)) go c.connWriter() go c.connReader() return } func (c *Conn) startImpl(ctx context.Context) error { // set connection establishment deadline as required if deadline, ok := ctx.Deadline(); ok && !deadline.IsZero() { _ = c.net.SetDeadline(deadline) // remove connection establishment deadline defer func() { _ = c.net.SetDeadline(time.Time{}) }() } // run connection establishment state machine for state := c.negotiateProto; state != nil; { var err error state, err = state(ctx) // check if err occurred if err != nil { c.closeDuringStart() return err } } return nil } // Close closes the connection. func (c *Conn) Close() error { c.close() // wait until the reader/writer goroutines have exited before proceeding. // this is to prevent a race between calling Close() and a reader/writer // goroutine calling close() due to a terminal error. <-c.txDone <-c.rxDone var connErr *ConnError if errors.As(c.doneErr, &connErr) && connErr.RemoteErr == nil && connErr.inner == nil { // an empty ConnectionError means the connection was closed by the caller return nil } // there was an error during shut-down or connReader/connWriter // experienced a terminal error return c.doneErr } // close is called once, either from Close() or when connReader/connWriter exits func (c *Conn) close() { c.closeOnce.Do(func() { defer close(c.done) close(c.rxtxExit) // wait for writing to stop, allows it to send the final close frame <-c.txDone closeErr := c.net.Close() // check rxDone after closing net, otherwise may block // for up to c.idleTimeout <-c.rxDone if errors.Is(c.rxErr, net.ErrClosed) { // this is the expected error when the connection is closed, swallow it c.rxErr = nil } if c.txErr == nil && c.rxErr == nil && closeErr == nil { // if there are no errors, it means user initiated close() and we shut down cleanly c.doneErr = &ConnError{} } else if amqpErr, ok := c.rxErr.(*Error); ok { // we experienced a peer-initiated close that contained an Error. return it c.doneErr = &ConnError{RemoteErr: amqpErr} } else if c.txErr != nil { // c.txErr is already wrapped in a ConnError c.doneErr = c.txErr } else if c.rxErr != nil { c.doneErr = &ConnError{inner: c.rxErr} } else { c.doneErr = &ConnError{inner: closeErr} } }) } // closeDuringStart is a special close to be used only during startup (i.e. c.start() and any of its children) func (c *Conn) closeDuringStart() { c.closeOnce.Do(func() { c.net.Close() }) } // NewSession starts a new session on the connection. // - ctx controls waiting for the peer to acknowledge the session // - opts contains optional values, pass nil to accept the defaults // // If the context's deadline expires or is cancelled before the operation // completes, an error is returned. If the Session was successfully // created, it will be cleaned up in future calls to NewSession. func (c *Conn) NewSession(ctx context.Context, opts *SessionOptions) (*Session, error) { // clean up any abandoned sessions first if err := c.freeAbandonedSessions(ctx); err != nil { return nil, err } session, err := c.newSession(opts) if err != nil { return nil, err } if err := session.begin(ctx); err != nil { c.abandonSession(session) return nil, err } return session, nil } func (c *Conn) freeAbandonedSessions(ctx context.Context) error { c.abandonedSessionsMu.Lock() defer c.abandonedSessionsMu.Unlock() debug.Log(3, "TX (Conn %p): cleaning up %d abandoned sessions", c, len(c.abandonedSessions)) for _, s := range c.abandonedSessions { fr := frames.PerformEnd{} if err := s.txFrameAndWait(ctx, &fr); err != nil { return err } } c.abandonedSessions = nil return nil } func (c *Conn) newSession(opts *SessionOptions) (*Session, error) { c.sessionsByChannelMu.Lock() defer c.sessionsByChannelMu.Unlock() // create the next session to allocate // note that channel always start at 0 channel, ok := c.channels.Next() if !ok { if err := c.Close(); err != nil { return nil, err } return nil, &ConnError{inner: fmt.Errorf("reached connection channel max (%d)", c.channelMax)} } session := newSession(c, uint16(channel), opts) c.sessionsByChannel[session.channel] = session return session, nil } func (c *Conn) deleteSession(s *Session) { c.sessionsByChannelMu.Lock() defer c.sessionsByChannelMu.Unlock() delete(c.sessionsByChannel, s.channel) c.channels.Remove(uint32(s.channel)) } func (c *Conn) abandonSession(s *Session) { c.abandonedSessionsMu.Lock() defer c.abandonedSessionsMu.Unlock() c.abandonedSessions = append(c.abandonedSessions, s) } // connReader reads from the net.Conn, decodes frames, and either handles // them here as appropriate or sends them to the session.rx channel. func (c *Conn) connReader() { defer func() { close(c.rxDone) c.close() }() var sessionsByRemoteChannel = make(map[uint16]*Session) var err error for { if err != nil { debug.Log(0, "RX (connReader %p): terminal error: %v", c, err) c.rxErr = err return } var fr frames.Frame fr, err = c.readFrame() if err != nil { continue } debug.Log(0, "RX (connReader %p): %s", c, fr) var ( session *Session ok bool ) switch body := fr.Body.(type) { // Server initiated close. case *frames.PerformClose: // connWriter will send the close performative ack on its way out. // it's a SHOULD though, not a MUST. if body.Error == nil { return } err = body.Error continue // RemoteChannel should be used when frame is Begin case *frames.PerformBegin: if body.RemoteChannel == nil { // since we only support remotely-initiated sessions, this is an error // TODO: it would be ideal to not have this kill the connection err = fmt.Errorf("%T: nil RemoteChannel", fr.Body) continue } c.sessionsByChannelMu.RLock() session, ok = c.sessionsByChannel[*body.RemoteChannel] c.sessionsByChannelMu.RUnlock() if !ok { // this can happen if NewSession() exits due to the context expiring/cancelled // before the begin ack is received. err = fmt.Errorf("unexpected remote channel number %d", *body.RemoteChannel) continue } session.remoteChannel = fr.Channel sessionsByRemoteChannel[fr.Channel] = session case *frames.PerformEnd: session, ok = sessionsByRemoteChannel[fr.Channel] if !ok { err = fmt.Errorf("%T: didn't find channel %d in sessionsByRemoteChannel (PerformEnd)", fr.Body, fr.Channel) continue } // we MUST remove the remote channel from our map as soon as we receive // the ack (i.e. before passing it on to the session mux) on the session // ending since the numbers are recycled. delete(sessionsByRemoteChannel, fr.Channel) c.deleteSession(session) default: // pass on performative to the correct session session, ok = sessionsByRemoteChannel[fr.Channel] if !ok { err = fmt.Errorf("%T: didn't find channel %d in sessionsByRemoteChannel", fr.Body, fr.Channel) continue } } q := session.rxQ.Acquire() q.Enqueue(fr.Body) session.rxQ.Release(q) debug.Log(2, "RX (connReader %p): mux frame to Session (%p): %s", c, session, fr) } } // readFrame reads a complete frame from c.net. // it assumes that any read deadline has already been applied. // used externally by SASL only. func (c *Conn) readFrame() (frames.Frame, error) { switch { // Cheaply reuse free buffer space when fully read. case c.rxBuf.Len() == 0: c.rxBuf.Reset() // Prevent excessive/unbounded growth by shifting data to beginning of buffer. case int64(c.rxBuf.Size()) > int64(c.maxFrameSize): c.rxBuf.Reclaim() } var ( currentHeader frames.Header // keep track of the current header, for frames split across multiple TCP packets frameInProgress bool // true if in the middle of receiving data for currentHeader ) for { // need to read more if buf doesn't contain the complete frame // or there's not enough in buf to parse the header if frameInProgress || c.rxBuf.Len() < frames.HeaderSize { // we MUST reset the idle timeout before each read from net.Conn if c.idleTimeout > 0 { _ = c.net.SetReadDeadline(time.Now().Add(c.idleTimeout)) } err := c.rxBuf.ReadFromOnce(c.net) if err != nil { return frames.Frame{}, err } } // read more if buf doesn't contain enough to parse the header if c.rxBuf.Len() < frames.HeaderSize { continue } // parse the header if a frame isn't in progress if !frameInProgress { var err error currentHeader, err = frames.ParseHeader(&c.rxBuf) if err != nil { return frames.Frame{}, err } frameInProgress = true } // check size is reasonable if currentHeader.Size > math.MaxInt32 { // make max size configurable return frames.Frame{}, errors.New("payload too large") } bodySize := int64(currentHeader.Size - frames.HeaderSize) // the full frame hasn't been received, keep reading if int64(c.rxBuf.Len()) < bodySize { continue } frameInProgress = false // check if body is empty (keepalive) if bodySize == 0 { debug.Log(3, "RX (connReader %p): received keep-alive frame", c) continue } // parse the frame b, ok := c.rxBuf.Next(bodySize) if !ok { return frames.Frame{}, fmt.Errorf("buffer EOF; requested bytes: %d, actual size: %d", bodySize, c.rxBuf.Len()) } parsedBody, err := frames.ParseBody(buffer.New(b)) if err != nil { return frames.Frame{}, err } return frames.Frame{Channel: currentHeader.Channel, Body: parsedBody}, nil } } // frameContext is an extended context.Context used to track writes to the network. // this is required in order to remove ambiguities that can arise when simply waiting // on context.Context.Done() to be signaled. type frameContext struct { // Ctx contains the caller's context and is used to set the write deadline. Ctx context.Context // Done is closed when the frame was successfully written to net.Conn or Ctx was cancelled/timed out. // Can be nil, but shouldn't be for callers that care about confirmation of sending. Done chan struct{} // Err contains the context error. MUST be set before closing Done and ONLY read if Done is closed. // ONLY Conn.connWriter may write to this field. Err error } // frameEnvelope is used when sending a frame to connWriter to be written to net.Conn type frameEnvelope struct { FrameCtx *frameContext Frame frames.Frame } func (c *Conn) connWriter() { defer func() { close(c.txDone) c.close() }() var ( // keepalives are sent at a rate of 1/2 idle timeout keepaliveInterval = c.peerIdleTimeout / 2 // 0 disables keepalives keepalivesEnabled = keepaliveInterval > 0 // set if enable, nil if not; nil channels block forever keepalive <-chan time.Time ) if keepalivesEnabled { ticker := time.NewTicker(keepaliveInterval) defer ticker.Stop() keepalive = ticker.C } var err error for { if err != nil { debug.Log(0, "TX (connWriter %p): terminal error: %v", c, err) c.txErr = err return } select { // frame write request case env := <-c.txFrame: timeout, ctxErr := c.getWriteTimeout(env.FrameCtx.Ctx) if ctxErr != nil { debug.Log(1, "TX (connWriter %p) getWriteTimeout: %s: %s", c, ctxErr.Error(), env.Frame) if env.FrameCtx.Done != nil { // the error MUST be set before closing the channel env.FrameCtx.Err = ctxErr close(env.FrameCtx.Done) } continue } debug.Log(0, "TX (connWriter %p) timeout %s: %s", c, timeout, env.Frame) err = c.writeFrame(timeout, env.Frame) if err == nil && env.FrameCtx.Done != nil { close(env.FrameCtx.Done) } // in the event of write failure, Conn will close and a // *ConnError will be propagated to all of the sessions/link. // keepalive timer case <-keepalive: debug.Log(3, "TX (connWriter %p): sending keep-alive frame", c) _ = c.net.SetWriteDeadline(time.Now().Add(c.writeTimeout)) if _, err = c.net.Write(keepaliveFrame); err != nil { err = &ConnError{inner: err} } // It would be slightly more efficient in terms of network // resources to reset the timer each time a frame is sent. // However, keepalives are small (8 bytes) and the interval // is usually on the order of minutes. It does not seem // worth it to add extra operations in the write path to // avoid. (To properly reset a timer it needs to be stopped, // possibly drained, then reset.) // connection complete case <-c.rxtxExit: // send close performative. note that the spec says we // SHOULD wait for the ack but we don't HAVE to, in order // to be resilient to bad actors etc. so we just send // the close performative and exit. fr := frames.Frame{ Type: frames.TypeAMQP, Body: &frames.PerformClose{}, } debug.Log(1, "TX (connWriter %p): %s", c, fr) c.txErr = c.writeFrame(c.writeTimeout, fr) return } } } // writeFrame writes a frame to the network. // used externally by SASL only. // - timeout - the write deadline to set. zero means no deadline // // errors are wrapped in a ConnError as they can be returned to outside callers. func (c *Conn) writeFrame(timeout time.Duration, fr frames.Frame) error { // writeFrame into txBuf c.txBuf.Reset() err := frames.Write(&c.txBuf, fr) if err != nil { return &ConnError{inner: err} } // validate the frame isn't exceeding peer's max frame size requiredFrameSize := c.txBuf.Len() if uint64(requiredFrameSize) > uint64(c.peerMaxFrameSize) { return &ConnError{inner: fmt.Errorf("%T frame size %d larger than peer's max frame size %d", fr, requiredFrameSize, c.peerMaxFrameSize)} } if timeout == 0 { _ = c.net.SetWriteDeadline(time.Time{}) } else if timeout > 0 { _ = c.net.SetWriteDeadline(time.Now().Add(timeout)) } // write to network n, err := c.net.Write(c.txBuf.Bytes()) if l := c.txBuf.Len(); n > 0 && n < l && err != nil { debug.Log(1, "TX (writeFrame %p): wrote %d bytes less than len %d: %v", c, n, l, err) } if err != nil { err = &ConnError{inner: err} } return err } // writeProtoHeader writes an AMQP protocol header to the // network func (c *Conn) writeProtoHeader(pID protoID) error { _, err := c.net.Write([]byte{'A', 'M', 'Q', 'P', byte(pID), 1, 0, 0}) return err } // keepaliveFrame is an AMQP frame with no body, used for keepalives var keepaliveFrame = []byte{0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00} // SendFrame is used by sessions and links to send frames across the network. func (c *Conn) sendFrame(frameEnv frameEnvelope) { select { case c.txFrame <- frameEnv: debug.Log(2, "TX (Conn %p): mux frame to connWriter: %s", c, frameEnv.Frame) case <-c.done: // Conn has closed } } // stateFunc is a state in a state machine. // // The state is advanced by returning the next state. // The state machine concludes when nil is returned. type stateFunc func(context.Context) (stateFunc, error) // negotiateProto determines which proto to negotiate next. // used externally by SASL only. func (c *Conn) negotiateProto(ctx context.Context) (stateFunc, error) { // in the order each must be negotiated switch { case c.tlsNegotiation && !c.tlsComplete: return c.exchangeProtoHeader(protoTLS) case c.saslHandlers != nil && !c.saslComplete: return c.exchangeProtoHeader(protoSASL) default: return c.exchangeProtoHeader(protoAMQP) } } type protoID uint8 // protocol IDs received in protoHeaders const ( protoAMQP protoID = 0x0 protoTLS protoID = 0x2 protoSASL protoID = 0x3 ) // exchangeProtoHeader performs the round trip exchange of protocol // headers, validation, and returns the protoID specific next state. func (c *Conn) exchangeProtoHeader(pID protoID) (stateFunc, error) { // write the proto header if err := c.writeProtoHeader(pID); err != nil { return nil, err } // read response header p, err := c.readProtoHeader() if err != nil { return nil, err } if pID != p.ProtoID { return nil, fmt.Errorf("unexpected protocol header %#00x, expected %#00x", p.ProtoID, pID) } // go to the proto specific state switch pID { case protoAMQP: return c.openAMQP, nil case protoTLS: return c.startTLS, nil case protoSASL: return c.negotiateSASL, nil default: return nil, fmt.Errorf("unknown protocol ID %#02x", p.ProtoID) } } // readProtoHeader reads a protocol header packet from c.rxProto. func (c *Conn) readProtoHeader() (protoHeader, error) { const protoHeaderSize = 8 // only read from the network once our buffer has been exhausted. // TODO: this preserves existing behavior as some tests rely on this // implementation detail (it lets you replay a stream of bytes). we // might want to consider removing this and fixing the tests as the // protocol doesn't actually work this way. if c.rxBuf.Len() == 0 { for { err := c.rxBuf.ReadFromOnce(c.net) if err != nil { return protoHeader{}, err } // read more if buf doesn't contain enough to parse the header if c.rxBuf.Len() >= protoHeaderSize { break } } } buf, ok := c.rxBuf.Next(protoHeaderSize) if !ok { return protoHeader{}, errors.New("invalid protoHeader") } // bounds check hint to compiler; see golang.org/issue/14808 _ = buf[protoHeaderSize-1] if !bytes.Equal(buf[:4], []byte{'A', 'M', 'Q', 'P'}) { return protoHeader{}, fmt.Errorf("unexpected protocol %q", buf[:4]) } p := protoHeader{ ProtoID: protoID(buf[4]), Major: buf[5], Minor: buf[6], Revision: buf[7], } if p.Major != 1 || p.Minor != 0 || p.Revision != 0 { return protoHeader{}, fmt.Errorf("unexpected protocol version %d.%d.%d", p.Major, p.Minor, p.Revision) } return p, nil } // startTLS wraps the conn with TLS and returns to Client.negotiateProto func (c *Conn) startTLS(ctx context.Context) (stateFunc, error) { c.initTLSConfig() _ = c.net.SetReadDeadline(time.Time{}) // clear timeout // wrap existing net.Conn and perform TLS handshake tlsConn := tls.Client(c.net, c.tlsConfig) if err := tlsConn.HandshakeContext(ctx); err != nil { return nil, err } // swap net.Conn c.net = tlsConn c.tlsComplete = true // go to next protocol return c.negotiateProto, nil } // openAMQP round trips the AMQP open performative func (c *Conn) openAMQP(ctx context.Context) (stateFunc, error) { // send open frame open := &frames.PerformOpen{ ContainerID: c.containerID, Hostname: c.hostname, MaxFrameSize: c.maxFrameSize, ChannelMax: c.channelMax, IdleTimeout: c.idleTimeout / 2, // per spec, advertise half our idle timeout Properties: c.properties, } fr := frames.Frame{ Type: frames.TypeAMQP, Body: open, Channel: 0, } debug.Log(1, "TX (openAMQP %p): %s", c, fr) timeout, err := c.getWriteTimeout(ctx) if err != nil { return nil, err } if err = c.writeFrame(timeout, fr); err != nil { return nil, err } // get the response fr, err = c.readSingleFrame() if err != nil { return nil, err } debug.Log(1, "RX (openAMQP %p): %s", c, fr) o, ok := fr.Body.(*frames.PerformOpen) if !ok { return nil, fmt.Errorf("openAMQP: unexpected frame type %T", fr.Body) } // update peer settings if o.MaxFrameSize > 0 { c.peerMaxFrameSize = o.MaxFrameSize } if o.IdleTimeout > 0 { // TODO: reject very small idle timeouts c.peerIdleTimeout = o.IdleTimeout } if o.ChannelMax < c.channelMax { c.channelMax = o.ChannelMax } // connection established, exit state machine return nil, nil } // negotiateSASL returns the SASL handler for the first matched // mechanism specified by the server func (c *Conn) negotiateSASL(context.Context) (stateFunc, error) { // read mechanisms frame fr, err := c.readSingleFrame() if err != nil { return nil, err } debug.Log(1, "RX (negotiateSASL %p): %s", c, fr) sm, ok := fr.Body.(*frames.SASLMechanisms) if !ok { return nil, fmt.Errorf("negotiateSASL: unexpected frame type %T", fr.Body) } // return first match in c.saslHandlers based on order received for _, mech := range sm.Mechanisms { if state, ok := c.saslHandlers[mech]; ok { return state, nil } } // no match return nil, fmt.Errorf("no supported auth mechanism (%v)", sm.Mechanisms) // TODO: send "auth not supported" frame? } // saslOutcome processes the SASL outcome frame and return Client.negotiateProto // on success. // // SASL handlers return this stateFunc when the mechanism specific negotiation // has completed. // used externally by SASL only. func (c *Conn) saslOutcome(context.Context) (stateFunc, error) { // read outcome frame fr, err := c.readSingleFrame() if err != nil { return nil, err } debug.Log(1, "RX (saslOutcome %p): %s", c, fr) so, ok := fr.Body.(*frames.SASLOutcome) if !ok { return nil, fmt.Errorf("saslOutcome: unexpected frame type %T", fr.Body) } // check if auth succeeded if so.Code != encoding.CodeSASLOK { return nil, fmt.Errorf("SASL PLAIN auth failed with code %#00x: %s", so.Code, so.AdditionalData) // implement Stringer for so.Code } // return to c.negotiateProto c.saslComplete = true return c.negotiateProto, nil } // readSingleFrame is used during connection establishment to read a single frame. // // After setup, conn.connReader handles incoming frames. func (c *Conn) readSingleFrame() (frames.Frame, error) { fr, err := c.readFrame() if err != nil { return frames.Frame{}, err } return fr, nil } // getWriteTimeout returns the timeout as calculated from the context's deadline // or the default write timeout if the context has no deadline. // if the context has timed out or was cancelled, an error is returned. func (c *Conn) getWriteTimeout(ctx context.Context) (time.Duration, error) { if ctx.Err() != nil { // if the context is already cancelled we can just bail. return 0, ctx.Err() } if deadline, ok := ctx.Deadline(); ok { until := time.Until(deadline) if until <= 0 { return 0, context.DeadlineExceeded } return until, nil } return c.writeTimeout, nil } type protoHeader struct { ProtoID protoID Major uint8 Minor uint8 Revision uint8 } golang-github-azure-go-amqp-1.0.2/conn_test.go000066400000000000000000000746261454613650200212740ustar00rootroot00000000000000package amqp import ( "context" "crypto/tls" "errors" "fmt" "math" "testing" "time" "github.com/Azure/go-amqp/internal/encoding" "github.com/Azure/go-amqp/internal/fake" "github.com/Azure/go-amqp/internal/frames" "github.com/Azure/go-amqp/internal/test" "github.com/stretchr/testify/require" ) func TestConnOptions(t *testing.T) { tests := []struct { label string opts ConnOptions verify func(t *testing.T, c *Conn) fails bool }{ { label: "no options", verify: func(t *testing.T, c *Conn) {}, }, { label: "multiple properties", opts: ConnOptions{ Properties: map[string]any{ "x-opt-test1": "test3", "x-opt-test2": "test2", }, }, verify: func(t *testing.T, c *Conn) { wantProperties := map[encoding.Symbol]any{ "x-opt-test1": "test3", "x-opt-test2": "test2", } if !test.Equal(c.properties, wantProperties) { require.Equal(t, wantProperties, c.properties) } }, }, { label: "ConnServerHostname", opts: ConnOptions{ HostName: "testhost", }, verify: func(t *testing.T, c *Conn) { if c.hostname != "testhost" { t.Errorf("unexpected host name %s", c.hostname) } }, }, { label: "ConnTLSConfig", opts: ConnOptions{ TLSConfig: &tls.Config{MinVersion: tls.VersionTLS13}, }, verify: func(t *testing.T, c *Conn) { if c.tlsConfig.MinVersion != tls.VersionTLS13 { t.Errorf("unexpected TLS min version %d", c.tlsConfig.MinVersion) } }, }, { label: "ConnIdleTimeout_Valid", opts: ConnOptions{ IdleTimeout: 15 * time.Minute, }, verify: func(t *testing.T, c *Conn) { if c.idleTimeout != 15*time.Minute { t.Errorf("unexpected idle timeout %s", c.idleTimeout) } }, }, { label: "ConnIdleTimeout_Invalid", fails: true, opts: ConnOptions{ IdleTimeout: -15 * time.Minute, }, }, { label: "ConnMaxFrameSize_Valid", opts: ConnOptions{ MaxFrameSize: 1024, }, verify: func(t *testing.T, c *Conn) { if c.maxFrameSize != 1024 { t.Errorf("unexpected max frame size %d", c.maxFrameSize) } }, }, { label: "ConnMaxFrameSize_Invalid", fails: true, opts: ConnOptions{ MaxFrameSize: 128, }, }, { label: "ConnMaxSessions_Success", opts: ConnOptions{ MaxSessions: 32768, }, verify: func(t *testing.T, c *Conn) { if c.channelMax != 32768 { t.Errorf("unexpected session count %d", c.channelMax) } }, }, { label: "ConnMaxSessions_TooSmall", fails: true, opts: ConnOptions{ MaxSessions: 0, }, }, { label: "ConnContainerID", opts: ConnOptions{ ContainerID: "myid", }, verify: func(t *testing.T, c *Conn) { if c.containerID != "myid" { t.Errorf("unexpected container ID %s", c.containerID) } }, }, } for _, tt := range tests { t.Run(tt.label, func(t *testing.T) { got, err := newConn(nil, &tt.opts) if err != nil && !tt.fails { t.Fatal(err) } if !tt.fails { tt.verify(t, got) } }) } } type fakeDialer struct { fail bool } func (f fakeDialer) NetDialerDial(ctx context.Context, c *Conn, host, port string) (err error) { err = f.error() return } func (f fakeDialer) TLSDialWithDialer(ctx context.Context, c *Conn, host, port string) (err error) { err = f.error() return } func (f fakeDialer) error() error { if f.fail { return errors.New("failed") } return nil } func TestDialConn(t *testing.T) { c, err := dialConn(context.Background(), ":bad url/ value", &ConnOptions{dialer: fakeDialer{}}) require.Error(t, err) require.Nil(t, c) c, err = dialConn(context.Background(), "http://localhost", &ConnOptions{dialer: fakeDialer{}}) require.Error(t, err) require.Nil(t, c) c, err = dialConn(context.Background(), "amqp://localhost", &ConnOptions{dialer: fakeDialer{}}) require.NoError(t, err) require.NotNil(t, c) require.Nil(t, c.tlsConfig) c, err = dialConn(context.Background(), "amqps://localhost", &ConnOptions{dialer: fakeDialer{}}) require.NoError(t, err) require.NotNil(t, c) require.NotNil(t, c.tlsConfig) c, err = dialConn(context.Background(), "amqp://localhost:12345", &ConnOptions{dialer: fakeDialer{}}) require.NoError(t, err) require.NotNil(t, c) c, err = dialConn(context.Background(), "amqp://username:password@localhost", &ConnOptions{dialer: fakeDialer{}}) require.NoError(t, err) require.NotNil(t, c) if _, ok := c.saslHandlers[saslMechanismPLAIN]; !ok { t.Fatal("missing SASL plain handler") } c, err = dialConn(context.Background(), "amqp://localhost", &ConnOptions{dialer: fakeDialer{fail: true}}) require.Error(t, err) require.Nil(t, c) } func TestStart(t *testing.T) { tests := []struct { label string fails bool responder func(uint16, frames.FrameBody) (fake.Response, error) }{ { label: "bad header", fails: true, responder: func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } }, }, { label: "incorrect version", fails: true, responder: func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } }, }, { label: "failed PerformOpen", fails: true, responder: func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return fake.Response{}, errors.New("mock write failure") default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } }, }, { label: "unexpected PerformOpen response", fails: true, responder: func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformBegin(0, 1)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } }, }, { label: "success", responder: func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } }, }, } for _, tt := range tests { t.Run(tt.label, func(t *testing.T) { netConn := fake.NewNetConn(tt.responder) conn, err := newConn(netConn, nil) require.NoError(t, err) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) err = conn.start(ctx) cancel() if tt.fails { require.Error(t, err) // verify that the conn was closed err := netConn.Close() require.ErrorIs(t, err, fake.ErrAlreadyClosed) } else { require.NoError(t, err) // verify that the conn wasn't closed err := netConn.Close() require.NoError(t, err) } }) } } func TestClose(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) conn, err := newConn(netConn, nil) require.NoError(t, err) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) require.NoError(t, conn.start(ctx)) cancel() require.NoError(t, conn.Close()) // with Close error netConn = fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) conn, err = newConn(netConn, nil) require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) require.NoError(t, conn.start(ctx)) cancel() netConn.OnClose = func() error { return errors.New("mock close failed") } // wait a bit for connReader to read from the mock time.Sleep(100 * time.Millisecond) require.Error(t, conn.Close()) } func TestServerSideClose(t *testing.T) { closeReceived := make(chan struct{}) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformClose: close(closeReceived) return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) conn, err := newConn(netConn, nil) require.NoError(t, err) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) require.NoError(t, conn.start(ctx)) cancel() fr, err := fake.PerformClose(nil) require.NoError(t, err) netConn.SendFrame(fr) <-closeReceived err = conn.Close() require.NoError(t, err) // with error closeReceived = make(chan struct{}) netConn = fake.NewNetConn(responder) conn, err = newConn(netConn, nil) require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) require.NoError(t, conn.start(ctx)) cancel() fr, err = fake.PerformClose(&Error{Condition: "Close", Description: "mock server error"}) require.NoError(t, err) netConn.SendFrame(fr) <-closeReceived err = conn.Close() var connErr *ConnError require.ErrorAs(t, err, &connErr) require.Equal(t, "*Error{Condition: Close, Description: mock server error, Info: map[]}", connErr.Error()) } func TestKeepAlives(t *testing.T) { // closing conn can race with keep-alive ticks, so sometimes we get // two in this test. the test needs to receive at least one keep-alive, // so use a buffered channel to absorb any extras. keepAlives := make(chan struct{}, 3) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: // specify small idle timeout so we receive a lot of keep-alives return newResponse(fake.EncodeFrame(frames.TypeAMQP, 0, &frames.PerformOpen{ContainerID: "container", IdleTimeout: 100 * time.Millisecond})) case *fake.KeepAlive: keepAlives <- struct{}{} return fake.Response{}, nil case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) conn, err := newConn(netConn, nil) require.NoError(t, err) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) require.NoError(t, conn.start(ctx)) cancel() // send keepalive netConn.SendKeepAlive() ctx, cancel = context.WithTimeout(context.Background(), time.Second) defer cancel() select { case <-keepAlives: // got keep-alive case <-ctx.Done(): t.Fatal("didn't receive any keepalive frames") } require.NoError(t, conn.Close()) } func TestKeepAlivesIdleTimeout(t *testing.T) { start := make(chan struct{}) done := make(chan struct{}) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: close(start) return newResponse(fake.EncodeFrame(frames.TypeAMQP, 0, &frames.PerformOpen{ContainerID: "container", IdleTimeout: time.Minute})) case *fake.KeepAlive: return fake.Response{}, nil case *frames.PerformClose: close(done) return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } const idleTimeout = 100 * time.Millisecond netConn := fake.NewNetConn(responder) conn, err := newConn(netConn, &ConnOptions{ IdleTimeout: idleTimeout, }) require.NoError(t, err) go func() { <-start for { select { case <-time.After(idleTimeout / 2): netConn.SendKeepAlive() case <-done: return } } }() ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) require.NoError(t, conn.start(ctx)) cancel() time.Sleep(2 * idleTimeout) require.NoError(t, conn.Close()) } func TestConnReaderError(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) conn, err := newConn(netConn, nil) require.NoError(t, err) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) require.NoError(t, conn.start(ctx)) cancel() // trigger some kind of error netConn.ReadErr <- errors.New("failed") // wait a bit for the connReader goroutine to read from the mock time.Sleep(100 * time.Millisecond) err = conn.Close() var connErr *ConnError if !errors.As(err, &connErr) { t.Fatalf("unexpected error type %T", err) } } func TestConnWriterError(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) conn, err := newConn(netConn, nil) require.NoError(t, err) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) require.NoError(t, conn.start(ctx)) cancel() netConn.WriteErr <- errors.New("boom") // wait a bit for connReader to read from the mock time.Sleep(100 * time.Millisecond) err = conn.Close() var connErr *ConnError if !errors.As(err, &connErr) { t.Fatalf("unexpected error type %T", err) } } func TestConnWithZeroByteReads(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) netConn.SendFrame([]byte{}) conn, err := newConn(netConn, nil) require.NoError(t, err) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) require.NoError(t, conn.start(ctx)) cancel() require.NoError(t, conn.Close()) } func TestConnNegotiationTimeout(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { return fake.Response{}, nil } netConn := fake.NewNetConn(responder) conn, err := newConn(netConn, nil) require.NoError(t, err) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) require.ErrorIs(t, conn.start(ctx), context.DeadlineExceeded) cancel() } type mockDialer struct { resp func(uint16, frames.FrameBody) (fake.Response, error) } func (m mockDialer) NetDialerDial(ctx context.Context, c *Conn, host, port string) error { c.net = fake.NewNetConn(m.resp) return nil } func (mockDialer) TLSDialWithDialer(ctx context.Context, c *Conn, host, port string) error { panic("nyi") } func TestClientDial(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := Dial(ctx, "amqp://localhost", &ConnOptions{dialer: mockDialer{resp: responder}}) cancel() require.NoError(t, err) require.NotNil(t, client) // error case responder = func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return fake.Response{}, errors.New("mock read failed") default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) client, err = Dial(ctx, "amqp://localhost", &ConnOptions{dialer: mockDialer{resp: responder}}) cancel() require.Error(t, err) require.Nil(t, client) } func TestClientClose(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := Dial(ctx, "amqp://localhost", &ConnOptions{dialer: mockDialer{resp: responder}}) cancel() require.NoError(t, err) require.NotNil(t, client) require.NoError(t, client.Close()) require.NoError(t, client.Close()) } func TestSessionOptions(t *testing.T) { tests := []struct { label string opt SessionOptions verify func(t *testing.T, s *Session) }{ { label: "SessionMaxLinks", opt: SessionOptions{ MaxLinks: 4096, }, verify: func(t *testing.T, s *Session) { if s.handleMax != 4096-1 { t.Errorf("unexpected max links %d", s.handleMax) } }, }, } for _, tt := range tests { t.Run(tt.label, func(t *testing.T) { session := newSession(nil, 0, &tt.opt) tt.verify(t, session) }) } } func TestClientNewSession(t *testing.T) { const channelNum = 0 responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch tt := req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: if tt.RemoteChannel != nil { return fake.Response{}, errors.New("expected nil remote channel") } return newResponse(fake.PerformBegin(channelNum, remoteChannel)) case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) require.NotNil(t, session) require.Equal(t, uint16(channelNum), session.channel) require.NoError(t, client.Close()) // creating a session after the connection has been closed returns nothing ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err = client.NewSession(ctx, nil) cancel() var connErr *ConnError if !errors.As(err, &connErr) { t.Fatalf("unexpected error type %T", err) } require.Equal(t, "amqp: connection closed", connErr.Error()) require.Nil(t, session) } func TestClientMultipleSessions(t *testing.T) { channelNum := uint16(0) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: b, err := fake.PerformBegin(channelNum, remoteChannel) if err != nil { return fake.Response{}, err } channelNum++ return fake.Response{Payload: b}, nil case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) // first session ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session1, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) require.NotNil(t, session1) require.Equal(t, channelNum-1, session1.channel) // second session ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session2, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) require.NotNil(t, session2) require.Equal(t, channelNum-1, session2.channel) require.NoError(t, client.Close()) } func TestClientTooManySessions(t *testing.T) { channelNum := uint16(0) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: // return small number of max channels return newResponse(fake.EncodeFrame(frames.TypeAMQP, 0, &frames.PerformOpen{ ChannelMax: 1, ContainerID: "test", IdleTimeout: time.Minute, MaxFrameSize: 4294967295, })) case *frames.PerformBegin: b, err := fake.PerformBegin(channelNum, remoteChannel) if err != nil { return fake.Response{}, err } channelNum++ return fake.Response{Payload: b}, nil case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) for i := uint16(0); i < 3; i++ { ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() if i < 2 { require.NoError(t, err) require.NotNil(t, session) } else { // third channel should fail require.Error(t, err) require.Nil(t, session) } } require.NoError(t, client.Close()) } func TestClientNewSessionMissingRemoteChannel(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: // return begin with nil RemoteChannel return newResponse(fake.EncodeFrame(frames.TypeAMQP, 0, &frames.PerformBegin{ NextOutgoingID: 1, IncomingWindow: 5000, OutgoingWindow: 1000, HandleMax: math.MaxInt16, })) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, &SessionOptions{ MaxLinks: 1, }) cancel() require.Error(t, err) require.Nil(t, session) require.Error(t, client.Close()) } func TestClientNewSessionInvalidInitialResponse(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: // respond with the wrong frame type return newResponse(fake.PerformOpen("bad")) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.Error(t, err) require.Nil(t, session) } func TestClientNewSessionInvalidSecondResponseSameChannel(t *testing.T) { firstChan := true responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) case *frames.PerformBegin: if firstChan { firstChan = false return newResponse(fake.PerformBegin(0, remoteChannel)) } // respond with the wrong frame type return newResponse(fake.PerformOpen("bad")) case *frames.PerformEnd: return newResponse(fake.PerformEnd(0, nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) // fisrt session succeeds ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) require.NotNil(t, session) // second session fails - times out as the ack is never received ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err = client.NewSession(ctx, nil) cancel() require.Error(t, err) require.Nil(t, session) require.ErrorIs(t, err, context.DeadlineExceeded) require.NoError(t, client.Close()) } func TestClientNewSessionInvalidSecondResponseDifferentChannel(t *testing.T) { firstChan := true responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: if firstChan { firstChan = false return newResponse(fake.PerformBegin(0, remoteChannel)) } // respond with the wrong frame type // note that it has to be for the next channel return newResponse(fake.PerformDisposition(encoding.RoleSender, 1, 0, nil, nil)) case *frames.PerformEnd: return newResponse(fake.PerformEnd(0, nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) // fisrt session succeeds ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) require.NotNil(t, session) // second session fails ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err = client.NewSession(ctx, nil) cancel() require.Error(t, err) require.Nil(t, session) require.Error(t, client.Close()) } func TestNewSessionTimedOut(t *testing.T) { var sessionCount uint32 responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) case *frames.PerformBegin: if sessionCount == 0 { sessionCount++ fr, err := fake.PerformBegin(0, remoteChannel) if err != nil { return fake.Response{}, err } // include a write delay so NewSession times out return fake.Response{Payload: fr, WriteDelay: 100 * time.Millisecond}, nil } return newResponse(fake.PerformBegin(1, remoteChannel)) case *frames.PerformEnd: return newResponse(fake.PerformEnd(0, nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) // fisrt session fails due to deadline exceeded ctx, cancel = context.WithTimeout(context.Background(), 20*time.Millisecond) session, err := client.NewSession(ctx, nil) cancel() require.ErrorIs(t, err, context.DeadlineExceeded) require.Nil(t, session) // should have one session to clean up require.Len(t, client.abandonedSessions, 1) require.Len(t, client.sessionsByChannel, 1) // creating a new session cleans up the old one ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err = client.NewSession(ctx, nil) cancel() require.NoError(t, err) require.NotNil(t, session) require.Empty(t, client.abandonedSessions) require.Len(t, client.sessionsByChannel, 1) } func TestNewSessionWriteError(t *testing.T) { endAck := make(chan struct{}) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: return fake.Response{}, errors.New("write error") case *frames.PerformEnd: close(endAck) return newResponse(fake.PerformEnd(0, nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) // fisrt session succeeds ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() var connErr *ConnError require.ErrorAs(t, err, &connErr) require.Equal(t, "write error", connErr.Error()) require.Nil(t, session) select { case <-time.After(time.Second): // expected case <-endAck: t.Fatal("unexpected ack") } } func TestGetWriteTimeout(t *testing.T) { conn, err := newConn(nil, nil) require.NoError(t, err) duration, err := conn.getWriteTimeout(context.Background()) require.NoError(t, err) require.EqualValues(t, defaultWriteTimeout, duration) ctx, cancel := context.WithCancel(context.Background()) duration, err = conn.getWriteTimeout(ctx) require.NoError(t, err) require.EqualValues(t, defaultWriteTimeout, duration) cancel() duration, err = conn.getWriteTimeout(ctx) require.ErrorIs(t, err, context.Canceled) require.Zero(t, duration) const timeout = 10 * time.Millisecond ctx, cancel = context.WithTimeout(context.Background(), timeout) duration, err = conn.getWriteTimeout(ctx) require.NoError(t, err) require.InDelta(t, timeout, duration, float64(time.Millisecond)) // sleep until after the timeout expires time.Sleep(2 * timeout) duration, err = conn.getWriteTimeout(ctx) require.ErrorIs(t, err, context.DeadlineExceeded) require.Zero(t, duration) cancel() } golang-github-azure-go-amqp-1.0.2/const.go000066400000000000000000000062601454613650200204130ustar00rootroot00000000000000package amqp import "github.com/Azure/go-amqp/internal/encoding" // Sender Settlement Modes const ( // Sender will send all deliveries initially unsettled to the receiver. SenderSettleModeUnsettled SenderSettleMode = encoding.SenderSettleModeUnsettled // Sender will send all deliveries settled to the receiver. SenderSettleModeSettled SenderSettleMode = encoding.SenderSettleModeSettled // Sender MAY send a mixture of settled and unsettled deliveries to the receiver. SenderSettleModeMixed SenderSettleMode = encoding.SenderSettleModeMixed ) // SenderSettleMode specifies how the sender will settle messages. type SenderSettleMode = encoding.SenderSettleMode func senderSettleModeValue(m *SenderSettleMode) SenderSettleMode { if m == nil { return SenderSettleModeMixed } return *m } // Receiver Settlement Modes const ( // Receiver is the first to consider the message as settled. // Once the corresponding disposition frame is sent, the message // is considered to be settled. ReceiverSettleModeFirst ReceiverSettleMode = encoding.ReceiverSettleModeFirst // Receiver is the second to consider the message as settled. // Once the corresponding disposition frame is sent, the settlement // is considered in-flight and the message will not be considered as // settled until the sender replies acknowledging the settlement. ReceiverSettleModeSecond ReceiverSettleMode = encoding.ReceiverSettleModeSecond ) // ReceiverSettleMode specifies how the receiver will settle messages. type ReceiverSettleMode = encoding.ReceiverSettleMode func receiverSettleModeValue(m *ReceiverSettleMode) ReceiverSettleMode { if m == nil { return ReceiverSettleModeFirst } return *m } // Durability Policies const ( // No terminus state is retained durably. DurabilityNone Durability = encoding.DurabilityNone // Only the existence and configuration of the terminus is // retained durably. DurabilityConfiguration Durability = encoding.DurabilityConfiguration // In addition to the existence and configuration of the // terminus, the unsettled state for durable messages is // retained durably. DurabilityUnsettledState Durability = encoding.DurabilityUnsettledState ) // Durability specifies the durability of a link. type Durability = encoding.Durability // Expiry Policies const ( // The expiry timer starts when terminus is detached. ExpiryPolicyLinkDetach ExpiryPolicy = encoding.ExpiryLinkDetach // The expiry timer starts when the most recently // associated session is ended. ExpiryPolicySessionEnd ExpiryPolicy = encoding.ExpirySessionEnd // The expiry timer starts when most recently associated // connection is closed. ExpiryPolicyConnectionClose ExpiryPolicy = encoding.ExpiryConnectionClose // The terminus never expires. ExpiryPolicyNever ExpiryPolicy = encoding.ExpiryNever ) // ExpiryPolicy specifies when the expiry timer of a terminus // starts counting down from the timeout value. // // If the link is subsequently re-attached before the terminus is expired, // then the count down is aborted. If the conditions for the // terminus-expiry-policy are subsequently re-met, the expiry timer restarts // from its originally configured timeout value. type ExpiryPolicy = encoding.ExpiryPolicy golang-github-azure-go-amqp-1.0.2/creditor.go000066400000000000000000000050541454613650200211000ustar00rootroot00000000000000package amqp import ( "context" "errors" "sync" ) type creditor struct { mu sync.Mutex // future values for the next flow frame. pendingDrain bool creditsToAdd uint32 // drained is set when a drain is active and we're waiting // for the corresponding flow from the remote. drained chan struct{} } var ( errLinkDraining = errors.New("link is currently draining, no credits can be added") errAlreadyDraining = errors.New("drain already in process") ) // EndDrain ends the current drain, unblocking any active Drain calls. func (mc *creditor) EndDrain() { mc.mu.Lock() defer mc.mu.Unlock() if mc.drained != nil { close(mc.drained) mc.drained = nil } } // FlowBits gets gets the proper values for the next flow frame // and resets the internal state. // Returns: // // (drain: true, credits: 0) if a flow is needed (drain) // (drain: false, credits > 0) if a flow is needed (issue credit) // (drain: false, credits == 0) if no flow needed. func (mc *creditor) FlowBits(currentCredits uint32) (bool, uint32) { mc.mu.Lock() defer mc.mu.Unlock() drain := mc.pendingDrain var credits uint32 if mc.pendingDrain { // only send one drain request mc.pendingDrain = false } // either: // drain is true (ie, we're going to send a drain frame, and the credits for it should be 0) // mc.creditsToAdd == 0 (no flow frame needed, no new credits are being issued) if drain || mc.creditsToAdd == 0 { credits = 0 } else { credits = mc.creditsToAdd + currentCredits } mc.creditsToAdd = 0 return drain, credits } // Drain initiates a drain and blocks until EndDrain is called. // If the context's deadline expires or is cancelled before the operation // completes, the drain might not have happened. func (mc *creditor) Drain(ctx context.Context, r *Receiver) error { mc.mu.Lock() if mc.drained != nil { mc.mu.Unlock() return errAlreadyDraining } mc.drained = make(chan struct{}) // use a local copy to avoid racing with EndDrain() drained := mc.drained mc.pendingDrain = true mc.mu.Unlock() // cause mux() to check our flow conditions. select { case r.receiverReady <- struct{}{}: default: } // send drain, wait for responding flow frame select { case <-drained: return nil case <-r.l.done: return r.l.doneErr case <-ctx.Done(): return ctx.Err() } } // IssueCredit queues up additional credits to be requested at the next // call of FlowBits() func (mc *creditor) IssueCredit(credits uint32) error { mc.mu.Lock() defer mc.mu.Unlock() if mc.drained != nil { return errLinkDraining } mc.creditsToAdd += credits return nil } golang-github-azure-go-amqp-1.0.2/creditor_test.go000066400000000000000000000064621454613650200221430ustar00rootroot00000000000000package amqp import ( "context" "fmt" "sync" "testing" "time" "github.com/Azure/go-amqp/internal/encoding" "github.com/stretchr/testify/require" ) func TestCreditorIssueCredits(t *testing.T) { r := newTestLink(t) require.NoError(t, r.creditor.IssueCredit(3)) drain, credits := r.creditor.FlowBits(1) require.False(t, drain) require.EqualValues(t, 3+1, credits, "flow frame includes the pending credits and our current credits") // flow clears the previous data once it's been called. drain, credits = r.creditor.FlowBits(4) require.False(t, drain) require.EqualValues(t, 0, credits, "drain flow frame always sets link-credit to 0") } func TestCreditorDrain(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Minute*2) defer cancel() r := newTestLink(t) require.NoError(t, r.creditor.IssueCredit(3)) // only one drain allowed at a time. drainRoutines := sync.WaitGroup{} drainRoutines.Add(2) var err1, err2 error go func() { defer drainRoutines.Done() err1 = r.creditor.Drain(ctx, r) }() go func() { defer drainRoutines.Done() err2 = r.creditor.Drain(ctx, r) }() // one of the drain calls will have succeeded, the other one should still be blocking. time.Sleep(time.Second * 2) // the next time someone requests a flow frame it'll drain (this doesn't affect the blocked Drain() calls) drain, credits := r.creditor.FlowBits(101) require.True(t, drain) require.EqualValues(t, 0, credits, "Drain always drains with 0 credit") // unblock the last of the drainers r.creditor.EndDrain() require.Nil(t, r.creditor.drained, "drain completes and removes the drained channel") // wait for all the drain routines to end drainRoutines.Wait() // one of them should have failed (if both succeeded we've somehow let them both run) require.False(t, err1 == nil && err2 == nil) if err1 == nil { require.Error(t, err2, errAlreadyDraining.Error()) } else { require.Error(t, err1, errAlreadyDraining.Error()) } } func TestCreditorIssueCreditsWhileDrainingFails(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Minute*2) defer cancel() r := newTestLink(t) require.NoError(t, r.creditor.IssueCredit(3)) // only one drain allowed at a time. drainRoutines := sync.WaitGroup{} drainRoutines.Add(2) wg := sync.WaitGroup{} wg.Add(1) go func() { defer wg.Done() err := r.creditor.Drain(ctx, newTestLink(t)) require.NoError(t, err) }() time.Sleep(time.Second * 2) // drain is still active, so... require.Error(t, r.creditor.IssueCredit(1), errLinkDraining.Error()) r.creditor.EndDrain() wg.Wait() } func TestCreditorDrainRespectsContext(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Minute*2) defer cancel() mc := creditor{} cancel() require.Error(t, mc.Drain(ctx, newTestLink(t)), context.Canceled.Error()) } func TestCreditorDrainReturnsProperError(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Minute*2) defer cancel() errs := []*Error{ &encoding.Error{ Condition: ErrCondDecodeError, }, nil, } for i, err := range errs { t.Run(fmt.Sprintf("Error[%d]", i), func(t *testing.T) { mc := creditor{} link := newTestLink(t) link.l.doneErr = err close(link.l.done) detachErr := mc.Drain(ctx, link) require.Equal(t, err, detachErr) }) } } golang-github-azure-go-amqp-1.0.2/doc.go000066400000000000000000000005011454613650200200220ustar00rootroot00000000000000/* Package amqp provides an AMQP 1.0 client implementation. AMQP 1.0 is not compatible with AMQP 0-9-1 or 0-10, which are the most common AMQP protocols in use today. The example below shows how to use this package to connect to a Microsoft Azure Service Bus queue. */ package amqp // import "github.com/Azure/go-amqp" golang-github-azure-go-amqp-1.0.2/errors.go000066400000000000000000000071141454613650200206000ustar00rootroot00000000000000package amqp import ( "github.com/Azure/go-amqp/internal/encoding" ) // ErrCond is an AMQP defined error condition. // See http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-transport-v1.0-os.html#type-amqp-error for info on their meaning. type ErrCond = encoding.ErrCond // Error Conditions const ( // AMQP Errors ErrCondDecodeError ErrCond = "amqp:decode-error" ErrCondFrameSizeTooSmall ErrCond = "amqp:frame-size-too-small" ErrCondIllegalState ErrCond = "amqp:illegal-state" ErrCondInternalError ErrCond = "amqp:internal-error" ErrCondInvalidField ErrCond = "amqp:invalid-field" ErrCondNotAllowed ErrCond = "amqp:not-allowed" ErrCondNotFound ErrCond = "amqp:not-found" ErrCondNotImplemented ErrCond = "amqp:not-implemented" ErrCondPreconditionFailed ErrCond = "amqp:precondition-failed" ErrCondResourceDeleted ErrCond = "amqp:resource-deleted" ErrCondResourceLimitExceeded ErrCond = "amqp:resource-limit-exceeded" ErrCondResourceLocked ErrCond = "amqp:resource-locked" ErrCondUnauthorizedAccess ErrCond = "amqp:unauthorized-access" // Connection Errors ErrCondConnectionForced ErrCond = "amqp:connection:forced" ErrCondConnectionRedirect ErrCond = "amqp:connection:redirect" ErrCondFramingError ErrCond = "amqp:connection:framing-error" // Session Errors ErrCondErrantLink ErrCond = "amqp:session:errant-link" ErrCondHandleInUse ErrCond = "amqp:session:handle-in-use" ErrCondUnattachedHandle ErrCond = "amqp:session:unattached-handle" ErrCondWindowViolation ErrCond = "amqp:session:window-violation" // Link Errors ErrCondDetachForced ErrCond = "amqp:link:detach-forced" ErrCondLinkRedirect ErrCond = "amqp:link:redirect" ErrCondMessageSizeExceeded ErrCond = "amqp:link:message-size-exceeded" ErrCondStolen ErrCond = "amqp:link:stolen" ErrCondTransferLimitExceeded ErrCond = "amqp:link:transfer-limit-exceeded" ) // Error is an AMQP error. type Error = encoding.Error // LinkError is returned by methods on Sender/Receiver when the link has closed. type LinkError struct { // RemoteErr contains any error information provided by the peer if the peer detached the link. RemoteErr *Error inner error } // Error implements the error interface for LinkError. func (e *LinkError) Error() string { if e.RemoteErr == nil && e.inner == nil { return "amqp: link closed" } else if e.RemoteErr != nil { return e.RemoteErr.Error() } return e.inner.Error() } // ConnError is returned by methods on Conn and propagated to Session and Senders/Receivers // when the connection has been closed. type ConnError struct { // RemoteErr contains any error information provided by the peer if the peer closed the AMQP connection. RemoteErr *Error inner error } // Error implements the error interface for ConnectionError. func (e *ConnError) Error() string { if e.RemoteErr == nil && e.inner == nil { return "amqp: connection closed" } else if e.RemoteErr != nil { return e.RemoteErr.Error() } return e.inner.Error() } // SessionError is returned by methods on Session and propagated to Senders/Receivers // when the session has been closed. type SessionError struct { // RemoteErr contains any error information provided by the peer if the peer closed the session. RemoteErr *Error inner error } // Error implements the error interface for SessionError. func (e *SessionError) Error() string { if e.RemoteErr == nil && e.inner == nil { return "amqp: session closed" } else if e.RemoteErr != nil { return e.RemoteErr.Error() } return e.inner.Error() } golang-github-azure-go-amqp-1.0.2/example_test.go000066400000000000000000000125701454613650200217600ustar00rootroot00000000000000package amqp_test import ( "context" "errors" "fmt" "log" "time" amqp "github.com/Azure/go-amqp" ) func Example() { ctx := context.TODO() // create connection conn, err := amqp.Dial(ctx, "amqps://my-namespace.servicebus.windows.net", &amqp.ConnOptions{ SASLType: amqp.SASLTypePlain("access-key-name", "access-key"), }) if err != nil { log.Fatal("Dialing AMQP server:", err) } defer conn.Close() // open a session session, err := conn.NewSession(ctx, nil) if err != nil { log.Fatal("Creating AMQP session:", err) } // send a message { // create a sender sender, err := session.NewSender(ctx, "/queue-name", nil) if err != nil { log.Fatal("Creating sender link:", err) } ctx, cancel := context.WithTimeout(ctx, 5*time.Second) // send message err = sender.Send(ctx, amqp.NewMessage([]byte("Hello!")), nil) if err != nil { log.Fatal("Sending message:", err) } sender.Close(ctx) cancel() } // continuously read messages { // create a receiver receiver, err := session.NewReceiver(ctx, "/queue-name", nil) if err != nil { log.Fatal("Creating receiver link:", err) } defer func() { ctx, cancel := context.WithTimeout(ctx, 1*time.Second) receiver.Close(ctx) cancel() }() for { // receive next message msg, err := receiver.Receive(ctx, nil) if err != nil { log.Fatal("Reading message from AMQP:", err) } // accept message if err = receiver.AcceptMessage(context.TODO(), msg); err != nil { log.Fatalf("Failure accepting message: %v", err) } fmt.Printf("Message received: %s\n", msg.GetData()) } } } func ExampleConnError() { // *ConnErrors are returned when the underlying connection has been closed. // this error is propagated to all child Session, Sender, and Receiver instances. ctx := context.TODO() // create connection conn, err := amqp.Dial(ctx, "amqps://my-namespace.servicebus.windows.net", &amqp.ConnOptions{ SASLType: amqp.SASLTypePlain("access-key-name", "access-key"), }) if err != nil { log.Fatal("Dialing AMQP server:", err) } // open a session session, err := conn.NewSession(ctx, nil) if err != nil { log.Fatal("Creating AMQP session:", err) } // create a sender sender, err := session.NewSender(ctx, "/queue-name", nil) if err != nil { log.Fatal("Creating sender link:", err) } // close the connection before sending the message conn.Close() // attempt to send message on a closed connection err = sender.Send(ctx, amqp.NewMessage([]byte("Hello!")), nil) var connErr *amqp.ConnError if !errors.As(err, &connErr) { log.Fatalf("unexpected error type %T", err) } // similarly, methods on session will fail in the same way _, err = session.NewReceiver(ctx, "/queue-name", nil) if !errors.As(err, &connErr) { log.Fatalf("unexpected error type %T", err) } // methods on the connection will also fail _, err = conn.NewSession(ctx, nil) if !errors.As(err, &connErr) { log.Fatalf("unexpected error type %T", err) } } func ExampleSessionError() { // *SessionErrors are returned when a session has been closed. // this error is propagated to all child Sender and Receiver instances. ctx := context.TODO() // create connection conn, err := amqp.Dial(ctx, "amqps://my-namespace.servicebus.windows.net", &amqp.ConnOptions{ SASLType: amqp.SASLTypePlain("access-key-name", "access-key"), }) if err != nil { log.Fatal("Dialing AMQP server:", err) } defer conn.Close() // open a session session, err := conn.NewSession(ctx, nil) if err != nil { log.Fatal("Creating AMQP session:", err) } // create a sender sender, err := session.NewSender(ctx, "/queue-name", nil) if err != nil { log.Fatal("Creating sender link:", err) } // close the session before sending the message session.Close(ctx) // attempt to send message on a closed session err = sender.Send(ctx, amqp.NewMessage([]byte("Hello!")), nil) var sessionErr *amqp.SessionError if !errors.As(err, &sessionErr) { log.Fatalf("unexpected error type %T", err) } // similarly, methods on session will fail in the same way _, err = session.NewReceiver(ctx, "/queue-name", nil) if !errors.As(err, &sessionErr) { log.Fatalf("unexpected error type %T", err) } } func ExampleLinkError() { // *LinkError are returned by methods on Senders/Receivers after Close() has been called. // it can also be returned if the peer has closed the link. in this case, the *RemoteErr // field should contain additional information about why the peer closed the link. ctx := context.TODO() // create connection conn, err := amqp.Dial(ctx, "amqps://my-namespace.servicebus.windows.net", &amqp.ConnOptions{ SASLType: amqp.SASLTypePlain("access-key-name", "access-key"), }) if err != nil { log.Fatal("Dialing AMQP server:", err) } defer conn.Close() // open a session session, err := conn.NewSession(ctx, nil) if err != nil { log.Fatal("Creating AMQP session:", err) } // create a sender sender, err := session.NewSender(ctx, "/queue-name", nil) if err != nil { log.Fatal("Creating sender link:", err) } // send message err = sender.Send(ctx, amqp.NewMessage([]byte("Hello!")), nil) if err != nil { log.Fatal("Creating AMQP session:", err) } // now close the sender sender.Close(ctx) // attempt to send a message after close err = sender.Send(ctx, amqp.NewMessage([]byte("Hello!")), nil) var linkErr *amqp.LinkError if !errors.As(err, &linkErr) { log.Fatalf("unexpected error type %T", err) } } golang-github-azure-go-amqp-1.0.2/fuzz_test.go000066400000000000000000000456361454613650200213340ustar00rootroot00000000000000package amqp import ( "context" "os" "path/filepath" "strconv" "testing" "time" "github.com/Azure/go-amqp/internal/buffer" "github.com/Azure/go-amqp/internal/encoding" "github.com/Azure/go-amqp/internal/frames" "github.com/Azure/go-amqp/internal/testconn" "github.com/fortytw2/leaktest" "github.com/stretchr/testify/require" ) func fuzzConn(data []byte) int { // Receive ctx, cancel := context.WithTimeout(context.Background(), 20*time.Millisecond) client, err := NewConn(ctx, testconn.New(data), &ConnOptions{ IdleTimeout: 20 * time.Millisecond, SASLType: SASLTypePlain("listen", "3aCXZYFcuZA89xe6lZkfYJvOPnTGipA3ap7NvPruBhI="), }) cancel() if err != nil { return 0 } defer client.Close() s, err := client.NewSession(context.Background(), nil) if err != nil { return 0 } r, err := s.NewReceiver(context.Background(), "source", &ReceiverOptions{ Credit: 2, }) if err != nil { return 0 } msg, err := r.Receive(context.Background(), nil) if err != nil { return 0 } if err = r.AcceptMessage(context.Background(), msg); err != nil { return 0 } ctx, close := context.WithTimeout(context.Background(), 10*time.Millisecond) defer close() r.Close(ctx) s.Close(ctx) // Send ctx, cancel = context.WithTimeout(context.Background(), time.Second) client, err = NewConn(ctx, testconn.New(data), &ConnOptions{ IdleTimeout: 10 * time.Millisecond, SASLType: SASLTypePlain("listen", "3aCXZYFcuZA89xe6lZkfYJvOPnTGipA3ap7NvPruBhI="), }) cancel() if err != nil { return 0 } defer client.Close() s, err = client.NewSession(context.Background(), nil) if err != nil { return 0 } sender, err := s.NewSender(context.Background(), "source", nil) if err != nil { return 0 } err = sender.Send(context.Background(), NewMessage(data), nil) if err != nil { return 0 } ctx, close = context.WithTimeout(context.Background(), 10*time.Millisecond) defer close() r.Close(ctx) s.Close(ctx) return 1 } func fuzzUnmarshal(data []byte) int { types := []any{ new(frames.PerformAttach), new(*frames.PerformAttach), new(frames.PerformBegin), new(*frames.PerformBegin), new(frames.PerformClose), new(*frames.PerformClose), new(frames.PerformDetach), new(*frames.PerformDetach), new(frames.PerformDisposition), new(*frames.PerformDisposition), new(frames.PerformEnd), new(*frames.PerformEnd), new(frames.PerformFlow), new(*frames.PerformFlow), new(frames.PerformOpen), new(*frames.PerformOpen), new(frames.PerformTransfer), new(*frames.PerformTransfer), new(frames.Source), new(*frames.Source), new(frames.Target), new(*frames.Target), new(encoding.SASLCode), new(*encoding.SASLCode), new(frames.SASLMechanisms), new(*frames.SASLMechanisms), new(frames.SASLChallenge), new(*frames.SASLChallenge), new(frames.SASLResponse), new(*frames.SASLResponse), new(frames.SASLOutcome), new(*frames.SASLOutcome), new(Message), new(*Message), new(MessageHeader), new(*MessageHeader), new(MessageProperties), new(*MessageProperties), } for _, t := range types { _ = encoding.Unmarshal(buffer.New(data), t) _, _ = encoding.ReadAny(buffer.New(data)) } return 0 } func TestFuzzConnCrashers(t *testing.T) { tests := []string{ 0: "\x00\x00\x00\x010000", 1: "\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc02\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00\x05PLAIN\x00\x00\x00\tANONYMOUS\x00\x00\x00\bEXTERNAL", 2: "AMQP\x03\x01\x00\x00\x00\x00\x00\x1a0000\x00SD\xc00\x02P0\xa0\x0000000000", 3: "AMQP\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00S@\xc0108412541625644849\xe0", 4: "\x00\x00\x00\x1a0000\x00SD\xc000P0\xa0\x0000000000", 5: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00" + "\x05PLAIN\x00\x00\x00\tANONYMOUS\x00" + "\x00\x00\bEXTERNAL\x00\x00\x00\x1a\x02\x01\x00\x00\x00" + "SD\xc0\r\x02P\x00\xa0\bWelcome!AMQ" + "P\x00\x01\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00S\x10\xc0:\n\xa1" + "$83a29bedd884468ba2e" + "37f3017eeab1d_G29@p\x00" + "\x00\x02\x00`\x00\x01p\x00\x03\xa9\x80@@@@@\x00\x00\x00\x1f" + "\x02\x00\x00\x00\x00S\x11\xc0\x12\b`\x00\x00R\x01p\x00\x00\x13\x88" + "R\x01R\xff@@@\x00\x00\x00d\x02\x00\x00\x00\x00S\x12\xc0W" + "\x0e\xa1(oJnNPGsiuzytMOJPa" + "twtPilfsfykSBGplhxtx" + "VSGCB@P\x01\x00S(\xc0\x12\v\xa1\x05/tes" + "t@@@@@@@@@@@@@C\x80\x00\x00\x00\x00" + "\x00\x04\x10\x00@@@\x00\x00\x01y\x02\x00\x00\x00\x00S\x14\xc0\x1d" + "\vCC\xa0\x10F>\xc6\\\x06&\xfaE\x9c\x03\xa8\x8e\xe7\x83\xe3" + ";C@B@@@@A\x00Sp\xc0\n\x05@@pH\x19" + "\b\x00@C\x00Sr\xc1\\\x06\xa3\x13x-opt-en" + "queued-time\x83\x00\x00\x01[\x9c_)\xd1" + "\xa3\x15x-opt-sequence-num" + "ber\x81\x00\x00\x00\x00\x00\x00\x03x\xa3\x12x-opt-" + "locked-until\x83\x00\x00\x01[\x9c_\x9f" + "\x11\x00Ss\xc0H\r\xa1$5e84053f-81" + "c9-49fc-ae42-ff0ab35" + "3d998@@\xa1\x14Service Bus" + " Explorer@@@@@@@@@\x00S" + "t\xc18\x04\xa1\vMachineName\xa1\x0fW" + "IN-37U7RVPH3B1\xa1\bUser" + "Name\xa1\rAdministrator\x00" + "Su\xa0P\r\nHi mate" + ", how are you?", 6: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\xf8\x00\x00\aMSSBCBm\x00\x00\x00" + "\x05PLA\xff\x00\x00\x00\x00\tANONYMOUS\x00" + "\x00\x00\b\x14\nEXTERNAL", 7: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00" + "\x05PLAIN\x00\x00\x00\tANONYMOUS\x00" + "\x00\x00\bEXTERNAL\x00\x00\x00\x1a\x02\x01\x00\x00\x00" + "SD\xc0\r\x02P\x00\xa0\bWelcome!AMQ" + "P\x00\x01\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00S\x10\xc0:\n\xa1" + "$83a29bedd884468ba2e" + "37f3017eeab1d_G29@p\x00" + "\x00\x02\x00`\x00\x01p\x00\x03\xa9\x80@@@@@\x02", 8: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSS \x00\x00\x00\x00\x00\x00" + "\x05PLAIN�^�~\x00\x00\x00\tAN" + "\xcfNYMOUS\x00\x00\x00\bEXT\xf1\xf1I\xdf\xed", 9: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00" + "\x05PLAIN\x00\x00\x00\tANONYMOUS\x00" + "\x00\x00\bEXTERNAL\x00\x00\x00\x1a\x02\x01\x00\x00\x00" + "SD\xc0\r\x02P\x00\xa0\bWelcome!AMQ" + "P\x00\x01\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00S\x10\xc0:\n\xa1" + "$83a29bedd884468ba2e" + "37f3017eeab1d_G29@p\x00" + "\x00\x02\x00`\x00\x01p\x00\x03\xa9\x80@@@@@\x00\x00\x00\x1f" + "\x02\x00\x00\x00\x00S\x11\xc0\x12\b`\x00\x00R\x01p\x00\x00\x13\x88" + "R\x01R\xff@@@\x00\x00\x02\x00S\x12\xa1JNPuzy" + "MPawtPilffySBhxtxVGC" + "B@\x00\xc0\x05/ts@@@@C\x80\x00\x00\x04@\x00\x00" + "\x01y\x02\x00\x14\xc0CC\x10>\xc6\\\x9c\xa8\xe7\x83;@@@" + "@pHC\x00S\xc1\\\xa3\x13xopenqud-t" + "me\x83\x00\x01\xa3\x15-o-equneubr\x00\x00" + "\x00\x00\x03xxp-lced-util\x83\x00\x01\x9c" + "\x9f\r\xa1$5e0589-f-4fb339@" + "@\xa1\x14ervuExplor@@@@@\xc1a" + "cNIN3VP\xa1UserN\xa1Amitao" + "u?m n=\". cin=\"ut-?>m" + "ssagHimae arey/mess>", 10: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\xa9\x80@@@@@\x00\x00\x00\x1f\x02\x00\x00" + "\x00\x00S\x11\xc0\x12\b`\x00\x00R\x01p\x00\x00\x13\x88R\x01R" + "\xff@@@\x00\x00\x00d\x00\x00S\x12\xc0", 11: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00" + "\x05PLAIN\x00\x00\x00\tANONYMOUS\x00" + "\x00\x00\bEXTERNAL\x00\x00\x00\x1a\x02\x01\x00\x00\x00" + "SD\xc0\r\x02P\x00\xa0\bWelcome!AMQ" + "P\x00\x01\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00S\x10\xc0:\n\xa1" + "$83a29bedd884468ba2e" + "37f3017eeab1d_G29@p\x00" + "\x00\x02\x00`\x00\x01p\x00\x03\xa9\x80@@@@@\x00\x00\x00\x1f" + "\x02\x00\x00\x00\x00S\x11\xc0\x12\b`\x00\x00R\x01p\x00\x00\x13\x88" + "R\x01R\xff@@@\x00\x00S(oJNPsiMPf" + "sfkSGlxxVGCB@P\x01\x00\xc0\x12\xa1\x05" + "/st@@@@\x80\x00\x00\x10\x00@@\x00\x00\x00S\x14\xc0" + "\x1d\vC\xa0\x10>\\\xfa\xa8\x8eC@@A\x00\xc0\n@\b@" + "\x00\x06\xa3x-oenqe-ti\x00\x01[_Ñ£x" + "-p-senenue\x00\x00\x00\x00\x03x\xa3\x12pt" + "-lked-tl\x83\x00\x01\x9c\x11\x00Ss\xc05e8" + "41c9-4c-e42-fab3d\xa1\x14e" + "rvsEpr@@@@@@\x00t\xc1\x04\xa1Mhi" + "n\xa1\x0fN3RB\bUsNminrato\xa0<" + "?m vro=\"10ncodig\"utf" + "?\r", 12: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00" + "\x05PLAINlf�\t��s\x00" + "?\x02\x00\x00\x00\x00ShxtxVSGCB@P\x01\x00" + "Q", 13: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x04\x00S@\xc0" + "1\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCB\xff\x00\x00\x00" + "\x05PLAIN\xfa\x00\x00\tAN\xcfNYMOUS\x00" + "\x00\x00\bE\xef\xbf\x02\x00\fU ", 14: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00" + "\x05PLAIN\x00\x00\x00\tANONYMOUR\xff" + "\xff\xed\bEXTERNAL\x00\x00\x00\x1a\x02\x01\x00\x00\x00" + "SD\xc0\r\x02P\x00\xa0\bWelcome!AMQ" + "P\x00\x01\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00S\x10\xc0:\n\xa1" + "$83a29bedd884468ba2e" + "37f3017eeab1d_G29@p\x00" + "\x00\x02\x00`\x00\x01p\x00\x03\xa9\x80@@@@@\x00\x00\x00\x1f" + "\x02\x00\x00\x00\x00S\x11\xc0\x12\b`\x00\x00R\x01p\x00\x00\x13\x88" + "R\x01R\xff@@@\x00\x00\x00d\x02\x00\x00\x00\x00S\x12\xc0W" + "\x0e\xa1(oJnNPGsiuzytMOJPa" + "twtPilfsfykSBGplhxtx" + "VSGCB@P\x01\x00S(\xc0\x12\v\xa1\x05/tes" + "t@@@@@@@@@@@C\x80\x00\x00\x00\x00\x00\x04" + "\x10\x00@@@\x00\x00\x01y\x02\x00\x00\x00\x00S\x14\xc0\x1d\vC" + "C\xa0\x10F>\xc6\\\x06&\xfaE\x9c\x03\xa8\x8e\xe7\x83\xe3;C" + "@B@@@@A\x00Sp\xc0\n\x05@@pH\x19\b\x00" + "@C\x00Sr\xc1\\\x06\xa3\x13x-opt-enqu" + "eued-time\x83\x00\x00\x01[\x9c_)Ñ£\x15" + "x-opt-sequence-numbe" + "r\x81\x00\x00\x00\x00\x00\x00\x03x\xa3\x12x-opt-lo" + "cked-until\x83\x00\x00\x01[\x9c_\x9f\x11\x00" + "Ss\xc0H\r\xa1$5e84053f-81c9" + "-49fc-ae42-ff0ab353d" + "998@@\xa1\x14Service Bus E" + "xplorer@@@@@@@@@\x00St\xc1" + "8\x04\xa1\vMachineNam", 15: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00" + "\x05PLAIN\x00\x00\x00\tANONYMOUS\x00" + "\x00\x00\bEXTERNAL\x00\x00\x00\x1a\x02\x01\x00\x00\x00" + "SD\xc0\r\x02P\x00\xa0\bWelcome!A2Q" + "P\x00\x01\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00S\x10\xc0:\n\xa1" + "$83a29bedd884468ba2e" + "37f3017eeab1d_G29@p\x00" + "\x00\x02\x00`\x00\x01p\x00\x03\xa9\x80@@@@@\x00\x00\x00\x1f" + "\x02\x00\x00\x00\x00S\x11\xc0\x12\b`\x00\x00R\x01p\x00\x00\x13\x88" + "R\x01R\xff@@@\x00\x00\x00d\x02\x00\x00\x00\x00S\x12\xc0W" + "\x0e\xa1(oJnNPGsiuzytMOJPa" + "twtPilfsfykSBGplhxtx" + "VSGCB@P\x01\x00S(\xc0\"\xd9\aTERNA" + "L\x00\x00t@@@@@@@\x17\r\r\x1a@@@@@" + "@C\x80\x00\x00\x01[\x9c\x00\x00\x00\x00\x04\x10\x00@-@\x00\x00" + "\x01y\x02\x00\x00\x00\x00S\x14\xc0\x1d\vCC\xa0\x10F>\xc6\\" + "\x06&\xfaE\x9c\x03\xa8\x8e\xe7\x83\xe3;C@B@@@A\x00" + "Sp\xc0\n\x05@@pH\x19\b\x00@C\x00r\xc1\\\xa3\x13" + "xop-enqueed-im\x83\x00\x00\x01[\x9c" + "_-Ñ£\x15x-opt-squnce-nu" + "mber\x81\x00\x00\x00\x00\x00\x00\x03x\xa3\x12x@opt" + "-locked-until\x83\x00\x00\x01[\x9c_" + "\x9f\x11\x00Ss\xc0\r\xa1$58405f-81c9" + "-4fc-ae42-ff0ab353d9" + "98@@\xa1\x14Servie ", 16: "\x00\x00\x0000000\x00S\x17\xc00\x01000000" + "00000000000000000000" + "00000000000000000000" + "000", 17: "AMQP\x03\x01\x00\x00\x00\x00\x00?\x02\x01\x00\x00\x00S@\xc0" + "2\x01\xe0/\x04\xb3\x00\x00\x00\aMSSBCBS\x00\x00\x00" + "\x05PLAIN\x00\x00\x00\tANONYMOUS\x00" + "\x00\x00\bEXTERNAL\x00\x00\x00\x1a\x02\x01\x00\x00\x00" + "SD\xc0\r\x02P\x00\xa0\bWelcome!AMQ" + "P\x00\x01\x00\x00\x00\x00\x00G\x02\x00\x00\x00\x00S\x10\xc0:\n\xa1" + "$83a29bedd884468ba2e" + "37f301\"eeab1d_G29@p\x00" + "\x00\x00\x00`\x00\x01p\x00\x03\xa9\x80@@@@@\x00\x00\x00\x1f" + "\x02\x00\x00\x00\x00S\x11\xc0\x12\b`\x00\x00R\x01p\x00\x00\x13\x88" + "R\x01R\xff@@@\x00\x00\x00d\x02\x00\x00\x00\x00S\x12\xc0W" + "\x0e\xa1(oJnNPGsiuzytMOJPa" + "twtPilfsfykSBGplhxtx" + "VSGCB@P\x01\x00S(\xc0\x12\v\xa1\x05/tes" + "t@@@@@@@@@@@@@C\x80\x00\x00\x00\x00" + "\x00\x04\x10\x00@@@\x00\x00\x01y\x00\x00\x00\x00S\x14\xc0\x1dC" + "C\xa0\x10F>\xc6\\\x06&\xfaE\x9c\x03\xa8\x8e\xe7\x83\xe3C@" + "B@@@@\x00Sp\xc0\n\x05@@p\x19\b\x00@C\x00" + "Sr\xc1\\\x06\xa3\x13x-opt-enqueue" + "d-time\x83\x00\x00\x01[\x9c)Ñ£\x15x-op" + "t-equence-nmbe\x81\x00\x00\x00\x00\x00" + "\x03x\xa3\x12x-opt-\xe6ocke-unti" + "l\x83\x00\x00\x01\x9c_\x9f\x11\x00SsH\r\xa1$5e84" + "053f-81c9-49fc-ae42-" + "ff0b353d998@\xa1\x14Servic" + " Bus Explrer@@@@@@@@" + "@\x00St\xc18\x04\xa1\vMachineName" + "\xa1\x0fWIN-37U7RVPH3B1\xa1Us" + "erName\xa1Administrator" + "\x00Su\xa0P 0 { err = sender.Close(context.Background()) if err != nil { t.Fatal(err) } tt.close-- } } if tt.error != nil && matches == 0 { t.Errorf("expect an error") } if tt.error != nil && matches > 1 { t.Errorf("expected 1 matching error, got %d", matches) } }) } } func TestIntegrationLinkName(t *testing.T) { if localBrokerAddr == "" { t.Skip() } tests := []struct { name string error string }{ { name: "linkA", error: "link with name 'linkA' already exists", }, } for _, tt := range tests { label := fmt.Sprintf("name %v", tt.name) t.Run(label, func(t *testing.T) { // Create client ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := amqp.Dial(ctx, localBrokerAddr, nil) cancel() if err != nil { t.Fatal(err) } defer client.Close() // Open a session ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() if err != nil { t.Fatal(err) } ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) senderOrigin, err := session.NewSender(ctx, "TestIntegrationLinkName", &amqp.SenderOptions{ Name: tt.name, }) cancel() if err != nil { t.Fatal(err) } defer testClose(t, senderOrigin.Close) // This one should fail ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) sender, err := session.NewSender(ctx, "TestIntegrationLinkName", &amqp.SenderOptions{ Name: tt.name, }) cancel() if err == nil { testClose(t, sender.Close) } switch { case err == nil && tt.error == "": // success case err == nil: t.Fatalf("expected error to contain %q, but it was nil", tt.error) case !strings.Contains(err.Error(), tt.error): t.Errorf("expected error to contain %q, but it was %q", tt.error, err) } }) } } func TestIntegrationClose(t *testing.T) { if localBrokerAddr == "" { t.Skip() } for times := 0; times < 100; times++ { label := "link" t.Run(label, func(t *testing.T) { checkLeaks := leaktest.CheckTimeout(t, 60*time.Second) // Create client ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := amqp.Dial(ctx, localBrokerAddr, nil) cancel() if err != nil { t.Fatal(err) } defer client.Close() // Open a session ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() if err != nil { t.Fatal(err) } // Create a sender ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) receiver, err := session.NewReceiver(ctx, "TestIntegrationClose", nil) cancel() if err != nil { t.Fatal(err) } testClose(t, receiver.Close) _, err = receiver.Receive(context.Background(), nil) var linkErr *amqp.LinkError require.ErrorAs(t, err, &linkErr) err = client.Close() // close before leak check if err != nil { t.Fatal(err) } checkLeaks() }) label = "session" t.Run(label, func(t *testing.T) { checkLeaks := leaktest.CheckTimeout(t, 60*time.Second) // Create client ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := amqp.Dial(ctx, localBrokerAddr, nil) cancel() if err != nil { t.Fatal(err) } defer client.Close() // Open a session ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() if err != nil { t.Fatal(err) } // Create a sender ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) receiver, err := session.NewReceiver(ctx, "TestIntegrationClose", nil) cancel() if err != nil { t.Fatal(err) } testClose(t, session.Close) msg, err := receiver.Receive(context.Background(), nil) var sessionErr *amqp.SessionError require.ErrorAs(t, err, &sessionErr) if msg != nil { t.Fatal("expected nil message") } err = client.Close() // close before leak check if err != nil { t.Fatal(err) } checkLeaks() }) label = "conn" t.Run(label, func(t *testing.T) { checkLeaks := leaktest.CheckTimeout(t, 60*time.Second) // Create client ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := amqp.Dial(ctx, localBrokerAddr, nil) cancel() if err != nil { t.Fatal(err) } defer client.Close() // Open a session ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() if err != nil { t.Fatal(err) } // Create a sender ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) receiver, err := session.NewReceiver(ctx, "TestIntegrationClose", nil) cancel() if err != nil { t.Fatal(err) } err = client.Close() if err != nil { t.Fatalf("Expected nil error from client.Close(), got: %+v", err) } msg, err := receiver.Receive(context.Background(), nil) var connErr *amqp.ConnError if !errors.As(err, &connErr) { t.Fatalf("unexpected error type %T", err) return } if msg != nil { t.Fatal("expected nil message") } checkLeaks() }) } } func TestMultipleSessionsOpenClose(t *testing.T) { if localBrokerAddr == "" { t.Skip() } checkLeaks := leaktest.Check(t) // Create client ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := amqp.Dial(ctx, localBrokerAddr, nil) cancel() if err != nil { t.Fatal(err) } sessions := [10]*amqp.Session{} for i := 0; i < 10; i++ { for j := 0; j < 10; j++ { ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() if err != nil { t.Fatalf("failed to create session: %v", err) return } sessions[j] = session } for _, session := range sessions { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) err = session.Close(ctx) cancel() if err != nil { t.Fatal(err) } } } client.Close() checkLeaks() } func TestDialWithCancelledContext(t *testing.T) { if localBrokerAddr == "" { t.Skip() } checkLeaks := leaktest.Check(t) ctx, cancel := context.WithCancel(context.Background()) cancel() client, err := amqp.Dial(ctx, localBrokerAddr, nil) var dialErr *net.OpError require.ErrorAs(t, err, &dialErr) require.Nil(t, client) checkLeaks() } func TestNewSessionWithCancelledContext(t *testing.T) { if localBrokerAddr == "" { t.Skip() } checkLeaks := leaktest.Check(t) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := amqp.Dial(ctx, localBrokerAddr, nil) cancel() require.NoError(t, err) // we use an iteration greater than the max number of sessions to ensure // that no begin performatives are being sent. if they are then the peer // will reject the session with a different error. for times := 0; times < 10000; times++ { ctx, cancel = context.WithCancel(context.Background()) cancel() session, err := client.NewSession(ctx, nil) require.ErrorIs(t, err, context.Canceled) require.Nil(t, session) } require.NoError(t, client.Close()) checkLeaks() } func TestConcurrentSessionsOpenClose(t *testing.T) { if localBrokerAddr == "" { t.Skip() } checkLeaks := leaktest.Check(t) // Create client ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := amqp.Dial(ctx, localBrokerAddr, nil) cancel() if err != nil { t.Fatal(err) } wg := sync.WaitGroup{} for i := 0; i < 100; i++ { wg.Add(1) go func() { defer wg.Done() ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() if err != nil { t.Errorf("failed to create session: %v", err) return } ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second) err = session.Close(ctx) cancel() if err != nil { t.Error(err) } }() } wg.Wait() client.Close() checkLeaks() } func TestReceiverModeFirst(t *testing.T) { if localBrokerAddr == "" { t.Skip() } checkLeaks := leaktest.Check(t) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := amqp.Dial(ctx, localBrokerAddr, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) sender, err := session.NewSender(ctx, "TestReceiverModeFirst", nil) cancel() require.NoError(t, err) const ( linkCredit = 10 msgCount = 2 * linkCredit ) // prime with a bunch of messages for i := 0; i < msgCount; i++ { err = sender.Send(context.Background(), amqp.NewMessage([]byte(fmt.Sprintf("test %d", i))), nil) require.NoError(t, err) } ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) err = sender.Close(ctx) cancel() require.NoError(t, err) // create a new sender ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) sender, err = session.NewSender(ctx, "TestReceiverModeFirstOther", nil) cancel() require.NoError(t, err) // now drain the messages ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) recv, err := session.NewReceiver(ctx, "TestReceiverModeFirst", &amqp.ReceiverOptions{ Credit: linkCredit, }) cancel() require.NoError(t, err) msgs := make(chan *amqp.Message, linkCredit) for i := 0; i < msgCount; i++ { // receive one message ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) msg, err := recv.Receive(ctx, nil) cancel() require.NoError(t, err) msgs <- msg // send to other sender ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) err = sender.Send(ctx, msg, nil) cancel() require.NoError(t, err) if (i+1)%linkCredit == 0 { for j := 0; j < linkCredit; j++ { msg = <-msgs ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) err = recv.AcceptMessage(ctx, msg) cancel() require.NoError(t, err) } } } client.Close() checkLeaks() } func TestSenderExactlyOnce(t *testing.T) { if localBrokerAddr == "" { t.Skip() } checkLeaks := leaktest.Check(t) // Create client ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := amqp.Dial(ctx, localBrokerAddr, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) sender, err := session.NewSender(ctx, "TestSenderExactlyOnce", &amqp.SenderOptions{ SettlementMode: amqp.SenderSettleModeUnsettled.Ptr(), RequestedReceiverSettleMode: amqp.ReceiverSettleModeSecond.Ptr(), }) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) err = sender.Send(ctx, amqp.NewMessage([]byte("hello!")), nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) receiver, err := session.NewReceiver(ctx, "TestSenderExactlyOnce", &amqp.ReceiverOptions{ SettlementMode: amqp.ReceiverSettleModeSecond.Ptr(), }) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) msg, err := receiver.Receive(ctx, nil) cancel() require.NoError(t, err) require.Equal(t, "hello!", string(msg.GetData())) client.Close() checkLeaks() } func TestReceivingLotsOfSettledMessages(t *testing.T) { if localBrokerAddr == "" { t.Skip() } // Create client ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := amqp.Dial(ctx, localBrokerAddr, nil) cancel() require.NoError(t, err) // Open a session ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) // Create a sender // add a random suffix to the link name so the test broker always creates a new node targetName := fmt.Sprintf("TestReceivingLotsOfSettledMessages %d", rng.Uint64()) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) sender, err := session.NewSender(ctx, targetName, nil) cancel() require.NoError(t, err) const linkCredit = 10 // send more messages than the receiver's link credit const msgCount = linkCredit * 2 for i := 0; i < msgCount; i++ { ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) err = sender.Send(ctx, amqp.NewMessage([]byte(fmt.Sprintf("TestReceivingLotsOfSettledMessages %d", i))), nil) cancel() require.NoError(t, err) } testClose(t, sender.Close) // Create a receiver ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) receiver, err := session.NewReceiver(ctx, targetName, &amqp.ReceiverOptions{ Credit: linkCredit, RequestedSenderSettleMode: amqp.SenderSettleModeSettled.Ptr(), }) cancel() require.NoError(t, err) var receivedCount int for i := 0; i < msgCount; i++ { ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) msg, err := receiver.Receive(ctx, nil) cancel() if errors.Is(err, context.DeadlineExceeded) { break } require.EqualValues(t, fmt.Sprintf("TestReceivingLotsOfSettledMessages %d", i), string(msg.GetData())) receivedCount++ } // now we received all the messages require.EqualValues(t, msgCount, receivedCount) testClose(t, receiver.Close) client.Close() } func TestNewReceiverWithCancelledContext(t *testing.T) { if localBrokerAddr == "" { t.Skip() } checkLeaks := leaktest.Check(t) // Create client ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := amqp.Dial(ctx, localBrokerAddr, nil) cancel() require.NoError(t, err) // Open a session ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) for times := 0; times < 100; times++ { ctx, cancel = context.WithCancel(context.Background()) cancel() receiver, err := session.NewReceiver(ctx, "thesource", nil) require.ErrorIs(t, err, context.Canceled) require.Nil(t, receiver) } require.NoError(t, client.Close()) checkLeaks() } func TestMultipleSendersSharedSession(t *testing.T) { if localBrokerAddr == "" { t.Skip() } checkLeaks := leaktest.Check(t) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := amqp.Dial(ctx, localBrokerAddr, &amqp.ConnOptions{ SASLType: amqp.SASLTypeAnonymous(), }) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) const msgSize = 1024 * 10 bigMsgData := make([]byte, msgSize) for i := 0; i < msgSize; i++ { bigMsgData[i] = byte(i % 256) } wg := &sync.WaitGroup{} for senders := 0; senders < 100; senders++ { wg.Add(1) go func() { defer wg.Done() for msgCount := 0; msgCount < 50; msgCount++ { sender, err := session.NewSender(context.Background(), "TestMultipleSendersSharedSession", nil) require.NoError(t, err) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) err = sender.Send(ctx, amqp.NewMessage(bigMsgData), nil) cancel() if err != nil { panic(err) } ctx, cancel = context.WithTimeout(context.Background(), 10*time.Second) err = sender.Close(ctx) if err != nil { panic(err) } cancel() time.Sleep(time.Millisecond * 100) } }() } wg.Wait() require.NoError(t, client.Close()) checkLeaks() } func repeatStrings(count int, strs ...string) []string { var out []string for i := 0; i < count; i += len(strs) { out = append(out, strs...) } return out[:count] } func testClose(t testing.TB, close func(context.Context) error) { t.Helper() ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) defer cancel() err := close(ctx) if err != nil { t.Errorf("error closing: %+v\n", err) } } golang-github-azure-go-amqp-1.0.2/internal/000077500000000000000000000000001454613650200205465ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/bitmap/000077500000000000000000000000001454613650200220225ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/bitmap/bitmap.go000066400000000000000000000033511454613650200236270ustar00rootroot00000000000000package bitmap import ( "math/bits" ) // bitmap is a lazily initialized bitmap type Bitmap struct { max uint32 bits []uint64 } func New(max uint32) *Bitmap { return &Bitmap{max: max} } // add sets n in the bitmap. // // bits will be expanded as needed. // // If n is greater than max, the call has no effect. func (b *Bitmap) Add(n uint32) { if n > b.max { return } var ( idx = n / 64 offset = n % 64 ) if l := len(b.bits); int(idx) >= l { b.bits = append(b.bits, make([]uint64, int(idx)-l+1)...) } b.bits[idx] |= 1 << offset } // remove clears n from the bitmap. // // If n is not set or greater than max the call has not effect. func (b *Bitmap) Remove(n uint32) { var ( idx = n / 64 offset = n % 64 ) if int(idx) >= len(b.bits) { return } b.bits[idx] &= ^uint64(1 << offset) } // next sets and returns the lowest unset bit in the bitmap. // // bits will be expanded if necessary. // // If there are no unset bits below max, the second return // value will be false. func (b *Bitmap) Next() (uint32, bool) { // find the first unset bit for i, v := range b.bits { // skip if all bits are set if v == ^uint64(0) { continue } var ( offset = bits.TrailingZeros64(^v) // invert and count zeroes next = uint32(i*64 + offset) ) // check if in bounds if next > b.max { return next, false } // set bit b.bits[i] |= 1 << uint32(offset) return next, true } // no unset bits in the current slice, // check if the full range has been allocated if uint64(len(b.bits)*64) > uint64(b.max) { return 0, false } // full range not allocated, append entry with first // bit set b.bits = append(b.bits, 1) // return the value of the first bit return uint32(len(b.bits)-1) * 64, true } golang-github-azure-go-amqp-1.0.2/internal/bitmap/bitmap_test.go000066400000000000000000000052561454613650200246740ustar00rootroot00000000000000package bitmap import ( "math" "math/bits" "reflect" "strconv" "testing" ) func TestBitmap(t *testing.T) { type ( add uint32 // call add with this value rem uint32 // call remove with this value next int64 // call next this many time ) tests := []struct { max uint32 ops []any nextFail bool next uint32 count uint32 }{ { max: 9, ops: []any{ add(0), add(1), add(2), add(3), add(4), add(5), add(6), add(7), add(8), add(9), rem(3), rem(7), }, next: 3, count: 9, }, { max: 9, next: 0, count: 1, }, { max: math.MaxUint32, ops: []any{ add(13000), }, next: 0, count: 2, }, { max: math.MaxUint32, ops: []any{ next(64), }, next: 64, count: 65, }, { max: math.MaxUint32, ops: []any{ next(65535), }, next: 65535, count: 65536, }, { max: math.MaxUint32, ops: []any{ next(300), rem(32), rem(78), rem(13), next(1), }, next: 32, count: 299, }, { max: 63, ops: []any{ next(64), }, nextFail: true, count: 64, }, { max: 31, ops: []any{ next(32), }, nextFail: true, count: 32, }, { max: 31, ops: []any{ add(32), }, next: 0, count: 1, }, { max: 63, ops: []any{ next(64), rem(64), }, nextFail: true, count: 64, }, } for i, tt := range tests { t.Run(strconv.Itoa(i), func(t *testing.T) { bm := New(tt.max) for _, op := range tt.ops { switch op := op.(type) { case add: bm.Add(uint32(op)) case rem: bm.Remove(uint32(op)) case next: for i := int64(0); i < int64(op); i++ { bm.Next() } default: panic("unhandled op " + reflect.TypeOf(op).String()) } } next, ok := bm.Next() if ok == tt.nextFail { t.Errorf("next() failed with %d", next) } if tt.next != next && !tt.nextFail { t.Errorf("expected next() to be %d, but it was %d", tt.next, next) } count := countBitmap(bm) if tt.count != count { t.Errorf("expected count() to be %d, but it was %d", tt.count, count) } }) } } func TestBitmap_Sequence(t *testing.T) { const max = 1024 bm := New(max) for i := uint32(0); i <= max; i++ { next, ok := bm.Next() if !ok { t.Errorf("next() failed with %d", next) } if i != next { t.Errorf("expected next() to be %d, but it was %d", i, next) } } count := countBitmap(bm) if want := uint32(max + 1); want != count { t.Errorf("expected count() to be %d, but it was %d", want, count) } } func countBitmap(bm *Bitmap) uint32 { var count uint32 for _, v := range bm.bits { count += uint32(bits.OnesCount64(v)) } return count } golang-github-azure-go-amqp-1.0.2/internal/buffer/000077500000000000000000000000001454613650200220175ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/buffer/buffer.go000066400000000000000000000051421454613650200236210ustar00rootroot00000000000000package buffer import ( "encoding/binary" "io" ) // buffer is similar to bytes.Buffer but specialized for this package type Buffer struct { b []byte i int } func New(b []byte) *Buffer { return &Buffer{b: b} } func (b *Buffer) Next(n int64) ([]byte, bool) { if b.readCheck(n) { buf := b.b[b.i:len(b.b)] b.i = len(b.b) return buf, false } buf := b.b[b.i : b.i+int(n)] b.i += int(n) return buf, true } func (b *Buffer) Skip(n int) { b.i += n } func (b *Buffer) Reset() { b.b = b.b[:0] b.i = 0 } // reclaim shifts used buffer space to the beginning of the // underlying slice. func (b *Buffer) Reclaim() { l := b.Len() copy(b.b[:l], b.b[b.i:]) b.b = b.b[:l] b.i = 0 } func (b *Buffer) readCheck(n int64) bool { return int64(b.i)+n > int64(len(b.b)) } func (b *Buffer) ReadByte() (byte, error) { if b.readCheck(1) { return 0, io.EOF } byte_ := b.b[b.i] b.i++ return byte_, nil } func (b *Buffer) PeekByte() (byte, error) { if b.readCheck(1) { return 0, io.EOF } return b.b[b.i], nil } func (b *Buffer) ReadUint16() (uint16, error) { if b.readCheck(2) { return 0, io.EOF } n := binary.BigEndian.Uint16(b.b[b.i:]) b.i += 2 return n, nil } func (b *Buffer) ReadUint32() (uint32, error) { if b.readCheck(4) { return 0, io.EOF } n := binary.BigEndian.Uint32(b.b[b.i:]) b.i += 4 return n, nil } func (b *Buffer) ReadUint64() (uint64, error) { if b.readCheck(8) { return 0, io.EOF } n := binary.BigEndian.Uint64(b.b[b.i : b.i+8]) b.i += 8 return n, nil } func (b *Buffer) ReadFromOnce(r io.Reader) error { const minRead = 512 l := len(b.b) if cap(b.b)-l < minRead { total := l * 2 if total == 0 { total = minRead } new := make([]byte, l, total) copy(new, b.b) b.b = new } n, err := r.Read(b.b[l:cap(b.b)]) b.b = b.b[:l+n] return err } func (b *Buffer) Append(p []byte) { b.b = append(b.b, p...) } func (b *Buffer) AppendByte(bb byte) { b.b = append(b.b, bb) } func (b *Buffer) AppendString(s string) { b.b = append(b.b, s...) } func (b *Buffer) Len() int { return len(b.b) - b.i } func (b *Buffer) Size() int { return b.i } func (b *Buffer) Bytes() []byte { return b.b[b.i:] } func (b *Buffer) Detach() []byte { temp := b.b b.b = nil b.i = 0 return temp } func (b *Buffer) AppendUint16(n uint16) { b.b = append(b.b, byte(n>>8), byte(n), ) } func (b *Buffer) AppendUint32(n uint32) { b.b = append(b.b, byte(n>>24), byte(n>>16), byte(n>>8), byte(n), ) } func (b *Buffer) AppendUint64(n uint64) { b.b = append(b.b, byte(n>>56), byte(n>>48), byte(n>>40), byte(n>>32), byte(n>>24), byte(n>>16), byte(n>>8), byte(n), ) } golang-github-azure-go-amqp-1.0.2/internal/debug/000077500000000000000000000000001454613650200216345ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/debug/debug.go000066400000000000000000000007771454613650200232640ustar00rootroot00000000000000//go:build !debug // +build !debug package debug // dummy functions used when debugging is not enabled // Log writes the formatted string to stderr. // Level indicates the verbosity of the messages to log. // The greater the value, the more verbose messages will be logged. func Log(_ int, _ string, _ ...any) {} // Assert panics if the specified condition is false. func Assert(bool) {} // Assert panics with the provided message if the specified condition is false. func Assertf(bool, string, ...any) {} golang-github-azure-go-amqp-1.0.2/internal/debug/debug_debug.go000066400000000000000000000016011454613650200244150ustar00rootroot00000000000000//go:build debug // +build debug package debug import ( "fmt" "log" "os" "strconv" ) var ( debugLevel = 1 logger = log.New(os.Stderr, "", log.Lmicroseconds) ) func init() { level, err := strconv.Atoi(os.Getenv("DEBUG_LEVEL")) if err != nil { return } debugLevel = level } // Log writes the formatted string to stderr. // Level indicates the verbosity of the messages to log. // The greater the value, the more verbose messages will be logged. func Log(level int, format string, v ...any) { if level <= debugLevel { logger.Printf(format, v...) } } // Assert panics if the specified condition is false. func Assert(condition bool) { if !condition { panic("assertion failed!") } } // Assert panics with the provided message if the specified condition is false. func Assertf(condition bool, msg string, v ...any) { if !condition { panic(fmt.Sprintf(msg, v...)) } } golang-github-azure-go-amqp-1.0.2/internal/encoding/000077500000000000000000000000001454613650200223345ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/decode.go000066400000000000000000000575311454613650200241210ustar00rootroot00000000000000// Copyright (C) 2017 Kale Blankenship // Portions Copyright (c) Microsoft Corporation package encoding import ( "encoding/binary" "errors" "fmt" "math" "reflect" "time" "github.com/Azure/go-amqp/internal/buffer" ) // unmarshaler is fulfilled by types that can unmarshal // themselves from AMQP data. type unmarshaler interface { Unmarshal(r *buffer.Buffer) error } // unmarshal decodes AMQP encoded data into i. // // The decoding method is based on the type of i. // // If i implements unmarshaler, i.Unmarshal() will be called. // // Pointers to primitive types will be decoded via the appropriate read[Type] function. // // If i is a pointer to a pointer (**Type), it will be dereferenced and a new instance // of (*Type) is allocated via reflection. // // Common map types (map[string]string, map[Symbol]any, and // map[any]any), will be decoded via conversion to the mapStringAny, // mapSymbolAny, and mapAnyAny types. func Unmarshal(r *buffer.Buffer, i any) error { if tryReadNull(r) { return nil } switch t := i.(type) { case *int: val, err := readInt(r) if err != nil { return err } *t = val case *int8: val, err := readSbyte(r) if err != nil { return err } *t = val case *int16: val, err := readShort(r) if err != nil { return err } *t = val case *int32: val, err := readInt32(r) if err != nil { return err } *t = val case *int64: val, err := readLong(r) if err != nil { return err } *t = val case *uint64: val, err := readUlong(r) if err != nil { return err } *t = val case *uint32: val, err := readUint32(r) if err != nil { return err } *t = val case **uint32: // fastpath for uint32 pointer fields val, err := readUint32(r) if err != nil { return err } *t = &val case *uint16: val, err := readUshort(r) if err != nil { return err } *t = val case *uint8: val, err := ReadUbyte(r) if err != nil { return err } *t = val case *float32: val, err := readFloat(r) if err != nil { return err } *t = val case *float64: val, err := readDouble(r) if err != nil { return err } *t = val case *string: val, err := ReadString(r) if err != nil { return err } *t = val case *Symbol: s, err := ReadString(r) if err != nil { return err } *t = Symbol(s) case *[]byte: val, err := readBinary(r) if err != nil { return err } *t = val case *bool: b, err := readBool(r) if err != nil { return err } *t = b case *time.Time: ts, err := readTimestamp(r) if err != nil { return err } *t = ts case *[]int8: return (*arrayInt8)(t).Unmarshal(r) case *[]uint16: return (*arrayUint16)(t).Unmarshal(r) case *[]int16: return (*arrayInt16)(t).Unmarshal(r) case *[]uint32: return (*arrayUint32)(t).Unmarshal(r) case *[]int32: return (*arrayInt32)(t).Unmarshal(r) case *[]uint64: return (*arrayUint64)(t).Unmarshal(r) case *[]int64: return (*arrayInt64)(t).Unmarshal(r) case *[]float32: return (*arrayFloat)(t).Unmarshal(r) case *[]float64: return (*arrayDouble)(t).Unmarshal(r) case *[]bool: return (*arrayBool)(t).Unmarshal(r) case *[]string: return (*arrayString)(t).Unmarshal(r) case *[]Symbol: return (*arraySymbol)(t).Unmarshal(r) case *[][]byte: return (*arrayBinary)(t).Unmarshal(r) case *[]time.Time: return (*arrayTimestamp)(t).Unmarshal(r) case *[]UUID: return (*arrayUUID)(t).Unmarshal(r) case *[]any: return (*list)(t).Unmarshal(r) case *map[any]any: return (*mapAnyAny)(t).Unmarshal(r) case *map[string]any: return (*mapStringAny)(t).Unmarshal(r) case *map[Symbol]any: return (*mapSymbolAny)(t).Unmarshal(r) case *DeliveryState: type_, _, err := PeekMessageType(r.Bytes()) if err != nil { return err } switch AMQPType(type_) { case TypeCodeStateAccepted: *t = new(StateAccepted) case TypeCodeStateModified: *t = new(StateModified) case TypeCodeStateReceived: *t = new(StateReceived) case TypeCodeStateRejected: *t = new(StateRejected) case TypeCodeStateReleased: *t = new(StateReleased) default: return fmt.Errorf("unexpected type %d for deliveryState", type_) } return Unmarshal(r, *t) case *any: v, err := ReadAny(r) if err != nil { return err } *t = v case unmarshaler: return t.Unmarshal(r) default: // handle **T v := reflect.Indirect(reflect.ValueOf(i)) // can't unmarshal into a non-pointer if v.Kind() != reflect.Ptr { return fmt.Errorf("unable to unmarshal %T", i) } // if nil pointer, allocate a new value to // unmarshal into if v.IsNil() { v.Set(reflect.New(v.Type().Elem())) } return Unmarshal(r, v.Interface()) } return nil } // unmarshalComposite is a helper for use in a composite's unmarshal() function. // // The composite from r will be unmarshaled into zero or more fields. An error // will be returned if typ does not match the decoded type. func UnmarshalComposite(r *buffer.Buffer, type_ AMQPType, fields ...UnmarshalField) error { cType, numFields, err := readCompositeHeader(r) if err != nil { return err } // check type matches expectation if cType != type_ { return fmt.Errorf("invalid header %#0x for %#0x", cType, type_) } // Validate the field count is less than or equal to the number of fields // provided. Fields may be omitted by the sender if they are not set. if numFields > int64(len(fields)) { return fmt.Errorf("invalid field count %d for %#0x", numFields, type_) } for i, field := range fields[:numFields] { // If the field is null and handleNull is set, call it. if tryReadNull(r) { if field.HandleNull != nil { err = field.HandleNull() if err != nil { return err } } continue } // Unmarshal each of the received fields. err = Unmarshal(r, field.Field) if err != nil { return fmt.Errorf("unmarshaling field %d: %v", i, err) } } // check and call handleNull for the remaining fields for _, field := range fields[numFields:] { if field.HandleNull != nil { err = field.HandleNull() if err != nil { return err } } } return nil } // unmarshalField is a struct that contains a field to be unmarshaled into. // // An optional nullHandler can be set. If the composite field being unmarshaled // is null and handleNull is not nil, nullHandler will be called. type UnmarshalField struct { Field any HandleNull NullHandler } // nullHandler is a function to be called when a composite's field // is null. type NullHandler func() error func readType(r *buffer.Buffer) (AMQPType, error) { n, err := r.ReadByte() return AMQPType(n), err } func peekType(r *buffer.Buffer) (AMQPType, error) { n, err := r.PeekByte() return AMQPType(n), err } // readCompositeHeader reads and consumes the composite header from r. func readCompositeHeader(r *buffer.Buffer) (_ AMQPType, fields int64, _ error) { type_, err := readType(r) if err != nil { return 0, 0, err } // compsites always start with 0x0 if type_ != 0 { return 0, 0, fmt.Errorf("invalid composite header %#02x", type_) } // next, the composite type is encoded as an AMQP uint8 v, err := readUlong(r) if err != nil { return 0, 0, err } // fields are represented as a list fields, err = readListHeader(r) return AMQPType(v), fields, err } func readListHeader(r *buffer.Buffer) (length int64, _ error) { type_, err := readType(r) if err != nil { return 0, err } listLength := r.Len() switch type_ { case TypeCodeList0: return 0, nil case TypeCodeList8: buf, ok := r.Next(2) if !ok { return 0, errors.New("invalid length") } _ = buf[1] size := int(buf[0]) if size > listLength-1 { return 0, errors.New("invalid length") } length = int64(buf[1]) case TypeCodeList32: buf, ok := r.Next(8) if !ok { return 0, errors.New("invalid length") } _ = buf[7] size := int(binary.BigEndian.Uint32(buf[:4])) if size > listLength-4 { return 0, errors.New("invalid length") } length = int64(binary.BigEndian.Uint32(buf[4:8])) default: return 0, fmt.Errorf("type code %#02x is not a recognized list type", type_) } return length, nil } func readArrayHeader(r *buffer.Buffer) (length int64, _ error) { type_, err := readType(r) if err != nil { return 0, err } arrayLength := r.Len() switch type_ { case TypeCodeArray8: buf, ok := r.Next(2) if !ok { return 0, errors.New("invalid length") } _ = buf[1] size := int(buf[0]) if size > arrayLength-1 { return 0, errors.New("invalid length") } length = int64(buf[1]) case TypeCodeArray32: buf, ok := r.Next(8) if !ok { return 0, errors.New("invalid length") } _ = buf[7] size := binary.BigEndian.Uint32(buf[:4]) if int(size) > arrayLength-4 { return 0, fmt.Errorf("invalid length for type %02x", type_) } length = int64(binary.BigEndian.Uint32(buf[4:8])) default: return 0, fmt.Errorf("type code %#02x is not a recognized array type", type_) } return length, nil } func ReadString(r *buffer.Buffer) (string, error) { type_, err := readType(r) if err != nil { return "", err } var length int64 switch type_ { case TypeCodeStr8, TypeCodeSym8: n, err := r.ReadByte() if err != nil { return "", err } length = int64(n) case TypeCodeStr32, TypeCodeSym32: buf, ok := r.Next(4) if !ok { return "", fmt.Errorf("invalid length for type %#02x", type_) } length = int64(binary.BigEndian.Uint32(buf)) default: return "", fmt.Errorf("type code %#02x is not a recognized string type", type_) } buf, ok := r.Next(length) if !ok { return "", errors.New("invalid length") } return string(buf), nil } func readBinary(r *buffer.Buffer) ([]byte, error) { type_, err := readType(r) if err != nil { return nil, err } var length int64 switch type_ { case TypeCodeVbin8: n, err := r.ReadByte() if err != nil { return nil, err } length = int64(n) case TypeCodeVbin32: buf, ok := r.Next(4) if !ok { return nil, fmt.Errorf("invalid length for type %#02x", type_) } length = int64(binary.BigEndian.Uint32(buf)) default: return nil, fmt.Errorf("type code %#02x is not a recognized binary type", type_) } if length == 0 { // An empty value and a nil value are distinct, // ensure that the returned value is not nil in this case. return make([]byte, 0), nil } buf, ok := r.Next(length) if !ok { return nil, errors.New("invalid length") } return append([]byte(nil), buf...), nil } func ReadAny(r *buffer.Buffer) (any, error) { if tryReadNull(r) { return nil, nil } type_, err := peekType(r) if err != nil { return nil, errors.New("invalid length") } switch type_ { // composite case 0x0: return readComposite(r) // bool case TypeCodeBool, TypeCodeBoolTrue, TypeCodeBoolFalse: return readBool(r) // uint case TypeCodeUbyte: return ReadUbyte(r) case TypeCodeUshort: return readUshort(r) case TypeCodeUint, TypeCodeSmallUint, TypeCodeUint0: return readUint32(r) case TypeCodeUlong, TypeCodeSmallUlong, TypeCodeUlong0: return readUlong(r) // int case TypeCodeByte: return readSbyte(r) case TypeCodeShort: return readShort(r) case TypeCodeInt, TypeCodeSmallint: return readInt32(r) case TypeCodeLong, TypeCodeSmalllong: return readLong(r) // floating point case TypeCodeFloat: return readFloat(r) case TypeCodeDouble: return readDouble(r) // binary case TypeCodeVbin8, TypeCodeVbin32: return readBinary(r) // strings case TypeCodeStr8, TypeCodeStr32: return ReadString(r) case TypeCodeSym8, TypeCodeSym32: // symbols currently decoded as string to avoid // exposing symbol type in message, this may need // to change if users need to distinguish strings // from symbols return ReadString(r) // timestamp case TypeCodeTimestamp: return readTimestamp(r) // UUID case TypeCodeUUID: return readUUID(r) // arrays case TypeCodeArray8, TypeCodeArray32: return readAnyArray(r) // lists case TypeCodeList0, TypeCodeList8, TypeCodeList32: return readAnyList(r) // maps case TypeCodeMap8: return readAnyMap(r) case TypeCodeMap32: return readAnyMap(r) // TODO: implement case TypeCodeDecimal32: return nil, errors.New("decimal32 not implemented") case TypeCodeDecimal64: return nil, errors.New("decimal64 not implemented") case TypeCodeDecimal128: return nil, errors.New("decimal128 not implemented") case TypeCodeChar: return nil, errors.New("char not implemented") default: return nil, fmt.Errorf("unknown type %#02x", type_) } } func readAnyMap(r *buffer.Buffer) (any, error) { var m map[any]any err := (*mapAnyAny)(&m).Unmarshal(r) if err != nil { return nil, err } if len(m) == 0 { return m, nil } stringKeys := true Loop: for key := range m { switch key.(type) { case string: case Symbol: default: stringKeys = false break Loop } } if stringKeys { mm := make(map[string]any, len(m)) for key, value := range m { switch key := key.(type) { case string: mm[key] = value case Symbol: mm[string(key)] = value } } return mm, nil } return m, nil } func readAnyList(r *buffer.Buffer) (any, error) { var a []any err := (*list)(&a).Unmarshal(r) return a, err } func readAnyArray(r *buffer.Buffer) (any, error) { // get the array type buf := r.Bytes() if len(buf) < 1 { return nil, errors.New("invalid length") } var typeIdx int switch AMQPType(buf[0]) { case TypeCodeArray8: typeIdx = 3 case TypeCodeArray32: typeIdx = 9 default: return nil, fmt.Errorf("invalid array type %02x", buf[0]) } if len(buf) < typeIdx+1 { return nil, errors.New("invalid length") } switch AMQPType(buf[typeIdx]) { case TypeCodeByte: var a []int8 err := (*arrayInt8)(&a).Unmarshal(r) return a, err case TypeCodeUbyte: var a ArrayUByte err := a.Unmarshal(r) return a, err case TypeCodeUshort: var a []uint16 err := (*arrayUint16)(&a).Unmarshal(r) return a, err case TypeCodeShort: var a []int16 err := (*arrayInt16)(&a).Unmarshal(r) return a, err case TypeCodeUint0, TypeCodeSmallUint, TypeCodeUint: var a []uint32 err := (*arrayUint32)(&a).Unmarshal(r) return a, err case TypeCodeSmallint, TypeCodeInt: var a []int32 err := (*arrayInt32)(&a).Unmarshal(r) return a, err case TypeCodeUlong0, TypeCodeSmallUlong, TypeCodeUlong: var a []uint64 err := (*arrayUint64)(&a).Unmarshal(r) return a, err case TypeCodeSmalllong, TypeCodeLong: var a []int64 err := (*arrayInt64)(&a).Unmarshal(r) return a, err case TypeCodeFloat: var a []float32 err := (*arrayFloat)(&a).Unmarshal(r) return a, err case TypeCodeDouble: var a []float64 err := (*arrayDouble)(&a).Unmarshal(r) return a, err case TypeCodeBool, TypeCodeBoolTrue, TypeCodeBoolFalse: var a []bool err := (*arrayBool)(&a).Unmarshal(r) return a, err case TypeCodeStr8, TypeCodeStr32: var a []string err := (*arrayString)(&a).Unmarshal(r) return a, err case TypeCodeSym8, TypeCodeSym32: var a []Symbol err := (*arraySymbol)(&a).Unmarshal(r) return a, err case TypeCodeVbin8, TypeCodeVbin32: var a [][]byte err := (*arrayBinary)(&a).Unmarshal(r) return a, err case TypeCodeTimestamp: var a []time.Time err := (*arrayTimestamp)(&a).Unmarshal(r) return a, err case TypeCodeUUID: var a []UUID err := (*arrayUUID)(&a).Unmarshal(r) return a, err default: return nil, fmt.Errorf("array decoding not implemented for %#02x", buf[typeIdx]) } } func readComposite(r *buffer.Buffer) (any, error) { buf := r.Bytes() if len(buf) < 2 { return nil, errors.New("invalid length for composite") } // compsites start with 0x0 if AMQPType(buf[0]) != 0x0 { return nil, fmt.Errorf("invalid composite header %#02x", buf[0]) } var compositeType uint64 switch AMQPType(buf[1]) { case TypeCodeSmallUlong: if len(buf) < 3 { return nil, errors.New("invalid length for smallulong") } compositeType = uint64(buf[2]) case TypeCodeUlong: if len(buf) < 10 { return nil, errors.New("invalid length for ulong") } compositeType = binary.BigEndian.Uint64(buf[2:]) } if compositeType > math.MaxUint8 { // try as described type var dt DescribedType err := dt.Unmarshal(r) return dt, err } switch AMQPType(compositeType) { // Error case TypeCodeError: t := new(Error) err := t.Unmarshal(r) return t, err // Lifetime Policies case TypeCodeDeleteOnClose: t := DeleteOnClose err := t.Unmarshal(r) return t, err case TypeCodeDeleteOnNoMessages: t := DeleteOnNoMessages err := t.Unmarshal(r) return t, err case TypeCodeDeleteOnNoLinks: t := DeleteOnNoLinks err := t.Unmarshal(r) return t, err case TypeCodeDeleteOnNoLinksOrMessages: t := DeleteOnNoLinksOrMessages err := t.Unmarshal(r) return t, err // Delivery States case TypeCodeStateAccepted: t := new(StateAccepted) err := t.Unmarshal(r) return t, err case TypeCodeStateModified: t := new(StateModified) err := t.Unmarshal(r) return t, err case TypeCodeStateReceived: t := new(StateReceived) err := t.Unmarshal(r) return t, err case TypeCodeStateRejected: t := new(StateRejected) err := t.Unmarshal(r) return t, err case TypeCodeStateReleased: t := new(StateReleased) err := t.Unmarshal(r) return t, err case TypeCodeOpen, TypeCodeBegin, TypeCodeAttach, TypeCodeFlow, TypeCodeTransfer, TypeCodeDisposition, TypeCodeDetach, TypeCodeEnd, TypeCodeClose, TypeCodeSource, TypeCodeTarget, TypeCodeMessageHeader, TypeCodeDeliveryAnnotations, TypeCodeMessageAnnotations, TypeCodeMessageProperties, TypeCodeApplicationProperties, TypeCodeApplicationData, TypeCodeAMQPSequence, TypeCodeAMQPValue, TypeCodeFooter, TypeCodeSASLMechanism, TypeCodeSASLInit, TypeCodeSASLChallenge, TypeCodeSASLResponse, TypeCodeSASLOutcome: return nil, fmt.Errorf("readComposite unmarshal not implemented for %#02x", compositeType) default: // try as described type var dt DescribedType err := dt.Unmarshal(r) return dt, err } } func readTimestamp(r *buffer.Buffer) (time.Time, error) { type_, err := readType(r) if err != nil { return time.Time{}, err } if type_ != TypeCodeTimestamp { return time.Time{}, fmt.Errorf("invalid type for timestamp %02x", type_) } n, err := r.ReadUint64() ms := int64(n) return time.Unix(ms/1000, (ms%1000)*1000000).UTC(), err } func readInt(r *buffer.Buffer) (int, error) { type_, err := peekType(r) if err != nil { return 0, err } switch type_ { // Unsigned case TypeCodeUbyte: n, err := ReadUbyte(r) return int(n), err case TypeCodeUshort: n, err := readUshort(r) return int(n), err case TypeCodeUint0, TypeCodeSmallUint, TypeCodeUint: n, err := readUint32(r) return int(n), err case TypeCodeUlong0, TypeCodeSmallUlong, TypeCodeUlong: n, err := readUlong(r) return int(n), err // Signed case TypeCodeByte: n, err := readSbyte(r) return int(n), err case TypeCodeShort: n, err := readShort(r) return int(n), err case TypeCodeSmallint, TypeCodeInt: n, err := readInt32(r) return int(n), err case TypeCodeSmalllong, TypeCodeLong: n, err := readLong(r) return int(n), err default: return 0, fmt.Errorf("type code %#02x is not a recognized number type", type_) } } func readLong(r *buffer.Buffer) (int64, error) { type_, err := readType(r) if err != nil { return 0, err } switch type_ { case TypeCodeSmalllong: n, err := r.ReadByte() return int64(int8(n)), err case TypeCodeLong: n, err := r.ReadUint64() return int64(n), err default: return 0, fmt.Errorf("invalid type for uint32 %02x", type_) } } func readInt32(r *buffer.Buffer) (int32, error) { type_, err := readType(r) if err != nil { return 0, err } switch type_ { case TypeCodeSmallint: n, err := r.ReadByte() return int32(int8(n)), err case TypeCodeInt: n, err := r.ReadUint32() return int32(n), err default: return 0, fmt.Errorf("invalid type for int32 %02x", type_) } } func readShort(r *buffer.Buffer) (int16, error) { type_, err := readType(r) if err != nil { return 0, err } if type_ != TypeCodeShort { return 0, fmt.Errorf("invalid type for short %02x", type_) } n, err := r.ReadUint16() return int16(n), err } func readSbyte(r *buffer.Buffer) (int8, error) { type_, err := readType(r) if err != nil { return 0, err } if type_ != TypeCodeByte { return 0, fmt.Errorf("invalid type for int8 %02x", type_) } n, err := r.ReadByte() return int8(n), err } func ReadUbyte(r *buffer.Buffer) (uint8, error) { type_, err := readType(r) if err != nil { return 0, err } if type_ != TypeCodeUbyte { return 0, fmt.Errorf("invalid type for ubyte %02x", type_) } return r.ReadByte() } func readUshort(r *buffer.Buffer) (uint16, error) { type_, err := readType(r) if err != nil { return 0, err } if type_ != TypeCodeUshort { return 0, fmt.Errorf("invalid type for ushort %02x", type_) } return r.ReadUint16() } func readUint32(r *buffer.Buffer) (uint32, error) { type_, err := readType(r) if err != nil { return 0, err } switch type_ { case TypeCodeUint0: return 0, nil case TypeCodeSmallUint: n, err := r.ReadByte() return uint32(n), err case TypeCodeUint: return r.ReadUint32() default: return 0, fmt.Errorf("invalid type for uint32 %02x", type_) } } func readUlong(r *buffer.Buffer) (uint64, error) { type_, err := readType(r) if err != nil { return 0, err } switch type_ { case TypeCodeUlong0: return 0, nil case TypeCodeSmallUlong: n, err := r.ReadByte() return uint64(n), err case TypeCodeUlong: return r.ReadUint64() default: return 0, fmt.Errorf("invalid type for uint32 %02x", type_) } } func readFloat(r *buffer.Buffer) (float32, error) { type_, err := readType(r) if err != nil { return 0, err } if type_ != TypeCodeFloat { return 0, fmt.Errorf("invalid type for float32 %02x", type_) } bits, err := r.ReadUint32() return math.Float32frombits(bits), err } func readDouble(r *buffer.Buffer) (float64, error) { type_, err := readType(r) if err != nil { return 0, err } if type_ != TypeCodeDouble { return 0, fmt.Errorf("invalid type for float64 %02x", type_) } bits, err := r.ReadUint64() return math.Float64frombits(bits), err } func readBool(r *buffer.Buffer) (bool, error) { type_, err := readType(r) if err != nil { return false, err } switch type_ { case TypeCodeBool: b, err := r.ReadByte() return b != 0, err case TypeCodeBoolTrue: return true, nil case TypeCodeBoolFalse: return false, nil default: return false, fmt.Errorf("type code %#02x is not a recognized bool type", type_) } } func readUint(r *buffer.Buffer) (value uint64, _ error) { type_, err := readType(r) if err != nil { return 0, err } switch type_ { case TypeCodeUint0, TypeCodeUlong0: return 0, nil case TypeCodeUbyte, TypeCodeSmallUint, TypeCodeSmallUlong: n, err := r.ReadByte() return uint64(n), err case TypeCodeUshort: n, err := r.ReadUint16() return uint64(n), err case TypeCodeUint: n, err := r.ReadUint32() return uint64(n), err case TypeCodeUlong: return r.ReadUint64() default: return 0, fmt.Errorf("type code %#02x is not a recognized number type", type_) } } func readUUID(r *buffer.Buffer) (UUID, error) { var uuid UUID type_, err := readType(r) if err != nil { return uuid, err } if type_ != TypeCodeUUID { return uuid, fmt.Errorf("type code %#00x is not a UUID", type_) } buf, ok := r.Next(16) if !ok { return uuid, errors.New("invalid length") } copy(uuid[:], buf) return uuid, nil } func readMapHeader(r *buffer.Buffer) (count uint32, _ error) { type_, err := readType(r) if err != nil { return 0, err } length := r.Len() switch type_ { case TypeCodeMap8: buf, ok := r.Next(2) if !ok { return 0, errors.New("invalid length") } _ = buf[1] size := int(buf[0]) if size > length-1 { return 0, errors.New("invalid length") } count = uint32(buf[1]) case TypeCodeMap32: buf, ok := r.Next(8) if !ok { return 0, errors.New("invalid length") } _ = buf[7] size := int(binary.BigEndian.Uint32(buf[:4])) if size > length-4 { return 0, errors.New("invalid length") } count = binary.BigEndian.Uint32(buf[4:8]) default: return 0, fmt.Errorf("invalid map type %#02x", type_) } if int(count) > r.Len() { return 0, errors.New("invalid length") } return count, nil } golang-github-azure-go-amqp-1.0.2/internal/encoding/encode.go000066400000000000000000000273611454613650200241310ustar00rootroot00000000000000package encoding import ( "encoding/binary" "errors" "fmt" "math" "time" "unicode/utf8" "github.com/Azure/go-amqp/internal/buffer" ) type marshaler interface { Marshal(*buffer.Buffer) error } func Marshal(wr *buffer.Buffer, i any) error { switch t := i.(type) { case nil: wr.AppendByte(byte(TypeCodeNull)) case bool: if t { wr.AppendByte(byte(TypeCodeBoolTrue)) } else { wr.AppendByte(byte(TypeCodeBoolFalse)) } case *bool: if *t { wr.AppendByte(byte(TypeCodeBoolTrue)) } else { wr.AppendByte(byte(TypeCodeBoolFalse)) } case uint: writeUint64(wr, uint64(t)) case *uint: writeUint64(wr, uint64(*t)) case uint64: writeUint64(wr, t) case *uint64: writeUint64(wr, *t) case uint32: writeUint32(wr, t) case *uint32: writeUint32(wr, *t) case uint16: wr.AppendByte(byte(TypeCodeUshort)) wr.AppendUint16(t) case *uint16: wr.AppendByte(byte(TypeCodeUshort)) wr.AppendUint16(*t) case uint8: wr.Append([]byte{ byte(TypeCodeUbyte), t, }) case *uint8: wr.Append([]byte{ byte(TypeCodeUbyte), *t, }) case int: writeInt64(wr, int64(t)) case *int: writeInt64(wr, int64(*t)) case int8: wr.Append([]byte{ byte(TypeCodeByte), uint8(t), }) case *int8: wr.Append([]byte{ byte(TypeCodeByte), uint8(*t), }) case int16: wr.AppendByte(byte(TypeCodeShort)) wr.AppendUint16(uint16(t)) case *int16: wr.AppendByte(byte(TypeCodeShort)) wr.AppendUint16(uint16(*t)) case int32: writeInt32(wr, t) case *int32: writeInt32(wr, *t) case int64: writeInt64(wr, t) case *int64: writeInt64(wr, *t) case float32: writeFloat(wr, t) case *float32: writeFloat(wr, *t) case float64: writeDouble(wr, t) case *float64: writeDouble(wr, *t) case string: return writeString(wr, t) case *string: return writeString(wr, *t) case []byte: return WriteBinary(wr, t) case *[]byte: return WriteBinary(wr, *t) case map[any]any: return writeMap(wr, t) case *map[any]any: return writeMap(wr, *t) case map[string]any: return writeMap(wr, t) case *map[string]any: return writeMap(wr, *t) case map[Symbol]any: return writeMap(wr, t) case *map[Symbol]any: return writeMap(wr, *t) case Unsettled: return writeMap(wr, t) case *Unsettled: return writeMap(wr, *t) case time.Time: writeTimestamp(wr, t) case *time.Time: writeTimestamp(wr, *t) case []int8: return arrayInt8(t).Marshal(wr) case *[]int8: return arrayInt8(*t).Marshal(wr) case []uint16: return arrayUint16(t).Marshal(wr) case *[]uint16: return arrayUint16(*t).Marshal(wr) case []int16: return arrayInt16(t).Marshal(wr) case *[]int16: return arrayInt16(*t).Marshal(wr) case []uint32: return arrayUint32(t).Marshal(wr) case *[]uint32: return arrayUint32(*t).Marshal(wr) case []int32: return arrayInt32(t).Marshal(wr) case *[]int32: return arrayInt32(*t).Marshal(wr) case []uint64: return arrayUint64(t).Marshal(wr) case *[]uint64: return arrayUint64(*t).Marshal(wr) case []int64: return arrayInt64(t).Marshal(wr) case *[]int64: return arrayInt64(*t).Marshal(wr) case []float32: return arrayFloat(t).Marshal(wr) case *[]float32: return arrayFloat(*t).Marshal(wr) case []float64: return arrayDouble(t).Marshal(wr) case *[]float64: return arrayDouble(*t).Marshal(wr) case []bool: return arrayBool(t).Marshal(wr) case *[]bool: return arrayBool(*t).Marshal(wr) case []string: return arrayString(t).Marshal(wr) case *[]string: return arrayString(*t).Marshal(wr) case []Symbol: return arraySymbol(t).Marshal(wr) case *[]Symbol: return arraySymbol(*t).Marshal(wr) case [][]byte: return arrayBinary(t).Marshal(wr) case *[][]byte: return arrayBinary(*t).Marshal(wr) case []time.Time: return arrayTimestamp(t).Marshal(wr) case *[]time.Time: return arrayTimestamp(*t).Marshal(wr) case []UUID: return arrayUUID(t).Marshal(wr) case *[]UUID: return arrayUUID(*t).Marshal(wr) case []any: return list(t).Marshal(wr) case *[]any: return list(*t).Marshal(wr) case marshaler: return t.Marshal(wr) default: return fmt.Errorf("marshal not implemented for %T", i) } return nil } func writeInt32(wr *buffer.Buffer, n int32) { if n < 128 && n >= -128 { wr.Append([]byte{ byte(TypeCodeSmallint), byte(n), }) return } wr.AppendByte(byte(TypeCodeInt)) wr.AppendUint32(uint32(n)) } func writeInt64(wr *buffer.Buffer, n int64) { if n < 128 && n >= -128 { wr.Append([]byte{ byte(TypeCodeSmalllong), byte(n), }) return } wr.AppendByte(byte(TypeCodeLong)) wr.AppendUint64(uint64(n)) } func writeUint32(wr *buffer.Buffer, n uint32) { if n == 0 { wr.AppendByte(byte(TypeCodeUint0)) return } if n < 256 { wr.Append([]byte{ byte(TypeCodeSmallUint), byte(n), }) return } wr.AppendByte(byte(TypeCodeUint)) wr.AppendUint32(n) } func writeUint64(wr *buffer.Buffer, n uint64) { if n == 0 { wr.AppendByte(byte(TypeCodeUlong0)) return } if n < 256 { wr.Append([]byte{ byte(TypeCodeSmallUlong), byte(n), }) return } wr.AppendByte(byte(TypeCodeUlong)) wr.AppendUint64(n) } func writeFloat(wr *buffer.Buffer, f float32) { wr.AppendByte(byte(TypeCodeFloat)) wr.AppendUint32(math.Float32bits(f)) } func writeDouble(wr *buffer.Buffer, f float64) { wr.AppendByte(byte(TypeCodeDouble)) wr.AppendUint64(math.Float64bits(f)) } func writeTimestamp(wr *buffer.Buffer, t time.Time) { wr.AppendByte(byte(TypeCodeTimestamp)) ms := t.UnixNano() / int64(time.Millisecond) wr.AppendUint64(uint64(ms)) } // marshalField is a field to be marshaled type MarshalField struct { Value any // value to be marshaled, use pointers to avoid interface conversion overhead Omit bool // indicates that this field should be omitted (set to null) } // marshalComposite is a helper for us in a composite's marshal() function. // // The returned bytes include the composite header and fields. Fields with // omit set to true will be encoded as null or omitted altogether if there are // no non-null fields after them. func MarshalComposite(wr *buffer.Buffer, code AMQPType, fields []MarshalField) error { // lastSetIdx is the last index to have a non-omitted field. // start at -1 as it's possible to have no fields in a composite lastSetIdx := -1 // marshal each field into it's index in rawFields, // null fields are skipped, leaving the index nil. for i, f := range fields { if f.Omit { continue } lastSetIdx = i } // write header only if lastSetIdx == -1 { wr.Append([]byte{ 0x0, byte(TypeCodeSmallUlong), byte(code), byte(TypeCodeList0), }) return nil } // write header WriteDescriptor(wr, code) // write fields wr.AppendByte(byte(TypeCodeList32)) // write temp size, replace later sizeIdx := wr.Len() wr.Append([]byte{0, 0, 0, 0}) preFieldLen := wr.Len() // field count wr.AppendUint32(uint32(lastSetIdx + 1)) // write null to each index up to lastSetIdx for _, f := range fields[:lastSetIdx+1] { if f.Omit { wr.AppendByte(byte(TypeCodeNull)) continue } err := Marshal(wr, f.Value) if err != nil { return err } } // fix size size := uint32(wr.Len() - preFieldLen) buf := wr.Bytes() binary.BigEndian.PutUint32(buf[sizeIdx:], size) return nil } func WriteDescriptor(wr *buffer.Buffer, code AMQPType) { wr.Append([]byte{ 0x0, byte(TypeCodeSmallUlong), byte(code), }) } func writeString(wr *buffer.Buffer, str string) error { if !utf8.ValidString(str) { return errors.New("not a valid UTF-8 string") } l := len(str) switch { // Str8 case l < 256: wr.Append([]byte{ byte(TypeCodeStr8), byte(l), }) wr.AppendString(str) return nil // Str32 case uint(l) < math.MaxUint32: wr.AppendByte(byte(TypeCodeStr32)) wr.AppendUint32(uint32(l)) wr.AppendString(str) return nil default: return errors.New("too long") } } func WriteBinary(wr *buffer.Buffer, bin []byte) error { l := len(bin) switch { // List8 case l < 256: wr.Append([]byte{ byte(TypeCodeVbin8), byte(l), }) wr.Append(bin) return nil // List32 case uint(l) < math.MaxUint32: wr.AppendByte(byte(TypeCodeVbin32)) wr.AppendUint32(uint32(l)) wr.Append(bin) return nil default: return errors.New("too long") } } func writeMap(wr *buffer.Buffer, m any) error { startIdx := wr.Len() wr.Append([]byte{ byte(TypeCodeMap32), // type 0, 0, 0, 0, // size placeholder 0, 0, 0, 0, // length placeholder }) var pairs int switch m := m.(type) { case map[any]any: pairs = len(m) * 2 for key, val := range m { err := Marshal(wr, key) if err != nil { return err } err = Marshal(wr, val) if err != nil { return err } } case map[string]any: pairs = len(m) * 2 for key, val := range m { err := writeString(wr, key) if err != nil { return err } err = Marshal(wr, val) if err != nil { return err } } case map[Symbol]any: pairs = len(m) * 2 for key, val := range m { err := key.Marshal(wr) if err != nil { return err } err = Marshal(wr, val) if err != nil { return err } } case Unsettled: pairs = len(m) * 2 for key, val := range m { err := writeString(wr, key) if err != nil { return err } err = Marshal(wr, val) if err != nil { return err } } case Filter: pairs = len(m) * 2 for key, val := range m { err := key.Marshal(wr) if err != nil { return err } err = val.Marshal(wr) if err != nil { return err } } case Annotations: pairs = len(m) * 2 for key, val := range m { switch key := key.(type) { case string: err := Symbol(key).Marshal(wr) if err != nil { return err } case Symbol: err := key.Marshal(wr) if err != nil { return err } case int64: writeInt64(wr, key) case int: writeInt64(wr, int64(key)) default: return fmt.Errorf("unsupported Annotations key type %T", key) } err := Marshal(wr, val) if err != nil { return err } } default: return fmt.Errorf("unsupported map type %T", m) } if uint(pairs) > math.MaxUint32-4 { return errors.New("map contains too many elements") } // overwrite placeholder size and length bytes := wr.Bytes()[startIdx+1 : startIdx+9] _ = bytes[7] // bounds check hint length := wr.Len() - startIdx - 1 - 4 // -1 for type, -4 for length binary.BigEndian.PutUint32(bytes[:4], uint32(length)) binary.BigEndian.PutUint32(bytes[4:8], uint32(pairs)) return nil } // type length sizes const ( array8TLSize = 2 array32TLSize = 5 ) func writeArrayHeader(wr *buffer.Buffer, length, typeSize int, type_ AMQPType) { size := length * typeSize // array type if size+array8TLSize <= math.MaxUint8 { wr.Append([]byte{ byte(TypeCodeArray8), // type byte(size + array8TLSize), // size byte(length), // length byte(type_), // element type }) } else { wr.AppendByte(byte(TypeCodeArray32)) //type wr.AppendUint32(uint32(size + array32TLSize)) // size wr.AppendUint32(uint32(length)) // length wr.AppendByte(byte(type_)) // element type } } func writeVariableArrayHeader(wr *buffer.Buffer, length, elementsSizeTotal int, type_ AMQPType) { // 0xA_ == 1, 0xB_ == 4 // http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-types-v1.0-os.html#doc-idp82960 elementTypeSize := 1 if type_&0xf0 == 0xb0 { elementTypeSize = 4 } size := elementsSizeTotal + (length * elementTypeSize) // size excluding array length if size+array8TLSize <= math.MaxUint8 { wr.Append([]byte{ byte(TypeCodeArray8), // type byte(size + array8TLSize), // size byte(length), // length byte(type_), // element type }) } else { wr.AppendByte(byte(TypeCodeArray32)) // type wr.AppendUint32(uint32(size + array32TLSize)) // size wr.AppendUint32(uint32(length)) // length wr.AppendByte(byte(type_)) // element type } } golang-github-azure-go-amqp-1.0.2/internal/encoding/fuzz_test.go000066400000000000000000000062721454613650200247270ustar00rootroot00000000000000package encoding import ( "os" "path/filepath" "strconv" "testing" "time" "github.com/Azure/go-amqp/internal/buffer" ) func fuzzUnmarshal(data []byte) int { types := []any{ new(Error), new(*Error), new(StateReceived), new(*StateReceived), new(StateAccepted), new(*StateAccepted), new(StateRejected), new(*StateRejected), new(StateReleased), new(*StateReleased), new(StateModified), new(*StateModified), new(mapAnyAny), new(*mapAnyAny), new(mapStringAny), new(*mapStringAny), new(mapSymbolAny), new(*mapSymbolAny), new(Unsettled), new(*Unsettled), new(Milliseconds), new(*Milliseconds), new(bool), new(*bool), new(int8), new(*int8), new(int16), new(*int16), new(int32), new(*int32), new(int64), new(*int64), new(uint8), new(*uint8), new(uint16), new(*uint16), new(uint32), new(*uint32), new(uint64), new(*uint64), new(time.Time), new(*time.Time), new(time.Duration), new(*time.Duration), new(Symbol), new(*Symbol), new([]byte), new(*[]byte), new([]string), new(*[]string), new([]Symbol), new(*[]Symbol), new(map[any]any), new(*map[any]any), new(map[string]any), new(*map[string]any), new(map[Symbol]any), new(*map[Symbol]any), new(any), new(*any), new(ErrCond), new(*ErrCond), new(UUID), new(*UUID), new(Role), new(*Role), } for _, t := range types { _ = Unmarshal(buffer.New(data), t) _, _ = ReadAny(buffer.New(data)) } return 0 } func TestFuzzMarshalCrashers(t *testing.T) { tests := []string{ 0: "\xc1\x000\xa0\x00S0", 1: "\xf0S\x13\xc0\x12\v@`@@`\v@```@@@", 2: "\xe000\xb0", 3: "\xc1\x000\xe000R", 4: "\xe000S", 5: "\x00\xe000R", 6: "\xe000\x83", 7: "\x00\x00\xe000S", 8: "\xe000R", 9: "\x00\xe000S", 10: "\xc1\x000\xe000S", 11: "\xc1\x000\x00\xe000S", 12: "\xc1\x000\x00\xe000R", 13: "\x00\x00\xe000R", 14: "\xe000\xb1", 15: "\xc1\x00%\xd0\x00\x00\x00M\xe2\x00\x00\x01\x00S\x1d\xd0\x00\x00\x00A" + "\x00\x00\x00\x03\xa3\x10amqp:link:stol" + "en\xa1\x0foo\xb1\xdefoo descript" + "ion\xc1\x18\x04\xa1\x05other\xa1\x04info\xa1" + "\x03andq\x00\x00\x03k", 16: "\xd1\x00\x00\x00M\x00S\x1d\xd0\x00S\x1d\xd0\x00\x00\x00A\x00\x80\x00" + "\x03\xa3\x10amqp:link:stolen\xa1" + "\x19foo description\xc1\x18\x04\xa1" + "\x05other\xa1\x04info\xa1\x03andU\x00\x00" + "\x03k", 17: "\xf0\x00\x00\x00\x01@\x00TRUE\x00", 18: "\xf0\x00\x00\x00\x00\x10RTRT", 19: "\x00p\x00inp\xf0\x00\x00\x00\x01p\x00inp", } for i, tt := range tests { t.Run(strconv.Itoa(i), func(t *testing.T) { fuzzUnmarshal([]byte(tt)) }) } } func testDirFiles(t *testing.T, dir string) []string { finfos, err := os.ReadDir(dir) if err != nil { t.Fatal(err) } var fullpaths []string for _, finfo := range finfos { fullpaths = append(fullpaths, filepath.Join(dir, finfo.Name())) } return fullpaths } func TestFuzzMarshalCorpus(t *testing.T) { if os.Getenv("TEST_CORPUS") == "" { t.Skip("set TEST_CORPUS to enable") } for _, path := range testDirFiles(t, "testdata/fuzz/marshal/corpus") { t.Run(filepath.Base(path), func(t *testing.T) { data, err := os.ReadFile(path) if err != nil { t.Fatal(err) } fuzzUnmarshal(data) }) } } golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/000077500000000000000000000000001454613650200241455ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/000077500000000000000000000000001454613650200251435ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/000077500000000000000000000000001454613650200261005ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/000077500000000000000000000000001454613650200274135ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/0.bin000066400000000000000000000000101454613650200302330ustar00rootroot00000000000000AMQP0082cb80000f0ebb00941543871f545cc12f59f1-6000066400000000000000000000005201454613650200345260ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJa ¿½ vzLXqzRrrUIYvaIuj WjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@019ecd0533cd97ce60a360ee05a08f3f5b40ac59-3000066400000000000000000000005201454613650200351170ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT deSÀpqaJaBRgAvzLXqzRrrUIYv¡IujoptYjxeUBrVfdwCB8PS(À ¡/test@@@@@@@@@@@@@C€@@@0202a297f4192cf81e119085d333845568c7d0b2-13000066400000000000000000000005201454613650200344730ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e114eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT  SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿ï½ ソソï¿ï½¿ï½¿ïexeUB VfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@040cb03f4a63b1436bfa5920cb2e21199693a898-11000066400000000000000000000005201454613650200347010ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e114eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿ï½ï½¿ï½¿ï¿ï½¿ï½¿ïexeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@04d747273f2bfca0984e15f79d30638230af3422-12000066400000000000000000000005201454613650200346320ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿ï½ï½¿ï½¿ï¿ï½¿ï½¿ïexeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@04db6e221ef0ff54a65565e982d393ee7bb06238-7000066400000000000000000000005201454613650200350100ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJaÿ½ vzLXqzQrr@�HYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@059564e0cd54199098da354c2a4420f75cd6a9b2-3000066400000000000000000000001441454613650200346410ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ï½¿ï%UeXh�J��DpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@05e2818dc5326a7365fb594a797ac0cd4ecfb349-6000066400000000000000000000000771454613650200351000ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³"CBSPLAIN ANONtMOYS"uUf05fa0d2b5853e19196e9ebb855237da204241e66-8000066400000000000000000000000771454613650200346470ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³M PLAIN A YS" Uf0627872692d472f5519d89657318887588e8a461-15000066400000000000000000000005201454613650200342620ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿951_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿½¿ñ½¿¿ï½¿ï¿½¿ñ½¿½ïexeUBrVfäØCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@09872d2f0fdd7a03b0ab9b191bc3f4991a16bc71-8000066400000000000000000000005201454613650200351240ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(Žžµa ¿è vzLXqzRrrUIYvaIujDpHŽžµa ¿è fdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@09dcaddc244ded42f5d5796482bbbdab3a2d740d-5000066400000000000000000000000771454613650200354330ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³MSSBCBSPLAIN ANONtMOYS"  Uf0bbf0ac13b8886f8349b82ba1672c43e9b89dc24-6000066400000000000000000000000771454613650200350740ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³MS PLAIN ANONtMOYS" Uf0d074290117459af7296255352ba39ad80498790-11000066400000000000000000000001441454613650200343470ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿×½SÀÿ¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½€ÿÿ{XfLCB€test@@@@P€(À ¡/@@@@@€€test@@@0df216332ba17eac20b0669245b7cb35d81812b8-13000066400000000000000000000005201454613650200347470ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e114eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿ï½ï½@ソï¿ï½[]½¿ïexeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@0f3cf155bf3fd8e04cd70a82e597234243a077e4-5000066400000000000000000000000771454613650200350040ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³MSSBCBSPLAIN ANONtMOYS"MSSB1-roundtrip-small-payload000066400000000000000000000015521454613650200342030ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT GSÀ: ¡$7d2b46ee7e254e89a3d9af52493ec18e_G31@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ‚SÀu¡(qaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwUCAP@@S)À0¡'integration-receive-5577006791947779410@@@@@@@@@€@@@SPLIT #SÀ CpˆRRCCpèC@B@SPLIT ‡SÀz¡(zWHRihFDPRHBMuEWmaNvhHLITWJcJKzJsRPeJbpTRB@PS(À4 ¡'integration-receive-5577006791947779410@@@@@@@@@@@@@C€@@@SPLIT SÀCA@SPLIT SÀ RC ÀLñlê©JK£)p¾ÁŸÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜lñLÀ©êKJ£)p¾ÁŸÄSrÁU£x-opt-enqueued-timeƒ`f¤uÖ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥`eSsÀ/ ¡ 243c970fd8444a34bc5472a913ae4727@@@@@@@@@@@@Su  1Hello there!SPLIT SÀRA@SPLIT golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/1.bin000066400000000000000000000000771454613650200302510ustar00rootroot00000000000000?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNAL1001efe8e77639b51363d0e69f7d0d0deeb54f27-7000066400000000000000000000001331454613650200350670ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus[S@À2à/#³MSSBCBSPLAIN ANONYMOUSb520e114eaa9a0bcad796d3e988_G0@p121b63cf657332c1d72be872427c4fe3e0ab2e08-6000066400000000000000000000000771454613650200347710ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³MSSBCBSPLAIN "MMOYS"MSSB1246ea4393b4c4b046eee79f945c7440b9255912-3000066400000000000000000000001161454613650200345670ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPFSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@131f5d0f8601cdbf51f6b46f2042ee0e1a79c7bd-4000066400000000000000000000000461454613650200352040ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSPLIT 139f43623461ae26743be5233095e2ccff36f43b-1000066400000000000000000000034251454613650200346370ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b€¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WWIN-U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT z SÀ CR ”äYÃ?–?AƒÕðÔž‰6÷C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nlH£x-opt-sequence-number™£x-opt-Kocked-untilƒ[£ná‡SsÀH ¡$f5b39d65-785d-4f40-8106-52c089dab354@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?17e8582b3cd818c6ed8b29015e57b99625d71b16-5000066400000000000000000000001441454613650200346640ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ï½?ï%Ue11½¿ïrUIY½¿ï½¿ï½ï½?ï%Ue1VfdwCB@PS(À ¡/testC@@@@@@@@@@@@C€@@@1859be31fbf1c51d25e0ec4c712c06308f9d3a0a-8000066400000000000000000000001441454613650200351210ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿ï½¿ï€½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUBrXfdwCB@PSSÀ ¡/test@@@@@@@@@@@@@C€W@@@186dfa30b718110255ad6c34b61bcb4dd12cf45e-2000066400000000000000000000002731454613650200351070ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ@p" encoding="utf-8"?> Hi mate, how are you? Hi mate, how are you?zSÀ1a2d0e23fb1d3db23da21ede6749454fba0da58a-4000066400000000000000000000000771454613650200353310ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³MSSBCBSYLAIN  AEXTERNAL1a72c19f29eb98932fce37c816c02657cd3eb5e0-8000066400000000000000000000001311454613650200350710ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À5à/³MSSBCBSPLN ANONYMOUSEXTPLIT S©£ P Welcome!1a9f1856f5da5061993aceefcb6df0983615365e-9000066400000000000000000000000771454613650200351120ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus? S@À2à/³MSSBCBSPLAIN "MMOYS"ää1b7d287076a690844df01bbf9d490537df0b7532-2000066400000000000000000000054471454613650200346560ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#ccExplorer@@@@@@@@@StÁ8¡d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untixml versߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b€¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0D413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WWIN-U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡teervice Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC ="utf-8"?> Hi mate, how are you?SPLIT z SÀ CR ”äYÃ?–?AƒÕðÔž‰6÷C@B@@`@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nlH£x-opt-sequence-number™£x-opt-Kocked-untilƒ[£ná‡SsÀH ¡$f5b39d65-785d-4f40-8106-52c089dab354@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?1c9eb14d555e0dce6b512073e0042a7778782362-7000066400000000000000000000001441454613650200345550ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ï½?ï¿Ue11½¿ïrUIY½¿ï½%ï½ï½?ï€U1VfdwCB@PS(À ¡/testC@@@@@@@@@@@@C€@@@1e41327fff48ac503d1c1b5d5561f5ea53c29e59-12000066400000000000000000000003461454613650200351410ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT S@`RpˆRRÿ@@@1efcedc1812326cb33ca06b05665856d8497d033-3000066400000000000000000000013171454613650200347140ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJaBRgAvzLXqzR/rUIYvaIujDpHYjÿUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT yw SÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ£x-op-enqueed-time[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?z1f467b49ae5dd07242598aa0312b86a71231ab53-4000066400000000000000000000013171454613650200346220ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJa ¿½ vzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb7-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineNamÿ`@��U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?1fe98c4a23c3595b8a2776eb07a9131c722e2ed6-17000066400000000000000000000005201454613650200350650ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(qa € ½SÀW¡(qa € Þ¿½H VfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/2.bin000066400000000000000000000000321454613650200302410ustar00rootroot00000000000000SDÀ P Welcome!216d05c043c982b2d3967c336106a8917de9a8ed-5000066400000000000000000000001441454613650200346460ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ñ½¿ï%UeXhØ¿½Jð¿½ïǽDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@223a50556c620dacb5404a9986c85316ea477483-14000066400000000000000000000001441454613650200345600ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusd#SÀW¡(pqa½Ûñ½¿½Ûñ½¿½¿ï%¿½Jð¿¿ñ½½€ñ¿€º¿ñ½½ñ½¿½ÛCB@PS(À ¡/test@@@@@@@@@@@@@C€€@@@2261c53ea42e83f12cbd5316ff85733899f7f092-8000066400000000000000000000001441454613650200346630ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿ï½¿ï€½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUBrXfdwCB@PaS(À ¡/test`@@@@@@@@@@@@C€W@@22bc66010aa995087035975229a923a555a47549-9000066400000000000000000000000771454613650200342750ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À5à/³""CBSPLAIN A"S" A"242006c9a478664239ed5e0823c49fe01b299550-14000066400000000000000000000005201454613650200345050ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab500e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT S@`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaaÿÿÿQˆ@Þ¿½HVfdwCB@PS(À ¡/test@@@@@@@@@@@@€C€@@@24564a62b8ecd22af6b7be96f91ce5806692b592-6000066400000000000000000000001441454613650200350220ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ï½?ï¿Ue11½¿ïrUIY½¿ï½%ï½ï½?ï%U1VfdwCB@PS(À ¡/testC@@@@@@@@@@@@C€@@@25512aa0b591c3021769c6846f1fbfd834f60c5f-7000066400000000000000000000001441454613650200347170ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿ï½¿ï€½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUBrXfdwCB@PaS(À ¡/test@@@@@@@@@@@@@C€W@@26b0432ae9018afefd51c6d01f84fc36bcf4b9e9-15000066400000000000000000000005201454613650200353570ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e114eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT  SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(p *½¿ï/ VfdwC½ ソソ ¿ï½¿ï½¿ïexeUB VfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@2720211b2a6ca0c4999821e7626ecf38d3527dbd-10000066400000000000000000000005201454613650200347660ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaaÿ½ vzLXqzQrˆ@Þ¿½HVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@28106818f6b78104bdd97eb504fc5297922946fc-6000066400000000000000000000001001454613650200345770ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus@SÀW¡(p½¿ï½¿ï}½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUBrVfdwCB@PS(2966682c386c4361ad7e8c1524ff0b2d132052ee-13000066400000000000000000000003461454613650200347210ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT áS@`RpˆRRÿ@@@2b0893f5ffd06c8e8d5c43aac95e1cf0dcee357b-2000066400000000000000000000000361454613650200354440ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT AMQPAMQP2b347e0e7e5bcd4d26f694e12c7211e4601a8090-14000066400000000000000000000003411454613650200347650ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa"bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SDÀ P WelIT 2b3d5a8f5888d9583ef177b1f27b7f3dcf8242f4-10000066400000000000000000000001441454613650200351710ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿×½SÀÿ¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½€ÿÿ{XfLCB@P€(À ¡/@@@@@C€test@@@@@@@c@@@2c156f43ddb6a91055a6a8646286e7e59f64ebaf-8000066400000000000000000000001441454613650200351020ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿×½ÿ¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUB{XfLCB@P(À ¡/test@@@@@@@c@@@@@C€W@@@2c850b595e4e37660b7f1682f3315ed9056afa22-7000066400000000000000000000001441454613650200346470ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿ï½¿ï€½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUBrXfdwCB@PaS(À ¡/test@@@@@@@a@@@@@@C€W@2c93ed22e1e23b25a6a4f98f7e3c863d759f6cb2-10000066400000000000000000000005201454613650200352300ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?@øS@À2à/³MSSBCBSPLAIN ANOMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(Žžµa ¿ vzLXqz¿½]U v@�HYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@2f32d03be9b905b14d4c45f3f0b938a91b5c7bd9-7000066400000000000000000000001331454613650200351360ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus[S@À839334774à/³MSSBCBSPLAIN ANONYMOUSb520e114eaa9a0bcad796d3e988_G2f842bb49c5d9f7dfcf9280de0274908423585dd-8000066400000000000000000000000101454613650200350230ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPÿÿÿ€2ff9b64b7086cb5ac6a36f313df40cc2da13b0a9-13000066400000000000000000000001441454613650200353360ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿ï½ß¿ï½¿ï½¿ï½¿ïÿÿÿ€½¿ï½¿ï½¿BrXfdw`@CB@P`S(À ¡/test`@@@`€@@@@@BrXf@@@`@3-roundtrip-small-payload000066400000000000000000000025621454613650200342070ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT GSÀ: ¡$bf1fc6cfef4149b6b1799f6989662b34_G42@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ‚SÀu¡(MMmvYmaFEjLgSvndTeranxGMNCcCdlEBYqxqrgAiCAP@@S)À0¡'integration-receive-5577006791947779410@@@@@@@@@€@@@SPLIT #SÀ CpˆRRCCpèC@B@SPLIT ‡SÀz¡(eJuFVZUsgPmweLRmsdTIwtLUDqoBSNtPRViLXLCrRB@PS(À4 ¡'integration-receive-5577006791947779410@@@@@@@@@@@@@C€@@@SPLIT SÀCA@SPLIT SÀ RC žO#ÉúC­>¹ ü;ÙðC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#OžÉCú­>¹ ü;ÙðSrÁU£x-opt-enqueued-timeƒ`f¤~R£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥háSsÀ/ ¡ cebbd2d485bf4218a9f9d4ac1e0bc82e@@@@@@@@@@@@Su  2Hey there!SÀ RR A÷³ˆú€ðAˆ xî[½ñC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ˆ³÷A€úAðˆ xî[½ñSrÁU£x-opt-enqueued-timeƒ`f¤~R£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥háSsÀ/ ¡ 19c5f419a07f4615a618b179e38f39fb@@@@@@@@@@@@Su  2Hi thSPLIT ere!SÀ RR óÿ-siC¯*˜°óØC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜-ÿósCi¯*˜°óØSrÁU£x-opt-enqueued-timeƒ`f¤~R£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥háSsÀ/ ¡ f4f9e187b6984c7d82a195307a17f377@@@@@@@@@@@@Su  2Ho there!SPLIT SÀRA@SPLIT golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/3-send-small-payload000066400000000000000000000006731454613650200331720ustar00rootroot00000000000000AMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT GSÀ: ¡$62920bb621ce4420b345a8f59141ea58_G52@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ‚SÀu¡(qaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwUCAP@@S)À0¡'integration-receive-5577006791947779410@@@@@@@@@€@@@SPLIT #SÀ CpˆRRCCpèC@B@SPLIT SÀCA@SPLIT golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/3.bin000066400000000000000000000000101454613650200302360ustar00rootroot00000000000000AMQP30b54d455d3bb8cd312c4b2904d416a47ed54e7e-8000066400000000000000000000005201454613650200350460ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(Žžµa ¿è vzLXqzRrrUIYvaIu DpHŽžµa ¿è fdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@326a61e2be950a05fb3fc0bc9c27b861d7a04717-6000066400000000000000000000003061454613650200350430ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusSPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT 366517be38f92746a8b954c363fc230872626a02-7000066400000000000000000000001071454613650200344340ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/S@%½ïH¿ï½¿ïUBrVfdwB@PS(À¡/test@@@@@@@@@@@€369502acb39c34d6436770e7a6233441236db50c-10000066400000000000000000000001441454613650200345420ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿ï½¿ï€½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUBrXfdwCB@PaS(À ¡/test`@@@`@@@@@@`@C€W@@36abe428118f0b9a9df9b85b6de80f7eaddadfbb-13000066400000000000000000000005201454613650200356650ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿€½ï½¿ï½¿ï¿ï½¿ï½¿ïexeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@37afa13b6e3e2b313a4f9c5efc8a4f9725e3831e-12000066400000000000000000000001441454613650200353000ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡>a(p߽¿ï½SÀW¡(p߽¿ï½¿ïCB@PS(À ¡/test@@@@@@@@@@@@@Š€37b2cf1425594bd58ea1b6695768c79eacb54440-6000066400000000000000000000001001454613650200347270ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus@SÀW¡(p½¿ï½¿ï}½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUBrVfdwCB@PQ(385409c556241a346d50ea8d5ddecaf124732340-5000066400000000000000000000000771454613650200346320ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³MSSBCBSPLAIN ANS@YMOUÊ"utfPQòØ3982a7ea0fe660a2d6aeca3a6df62d2ecd2f1001-7000066400000000000000000000005201454613650200353310ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJa ¿½vzLXqzRrrUIYvaIuj WjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@39a431d7c90d4cfdbed7b03261855f06a380dff6-4000066400000000000000000000013771454613650200351500ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀSÀ9 ¡#ccExplorer@@@@@@@@@StÁ8¡d3e988_G0@p`p©€@@@@@SPLIT SPLIT RÀ@SPLIT ²r£ 8@RS"aSPLIT SSeuƒ9Eam0iSPLIT Ix-$d@RSWSPLIT SPLIT 7SPLIT @SPLIT vPSPLIT áßdrWsntSPLIT +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC ="utf-8"?> Hi mate, how are you?SPLIT 3a6ec039e52bdaf063191b96b1fb9069f4ccb0c1-1000066400000000000000000010650151454613650200352110ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT GSÀ: ¡$3d9065c2239c48f88056bcfdd3334d81_G41@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ‚SÀu¡(zjrRNLRzGpzDszPvweGxRQcoxpAQxuFkaowCKoRcCAP@@S)À0¡'integration-receive-5577006791947779410@@@@@@@@@€@@@SPLIT #SÀ CpˆRRCCpèC@B@SPLIT ‡SÀz¡(cTyTJHeKKokJNwUaqKCBRxMSdypnuVQlXTxlLUfRRB@PS(À4 ¡'integration-receive-5577006791947779410@@@@@@@@@@@@@C€@@@SPLIT SÀ AR@AS$E@SÀ AR@AS$E@SÀ AC@AS$E@SÀ AR@AS$E@SÀ AR!@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR @AS$E@SÀ AR @AS$E@SÀ AR @AS$E@SÀ AR @AS$E@SÀ AR @AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SPLIT SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR @AS$E@SÀ AR"@AS$E@SÀ AR#@AS$E@SÀ AR$@AS$E@SÀ AR%@AS$E@SÀ AR&@AS$E@SÀ AR'@AS$E@SÀ AR(@AS$E@SÀ AR)@AS$E@SÀ AR*@AS$E@SÀ AR+@AS$E@SPLIT SÀ AR,@AS$E@SÀ AR.@AS$E@SÀ AR/@AS$E@SÀ AR-@AS$E@SÀ AR;@AS$E@SÀ AR0@AS$E@SÀ AR1@AS$E@SÀ AR2@AS$E@SÀ AR3@AS$E@SÀ AR4@AS$E@SÀ AR5@AS$E@SÀ AR6@AS$E@SÀ AR7@AS$E@SÀ AR8@AS$E@SÀ AR9@AS$E@SÀ AR:@AS$E@SÀ ARX@AS$E@SÀ ARY@AS$E@SÀ ARZ@AS$E@SÀ AR[@AS$E@SÀ AR\@AS$E@SÀ AR]@AS$E@SÀ AR^@AS$E@SÀ AR_@AS$E@SÀ AR`@AS$E@SÀ ARa@AS$E@SÀ ARb@AS$E@SÀ ARc@AS$E@SÀ ARd@AS$E@SÀ ARe@AS$E@SÀ ARf@AS$E@SÀ ARg@AS$E@SÀ ARh@AS$E@SÀ AR<@AS$E@SÀ AR=@AS$E@SÀ AR>@AS$E@SÀ AR?@AS$E@SÀ AR@@AS$E@SÀ ARA@AS$E@SÀ ARB@AS$E@SÀ ARC@AS$E@SÀ ARD@AS$E@SÀ ARE@AS$E@SÀ ARF@AS$E@SÀ ARG@AS$E@SÀ ARH@AS$E@SÀ ARI@AS$E@SÀ ARJ@AS$E@SÀ ARK@AS$E@SÀ ARL@AS$E@SÀ ARM@AS$E@SÀ ARN@AS$E@SÀ ARO@AS$E@SÀ ARP@AS$E@SÀ ARQ@AS$E@SÀ ARR@AS$E@%SÀ RypsRRCRypÓC@B@SÀ ARS@AS$E@SÀ ART@AS$E@SÀ ARU@AS$E@SÀ ARV@AS$E@SÀ ARW@AS$E@SÀ ARi@AS$E@SSPLIT À ARj@AS$E@SÀ ARk@AS$E@SÀ ARl@AS$E@SÀ ARm@AS$E@SÀ ARn@AS$E@SÀ ARo@AS$E@SÀ ARp@AS$E@SÀ ARq@AS$E@SÀ ARr@AS$E@SÀ ARs@AS$E@SÀ ARt@AS$E@SÀ ARu@AS$E@SÀ ARv@AS$E@SÀ ARw@AS$E@SÀ ARx@AS$E@SPLIT SÀ AR|@AS$E@SÀ AR{@AS$E@SÀ ARy@AS$E@SÀ ARz@AS$E@SÀ ARÝ@AS$E@SÀ ARÞ@AS$E@SÀ ARß@AS$E@SÀ ARÓ@AS$E@SÀ ARÔ@AS$E@SÀ ARÕ@AS$E@SÀ ARÖ@AS$E@SÀ AR×@AS$E@SÀ ARØ@AS$E@SÀ ARÙ@AS$E@SÀ ARÚ@AS$E@SÀ ARÛ@AS$E@SÀ ARÜ@AS$E@SÀ AR»@AS$E@SÀ AR¼@AS$E@SÀ AR½@AS$E@SÀ AR¾@AS$E@SÀ AR¿@AS$E@SÀ ARÀ@AS$E@SÀ ARÁ@AS$E@SÀ ARÂ@AS$E@SÀ ARÃ@AS$E@SÀ ARÄ@AS$E@SÀ ARÅ@AS$E@SÀ ARÆ@AS$E@SÀ ARÇ@AS$E@SÀ ARÈ@AS$E@SÀ ARÉ@AS$E@SÀ ARÊ@AS$E@SÀ ARË@AS$E@SÀ ARÌ@AS$E@SÀ ARÍ@AS$E@SÀ ARÎ@AS$E@SÀ ARÏ@AS$E@SÀ ARÐ@AS$E@SÀ ARÑ@AS$E@SÀ ARÒ@AS$E@SÀ AR}@AS$E@SÀ AR~@AS$E@SÀ AR@AS$E@SÀ AR€@AS$E@SÀ AR@AS$E@SÀ AR‚@AS$E@SÀ ARƒ@AS$E@SÀ AR„@AS$E@SÀ AR…@AS$E@SÀ AR†@AS$E@SÀ AR‡@AS$E@SÀ ARˆ@AS$E@SÀ AR‰@AS$E@SÀ ARŠ@AS$E@SÀ AR‹@AS$E@SÀ ARŒ@AS$E@SÀ AR@AS$E@SÀ ARŽ@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR‘@AS$E@SÀ AR’@AS$E@SÀ AR“@AS$E@SPLIT SÀ AR”@AS$E@SÀ AR•@AS$E@SÀ AR–@AS$E@SÀ AR—@AS$E@SÀ AR˜@AS$E@SÀ AR™@AS$E@SÀ ARš@AS$E@SÀ AR›@AS$E@SÀ ARœ@AS$E@SÀ AR@AS$E@SÀ ARž@AS$E@SÀ ARŸ@AS$E@SÀ AR @AS$E@SÀ AR¡@AS$E@SÀ AR¢@AS$E@+SÀ p p0RRCp pC@B@SÀ AR£@AS$E@SÀ AR¤@AS$E@SÀ AR¥@AS$E@SÀ AR¦@AS$E@SÀ AR§@AS$E@SÀ AR¨@AS$E@SÀ AR©@AS$E@SÀ ARª@AS$E@SÀ AR«@AS$E@SÀ AR¬@AS$E@SÀ AR­@AS$E@SÀ AR®@AS$E@SÀ AR¯@AS$E@SÀ AR°@AS$E@SÀ AR±@AS$E@SÀ AR²@AS$E@SÀ AR³@AS$E@SÀ AR´@AS$E@SÀ ARµ@AS$E@SÀ AR¶@AS$E@SÀ AR·@AS$E@SÀ AR¸@AS$E@SÀ AR¹@AS$E@SÀ ARº@AS$E@SÀ ARà@AS$E@SÀ ARá@AS$E@SÀ ARâ@AS$E@SÀ ARã@AS$E@SÀ ARä@AS$E@SÀ ARå@AS$E@SÀ ARæ@AS$E@SÀ ARç@AS$E@SÀ ARè@AS$E@SÀ ARé@AS$E@SÀ ARê@AS$E@SÀ ARë@AS$E@SÀ ARì@AS$E@SÀ ARí@AS$E@SÀ ARî@AS$E@SÀ ARï@AS$E@SÀ ARð@AS$E@SÀ ARñ@AS$E@SÀ ARò@AS$E@SÀ ARó@AS$E@SÀ ARô@AS$E@SÀ ARõ@AS$E@SÀ ARö@AS$E@SPLIT SÀ AR÷@AS$E@SÀ ARø@AS$E@SÀ ARù@AS$E@SÀ ARú@AS$E@SÀ ARû@AS$E@SÀ ARü@AS$E@SÀ ARý@AS$E@SÀ ARþ@AS$E@SÀ ARÿ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SPLIT SÀAp!@AS$E@SÀAp"@AS$E@SÀAp @AS$E@SÀAp#@AS$E@SÀApx@AS$E@SÀApy@AS$E@SÀApz@AS$E@SÀAp{@AS$E@SÀApo@AS$E@SÀApp@AS$E@SÀApq@AS$E@SÀApr@AS$E@+SÀ p´pRRCp±pcC@B@SÀAps@AS$E@SÀApt@AS$E@SÀApu@AS$E@SÀApv@AS$E@SÀApw@AS$E@SÀAp$@AS$E@SÀAp%@AS$E@SÀAp&@AS$E@SÀAp'@AS$E@SÀAp(@AS$E@SÀAp)@AS$E@SÀAp*@AS$E@SÀAp+@AS$E@SÀAp,@AS$E@SÀAp-@AS$E@SÀAp.@AS$E@SÀAp/@AS$E@SÀAp0@AS$E@SÀAp1@AS$E@SÀAp2@AS$E@SÀAp3@AS$E@SÀAp4@AS$E@SÀAp5@AS$E@SÀAp6@AS$E@SÀAp7@AS$E@SÀAp8@AS$E@SÀAp9@AS$E@SÀAp:@AS$E@SÀAp;@AS$E@SÀAp<@AS$E@SÀAp=@AS$E@SÀAp>@AS$E@SÀAp?@AS$E@SÀAp@@AS$E@SÀApA@AS$E@SÀApB@AS$E@SÀApC@AS$E@SÀApD@AS$E@SÀApE@AS$E@SÀApF@AS$E@SÀApG@AS$E@SÀApH@AS$E@SÀApI@AS$E@SPLIT SÀApJ@AS$E@SÀApK@AS$E@SÀApL@AS$E@SÀApM@AS$E@SÀApN@AS$E@SÀApO@AS$E@SÀApP@AS$E@SÀApQ@AS$E@SÀApR@AS$E@SÀApS@AS$E@SÀApT@AS$E@SÀApU@AS$E@SÀApV@AS$E@SÀApW@AS$E@SÀApX@AS$E@SÀApY@AS$E@SÀApZ@AS$E@SÀAp[@AS$E@SÀAp\@AS$E@SÀAp]@AS$E@SÀAp^@AS$E@SÀAp_@AS$E@SÀAp`@AS$E@SÀApa@AS$E@SÀApb@AS$E@SÀApc@AS$E@SÀApd@AS$E@SÀApe@AS$E@SÀApf@AS$E@SÀApg@AS$E@SÀAph@AS$E@SÀApi@AS$E@SÀApj@AS$E@SÀApk@AS$E@SÀApl@AS$E@SÀApm@AS$E@SÀApn@AS$E@SÀApÜ@AS$E@SÀApÝ@AS$E@SÀApÞ@AS$E@SÀApß@AS$E@SÀApÃ@AS$E@SÀApÄ@AS$E@SÀApÅ@AS$E@SÀApÆ@AS$E@SÀApÇ@AS$E@SÀApÈ@AS$E@SÀApÉ@AS$E@SÀApÊ@AS$E@SÀApË@AS$E@SÀApÌ@AS$E@SÀApÍ@AS$E@SÀApÎ@AS$E@SÀApÏ@AS$E@SÀApÐ@AS$E@SÀApÑ@AS$E@SÀApÒ@AS$E@+SPLIT SÀ ppp¨RRCpppC@B@SÀApÓ@AS$E@SÀApÔ@AS$E@SÀApÕ@AS$E@SÀApÖ@AS$E@SÀAp×@AS$E@SÀApØ@AS$E@SÀApÙ@AS$E@SÀApÚ@AS$E@SÀApÛ@AS$E@SÀAp|@AS$E@SÀAp°@AS$E@SÀAp}@AS$E@SÀAp±@AS$E@SÀAp~@AS$E@SÀAp²@AS$E@SÀAp³@AS$E@SÀAp@AS$E@SÀAp´@AS$E@SÀAp€@AS$E@SÀApµ@AS$E@SÀAp¶@AS$E@SÀAp·@AS$E@SÀAp¸@AS$E@SÀAp¹@AS$E@SÀApº@AS$E@SÀAp»@AS$E@SÀAp¼@AS$E@SÀAp½@AS$E@SÀAp¾@AS$E@SÀAp¿@AS$E@SÀApÀ@AS$E@SÀApÁ@AS$E@SÀApÂ@AS$E@SÀAp@AS$E@SÀAp‚@AS$E@SÀApƒ@AS$E@SÀAp„@AS$E@SÀAp…@AS$E@SÀAp†@AS$E@SÀAp‡@AS$E@SÀApˆ@AS$E@SÀAp‰@AS$E@SÀApŠ@AS$E@SÀAp‹@AS$E@SÀApŒ@AS$E@SÀAp@AS$E@SÀApŽ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp‘@AS$E@SÀAp’@AS$E@SÀAp“@AS$E@SÀAp”@AS$E@SÀAp•@AS$E@SÀAp–@AS$E@SPLIT SÀAp—@AS$E@SÀAp˜@AS$E@SÀAp™@AS$E@SÀApš@AS$E@SÀAp›@AS$E@SÀApœ@AS$E@SÀAp@AS$E@SÀApž@AS$E@SÀApŸ@AS$E@SÀAp @AS$E@SÀAp¡@AS$E@SÀAp¢@AS$E@SÀAp£@AS$E@SÀAp¤@AS$E@SÀAp¥@AS$E@SÀAp¦@AS$E@SÀAp§@AS$E@SÀAp¨@AS$E@SÀAp©@AS$E@SÀApª@AS$E@SÀAp«@AS$E@SÀAp¬@AS$E@SÀAp­@AS$E@SÀAp®@AS$E@SÀAp¯@AS$E@SPLIT SÀAp|@AS$E@SÀAp}@AS$E@SÀApa@AS$E@SÀApb@AS$E@SÀApc@AS$E@SÀApd@AS$E@SÀApe@AS$E@SÀApf@AS$E@SÀApg@AS$E@SÀAph@AS$E@SÀApi@AS$E@SÀApj@AS$E@SÀApk@AS$E@SÀApl@AS$E@SÀApm@AS$E@SÀApn@AS$E@SÀApo@AS$E@SÀApp@AS$E@SÀApq@AS$E@SÀApr@AS$E@+SÀ ppmRRCp pÑC@B@SÀAps@AS$E@SÀApt@AS$E@SÀApu@AS$E@SÀApv@AS$E@SÀApw@AS$E@SÀApx@AS$E@SÀApy@AS$E@SÀApz@AS$E@SÀAp{@AS$E@SÀAp~@AS$E@SÀAp@AS$E@SÀAp€@AS$E@SÀAp@AS$E@SÀAp‚@AS$E@SÀApƒ@AS$E@SÀAp„@AS$E@SÀAp…@AS$E@SÀAp†@AS$E@SÀAp®@AS$E@SÀAp‡@AS$E@SÀApˆ@AS$E@SÀAp‰@AS$E@SÀApŠ@AS$E@SÀAp‹@AS$E@SÀApŒ@AS$E@SÀAp@AS$E@SÀApŽ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp‘@AS$E@SÀAp’@AS$E@SÀAp“@AS$E@SÀAp”@AS$E@SÀAp•@AS$E@SÀAp–@AS$E@SPLIT SÀAp—@AS$E@SÀAp¯@AS$E@SÀAp˜@AS$E@SÀAp™@AS$E@SÀApš@AS$E@SÀAp›@AS$E@SÀApœ@AS$E@SÀAp@AS$E@SÀApž@AS$E@SÀApŸ@AS$E@SÀAp @AS$E@SÀAp¡@AS$E@SÀAp¢@AS$E@SÀAp£@AS$E@SÀAp¤@AS$E@SÀAp¥@AS$E@SÀAp¦@AS$E@SÀAp§@AS$E@SÀAp¨@AS$E@SÀAp©@AS$E@SÀApª@AS$E@SÀAp«@AS$E@SÀAp¬@AS$E@SÀAp­@AS$E@SÀAp°@AS$E@SÀAp±@AS$E@SÀAp²@AS$E@SÀAp³@AS$E@SÀAp´@AS$E@SÀApµ@AS$E@SÀAp¶@AS$E@SÀAp·@AS$E@SÀAp¸@AS$E@SÀAp¹@AS$E@SÀApº@AS$E@SÀApà@AS$E@SÀApá@AS$E@SÀApâ@AS$E@SÀApã@AS$E@SÀApä@AS$E@SÀApå@AS$E@SÀApæ@AS$E@SÀApç@AS$E@SÀApè@AS$E@SÀApé@AS$E@SÀApê@AS$E@SÀApë@AS$E@SÀApì@AS$E@SÀApí@AS$E@SÀApî@AS$E@SÀApï@AS$E@SÀApð@AS$E@SÀApñ@AS$E@SÀApò@AS$E@SÀApó@AS$E@SÀApô@AS$E@SÀApõ@AS$E@SPLIT SÀApö@AS$E@SÀAp÷@AS$E@SÀApø@AS$E@SÀApù@AS$E@SÀApú@AS$E@SÀApû@AS$E@SÀApü@AS$E@SÀApý@AS$E@+SÀ pMp“RRCp1pC@B@SÀApþ@AS$E@SÀApÿ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp!@AS$E@SÀAp"@AS$E@SÀAp#@AS$E@SÀAp$@AS$E@SÀAp%@AS$E@SÀAp&@AS$E@SÀAp'@AS$E@SÀAp(@AS$E@SÀAp)@AS$E@SÀAp*@AS$E@SÀAp+@AS$E@SÀAp,@AS$E@SPLIT SÀAp-@AS$E@SÀAp.@AS$E@SÀAp/@AS$E@SÀAp0@AS$E@SÀAp1@AS$E@SÀAp2@AS$E@SÀAp3@AS$E@SÀAp4@AS$E@SÀAp5@AS$E@SÀAp6@AS$E@SÀAp7@AS$E@SÀAp8@AS$E@SÀAp9@AS$E@SÀAp:@AS$E@SÀAp;@AS$E@SÀAp<@AS$E@SÀAp=@AS$E@SÀAp>@AS$E@SÀAp?@AS$E@SÀAp@@AS$E@SÀApA@AS$E@SÀApB@AS$E@SÀApC@AS$E@SÀApD@AS$E@SÀApE@AS$E@SÀApF@AS$E@SÀApG@AS$E@SÀApH@AS$E@SÀApI@AS$E@SÀApJ@AS$E@SÀApK@AS$E@SÀApL@AS$E@SÀApM@AS$E@SÀApN@AS$E@SÀApO@AS$E@SÀApP@AS$E@SÀApQ@AS$E@SÀApR@AS$E@SÀApS@AS$E@SÀApT@AS$E@SÀApU@AS$E@SÀApV@AS$E@SÀApW@AS$E@SÀApX@AS$E@SÀApY@AS$E@SÀApZ@AS$E@SÀAp[@AS$E@SÀAp\@AS$E@SÀAp]@AS$E@SÀAp^@AS$E@SÀAp_@AS$E@SÀAp`@AS$E@SÀAp2@AS$E@SÀAp1@AS$E@+SÀ p“p²RRCptp0C@B@SÀAp»@AS$E@SÀApSPLIT ¼@AS$E@SÀAp½@AS$E@SÀAp¾@AS$E@SÀAp¿@AS$E@SÀApÀ@AS$E@SÀApÁ@AS$E@SÀApÂ@AS$E@SÀApÃ@AS$E@SÀApÄ@AS$E@SÀApÅ@AS$E@SÀApÆ@AS$E@SÀApÇ@AS$E@SÀApÈ@AS$E@SÀApÉ@AS$E@SÀApÊ@AS$E@SÀApË@AS$E@SÀApÌ@AS$E@SÀApÍ@AS$E@SÀApÎ@AS$E@SÀApÏ@AS$E@SÀApÐ@AS$E@SÀApÑ@AS$E@SÀApÒ@AS$E@SÀApÓ@AS$E@SÀApÔ@AS$E@SÀApÕ@AS$E@SÀApÖ@AS$E@SÀAp×@AS$E@SÀApØ@AS$E@SÀApÙ@AS$E@SÀApÚ@AS$E@SÀApÛ@AS$E@SÀApÜ@AS$E@SÀApÝ@AS$E@SÀApÞ@AS$E@SÀApß@AS$E@SÀApà@AS$E@SÀApá@AS$E@SÀApâ@AS$E@SÀApã@AS$E@SÀApä@AS$E@SÀApå@AS$E@SÀApæ@AS$E@SÀApç@AS$E@SÀApè@AS$E@SÀApé@AS$E@SÀApê@AS$E@SÀApë@AS$E@SÀApì@AS$E@SÀApí@AS$E@SÀApî@AS$E@SÀApï@AS$E@SÀApð@AS$E@SÀApñ@AS$E@SÀApò@AS$E@SÀApó@AS$E@SÀApô@AS$E@SPLIT SÀApõ@AS$E@SÀApö@AS$E@SÀAp÷@AS$E@SÀApø@AS$E@SÀApù@AS$E@SÀApú@AS$E@SÀApû@AS$E@SÀApü@AS$E@SÀApý@AS$E@SÀApþ@AS$E@SÀApÿ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@+SÀ p¤pRRCppkC@B@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp!@AS$E@SÀAp"@AS$E@SÀAp#@AS$E@SÀAp$@AS$E@SÀAp%@AS$E@SÀAp&@AS$E@SÀAp'@AS$E@SÀAp(@AS$E@SÀAp)@AS$E@SÀAp*@AS$E@SÀAp+@AS$E@SPLIT SÀAp,@AS$E@SÀAp-@AS$E@SÀAp.@AS$E@SÀAp/@AS$E@SÀAp0@AS$E@SÀAp3@AS$E@SÀCA@SPLIT SÀ RC tû:±“O€Hy ô ¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:ût±O“€Hy ô ¥SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥qÚSsÀ/ ¡ fee5cb9a196b40a4a37f4d070d7c04da@@@@@@@@@@@@Su  3Hey there!SÀ RR %é—¯2ÓL©*/ýRÅC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯—é%Ó2L©*/ýRÅSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥qÚSsÀ/ ¡ bc11c5d10908443a8f7ce1feaff341d3@@@@@@@@@@@@Su  3Hi there!SÀ RR 6++Ø£¿?FŸ¶®h:·þ­C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ø++6¿£F?Ÿ¶®h:·þ­SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥qÚSsÀ/ ¡ 8defb79ec88345b19dbf7ccb2b3b2f12@@@@@@@@@@@@Su  3Ho there!SÀ RR ŽËX çE©¾õŸ…’«+C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ËŽ XE穾õŸ…’«+SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥qéSsÀ/ ¡ 27e8c62818ea432fa74523f5003843ba@@@@@@@@@@@@Su  3Hey there!SÀ RR ÃqÝG¿ê «ñQ"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜qÃÝG¿ê «ñQ"SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU £x-opt-locked-untilƒ`f¥qéSsÀ/ ¡ 0e99e30e1ee943d7b0a34736a7f6428b@@@@@@@@@@@@Su  3Hi there!SÀ RR îC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜|vF‡ÂIjƒ;æ'>îSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥räSsÀ/ ¡ ab98f9e78b1c4320a775ec6404f8e6b8@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR Œ4®.øQA¤¿,—òK’C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®4Œø.AQ¤¿,—òK’SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ d5ce3e1a23de440bbf90ac455ff333ab@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR µ(>QÆPüF¶K‹öòÛŸMC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Q>(µPÆFü¶K‹öòÛŸMSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ f81bf218eda54688b27715a78fb4d712@@@@@@@@@@@@Su  3Hi there!SÀ RR Øè°ÛÝF¦tä|Üf`C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜èØÛ°Fݦtä|Üf`SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ b54c1d2df89f468aa2cb4a85459986e3@@@@@@@@@@@@Su  3Ho there!SÀ RR b|{ÀKµ”³U¸¨tC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜|b{KÀµ”³U¸¨tSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU £x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ 077eccc37c8245ee9ef3d240a2fe03d2@@@@@@@@@@@@Su  3Hey there!SÀ RR sºÉä"ÇHŽ~ (—± C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Éºs"äHÇŽ~ (—± SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU!£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ 8d20854bac354eae9ef5ebb0ba67738d@@@@@@@@@@@@Su  3Hi there!SÀ RR ÓÍH>¨E A’2T ÑÀÄuC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>HÍÓE¨A ’2T ÑÀÄuSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU"£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ c0d42cb9039d4bb5b6974ed3e6f159e8@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR [$ö&2€·I²££%2ÿbC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜&ö$[€2I·²££%2ÿbSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU#£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ eee81f81d84b44fe8f94226fd61abce1@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR ]Døò3µO¾ÇöY…C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜òøD]µ3O¾ÇöY…SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU$£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 0190e7cc87c84fc39258f3065dfa334e@@@@@@@@@@@@Su  3Hi there!SÀ RR  +©ë”Iƒâª³µ¶’©C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ë©+”Iƒâª³µ¶’©SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU%£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 4fe90924d06140088cc32539382c26a1@@@@@@@@@@@@Su  3Ho there!SÀ RR! ƒáó¢*Ç@™§zÏìß]áC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜óáƒ*¢@Ç™§zÏìß]áSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU&£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 725da4500abc4fc4bdb55a45e28ea243@@@@@@@@@@@@Su  3Hey there!SÀ RR" XœþŽkØM’kŒ™ÖÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þœXkŽMØ’kŒ™ÖÉSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU'£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 37f70567d87d4619b06fe0c5b2c60f05@@@@@@@@@@@@Su  3Hi there!SÀ RR# bŸ;¨’¦÷@xµ<¥JóDC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¨;Ÿb¦’@÷xµ<¥JóDSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU(£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 92b95937594749629c2439015fe9feae@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR$ ¼,pÅþÄ,F…J”TÆ«C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Åp,¼ÄþF,…J”TÆ«SrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU)£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ 6858aa0fe02a467dae4b53303daa726f@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR% -âÜ/Q B¡±c5VÑC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Üâ-Q/B ¡±c5VÑSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU*£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ a0a119a4bae743978a683208ab1abb9d@@@@@@@@@@@@Su  3Hi there!SÀ RR& "à@›K›ç®$i—ÚC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@à"›K›ç®$i—ÚSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU+£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ d0438307df1249e5914dcb3548ad57d2@@@@@@@@@@@@Su  3Ho there!SÀ RR' Œ®£½olJ€eùõY¡€yC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜½£®ŒoJl€eùõY¡€ySrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU,£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ 1cebd35124d5401fbcc716525d35402a@@@@@@@@@@@@Su  3Hey there!SÀ RR( í<5Ë•/M‘DEõ²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5<í•ËM/‘DEõ²SrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU-£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ fc4b825eb2124179a9e31289d7b7e319@@@@@@@@@@@@Su  3Hi there!SÀ RR) ›ü9Û.ßEªæƒ0Q¹|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜9ü›.ÛEߪæƒ0Q¹|SrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU.£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ 59a896dc725346f185540fd257a7de21@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR* æ (шyCº?¸–bÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜( æˆÑCyº?¸–bÛSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU/£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ e48c19ebc0e64907a19a4e2cc7103bc8@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR+ :º¶\nµ.NŸ²ÃU÷† sC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜\¶º:µnN.Ÿ²ÃU÷† sSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU0£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ 4d6fdca3655241ed8bad321f106ae603@@@@@@@@@@@@Su  3Hi there!SÀ RR, ("½NE¦òZ&dúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜½"(EN¦òZ&dúSrÁU£x-opt-enqueued-timeƒ`f¤†¾£x-opt-sequence-numberU1£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ ee88b32af2cd4594b612371f8229ecd6@@@@@@@@@@@@Su  3Ho there!SÀ RR- KÜ8Ÿ|ÿL¿±‰ÕWö;õC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ÿ8ÜK|Lÿ¿±‰ÕWö;õSrÁU£x-opt-enqueued-timeƒ`f¤†¾£x-opt-sequence-numberU2£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ dbe07d4e911043d1b1ec0f714807e2c2@@@@@@@@@@@@Su  3Hey there!SÀ RR. ¼0´Z¯þ¯I–ÚˆÑô‚ÚC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Z´0¼þ¯I¯–ÚˆÑô‚ÚSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU3£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ 00e8c68fbbd74a0eac974e5db84956f1@@@@@@@@@@@@Su  3Hi there!SÀ RR/  DU¡Ã+]F™ írƒÔ˜IC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¡UD +ÃF]™ írƒÔ˜ISrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU4£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ 565c685bb1ac4fa393d15f70c4b0bdd0@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR0 §“KSVÐBœò·7·ÑC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜SK“§ÐVBœò·7·ÑSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU5£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ 9dfe00f3a5584155bfb1369b4b48c32d@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR1 ¿Ö[yŸ§…K§„·®×£C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜y[Ö¿§ŸK…§„·®×£SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU6£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ 54d288f642a443c585be6f334405dc7d@@@@@@@@@@@@Su  3Hi there!SÀ RR2 —{ëÜöCÕOEoC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ë{—öÜCÕOEoSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU7£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ afb5ea722ae64f898d76817982399dc2@@@@@@@@@@@@Su  3Ho there!SÀ RR3 Ü߆·5¤FšyÛîû¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†ßÜ5·F¤šyÛîû¥SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU8£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ 4550a8e7ee71481cacd1a42bf4a1a31b@@@@@@@@@@@@Su  3Hey there!SÀ RR4 ›Ûu³4|@†ûèœñƒÿC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³uÛ›|4@†ûèœñƒÿSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU9£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ caeb9718b0f34baa85195a17e5709e03@@@@@@@@@@@@Su  3Hi there!SÀ RR5 Õšõ¬ÊµO­¤wë;aúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¬õšÕµÊO­¤wë;aúSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU:£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ 17805e985c8d47659f07f832fe0876c5@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR6 o]Í.ê¬>C„ÏÄa¾YßçC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜.Í]o¬êC>„ÏÄa¾YßçSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU;£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 5ce8c106c6304166a4f112530b3e7e56@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR7 ¹0ZÖ†ÉN²8,7µíWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÖZ0¹†Nɲ8,7µíWSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU<£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 39eb87ed46e149dd8f3902bb117adf70@@@@@@@@@@@@Su  3Hi there!SÀ RR8 "54˜ C•Õ­…d³ÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5"˜4C •Õ­…d³ÞSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU=£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ fed30d8abd124ea58ed507c27d7babd6@@@@@@@@@@@@Su  3Ho there!SÀ RR9 PNþhÕ'‚OªíÒ%ä&ËC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hþNP'ÕO‚ªíÒ%ä&ËSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU>£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 89826be41a544dc7aae85e40f6b144e2@@@@@@@@@@@@Su  3Hey there!SÀ RR: —‡Œ§Ås/F§A4"4æ)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜§Œ‡—sÅF/§A4"4æ)SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU?£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 21f0326ff8074ae79351a7e3aa702c00@@@@@@@@@@@@Su  3Hi there!SÀ RR; ôtléX[B¸JbêƒÔ¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ltôXéB[¸JbêƒÔ¸SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU@£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 3ca9be1f21d94c108058dc66c878af46@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR< ÅxžÓ¢´K®#uäm¶`!C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÓžxÅ´¢K®#uäm¶`!SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUA£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ 6b94c038d910458a92ac8c6e9d46b763@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR= ¢[áIE§B¼WȤ¾£œC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜á[¢EIB§¼WȤ¾£œSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUB£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ d0462d261cae48de9dd5acf019e1a0bd@@@@@@@@@@@@Su  3Hi there!SÀ RR> ·t•àÕ½ÈL³ªo±JûêC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜à•t·½ÕLȳªo±JûêSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUC£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ 9317317c9e9c46a2b9228b1687d0b7be@@@@@@@@@@@@Su  3Ho there!SÀ RR? ½³[Ög›@˜D–¾û¹(C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜[³½gÖ@›˜D–¾û¹(SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUD£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ b9dde05c34c148028785781afd80fe87@@@@@@@@@@@@Su  3Hey there!SÀ RR@ IT Ü|M¢\RjVz²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜TIÜ M|¢\RjVz²SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUE£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ 33eeb4c3b7cb446980cf4cf0c55e8e18@@@@@@@@@@@@Su  3Hi there!SÀ RRA uÔô±–ÄM©»êJÖu[C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ôÔu–±MÄ©»êJÖu[SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUF£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ e2a253a160cb4dcab7845201e7c95af6@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRB BóajÂE›L$ÝLKRC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jaóBÂE›L$ÝLKRSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUG£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ ea729f3ec5f94a4fa7ea34747050b429@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRC Ã6ã+<,G¾U³îçC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ã6Ã<+G,¾U³îçSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUH£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 1c44d362e8cf4c9c9afe14b4dbcd974c@@@@@@@@@@@@Su  3Hi there!SÀ RRD +…ÃAà­¨A¨ÁnùaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜AÃ…+­àA¨¨ÁnùaSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUI£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 4c434dd791ae425ab482d596f37fbd90@@@@@@@@@@@@Su  3Ho there!SÀ RRE ‚Xsq²I»@‚¹¡‹í (AC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜qsX‚I²@»‚¹¡‹í (ASrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUJ£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ ca602540424d4723a1617774afcc4a7e@@@@@@@@@@@@Su  3Hey there!SÀ RRF  J í¢VC¦¥¦ÃKš~{C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ J ¢íCV¦¥¦ÃKš~{SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUK£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ cb3189e3156646b98fc193e1fc31023d@@@@@@@@@@@@Su  3Hi there!SÀ RRG ’äÎG`_†Fºh5•æ{C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜GÎä’_`F†ºh5•æ{SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUL£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ d7dccfaabcb04f3689e8253e041bb962@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRH Ãتæ•9àLª×6àtº”\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æªØÃ9•Làª×6àtº”\SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUM£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 9c09407f7cd247b082afe5c48d9a65df@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRI Ø™|#!%WH—­^Eˆ•EC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#|™Ø%!HW—­^Eˆ•ESrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUN£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 56e55c70b5514fab941e15c10fed10d3@@@@@@@@@@@@Su  3Hi there!SÀ RRJ ã{GšˆRáK¢Í5+h³RC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜šG{ãRˆKá¢Í5+h³RSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUO£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 72dae1e18f7f4e778cf2cd5f4ed921fe@@@@@@@@@@@@Su  3Ho there!SÀ RRK é (œ¹®C›ë2H/”t€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜( 鹜C®›ë2H/”t€SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUP£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 48f5b34446504df69b4546998aba1357@@@@@@@@@@@@Su  3Hey there!SÀ RRL ij†pâõ¦L¶—¥¤UãFUC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜p†³ÄõâL¦¶—¥¤UãFUSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUQ£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 98838d8352fd4ca0971f06cb5fd5d100@@@@@@@@@@@@Su  3Hi there!SÀ RRM Ñæµè‡|@–J<&ZŸÔóC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜µæÑ‡è@|–J<&ZŸÔóSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUR£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 032b9a4cab0b4decac2e09c13c434b0b@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRN (¯ðÕ¥½I ÷@–,±˜bC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Õð¯(½¥I ÷@–,±˜bSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUS£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ aea00d8a183649318d4e7593a09c0630@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRO QÄÒý3C°"TeOWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÒÄQýC3°"TeOWSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUT£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 85136752c531452894badbacd55951d1@@@@@@@@@@@@Su  3Hi there!SÀ RRP @Á¢®>´K¶=d‚pýõC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¢Á@>®K´¶=d‚pýõSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUU£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 00e8f7baf7444a76a1d63c9d92bc2e09@@@@@@@@@@@@Su  3Ho there!SÀ RRQ  Ñ®+)YèG–aõÆ£ëÙ=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+®Ñ Y)Gè–aõÆ£ëÙ=SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUV£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 1e95f6d205da4774941a1e82dd5ce631@@@@@@@@@@@@Su  3Hey there!SÀ RRR )$Âà9/EŠã!<œßIC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜àÂ$)9E/Šã!<œßISrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUW£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 73a9f45c9a5a4a679067be681e988112@@@@@@@@@@@@Su  3Hi there!SÀ RRS ÎË–gúô I¨ÓBò‡³uC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜g–ËÎôúI ¨ÓBò‡³uSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUX£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 3765e7b7b9c04e8d8c884c902eb7afa5@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRT Ɇ~‰C°øY(˜ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†É~C‰°øY(˜ SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUY£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ d3b1503c5d89434fad5257637e779498@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRU ¹$j] Û%A‘&3|ßœaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜]j$¹Û A%‘&3|ßœaSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUZ£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ 2d61e4bb8473461d8ffa6a5ce7b1cc1a@@@@@@@@@@@@Su  3Hi there!SÀ RRV èq~2B‡AÙØÐ¿9C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜qè~B2‡AÙØÐ¿9SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU[£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ c019d37fd49546bbaaffaf556457c965@@@@@@@@@@@@Su  3Ho there!SÀ RRW ʂՆ÷&IFš 5§&ä+ÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†Õ‚Ê&÷FIš 5§&ä+ÄSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU\£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ d01d7767e0944635b6c3e67a031d9784@@@@@@@@@@@@Su  3Hey there!SÀ RRX RЍï-° F®±5BOlC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï¨ŠR°-F ®±5BOlSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU]£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ ae7740defb9a40a6b797d0b3dea1cac5@@@@@@@@@@@@Su  3Hi there!SÀ RRY UãÑJªõkF¹Ös’ÿ±"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜JÑãUõªFk¹Ös’ÿ±"SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU^£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ 4ee53754754a40b6ac3289c83ac9606f@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRZ ðØßXIJyA³0m!ì„Õ]C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Xߨð²ÄAy³0m!ì„Õ]SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU_£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ 6452879f7f3d4323a0bc0236f6923024@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR[  Ù˜ û@¡ì0Hbf-ìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ù  ˜@û¡ì0Hbf-ìSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU`£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ 66d67615bec547569676af375bac67b2@@@@@@@@@@@@Su  3Hi there!SÀ RR\ ö‘¶@ÇŠoE¶VÑä?…ô-C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@¶‘öŠÇEo¶VÑä?…ô-SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUa£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ a66507d0209644b78d8d4144912f42b9@@@@@@@@@@@@Su  3Ho there!SÀ RR] äc²§X°D‹r°(åöC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜§²cäXD°‹r°(åöSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUb£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ ee5c0da3254c4462a07222f747b2306d@@@@@@@@@@@@Su  3Hey there!SÀ RR^ 5÷»mBYCŠ~{u¾š C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜»÷5BmCYŠ~{u¾š SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUc£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ fa70e4d4964a47838b76f31c95b6f3b3@@@@@@@@@@@@Su  3Hi there!SÀ RR_ tKN{J7æL¬Œ´F›Ú·qC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{NKt7JL欌´F›Ú·qSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUd£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ d363d695ae3149e898af960854aaec1e@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR` ’öÄ(‘âC½WÒ-{M9C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Äö’‘(Câ½WÒ-{M9SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUe£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ b1a13f2e2b5b460fb6bba1477107d367@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRa ð%€S³ÃEŒÄÇÏÅü"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜S€%ð³EÃŒÄÇÏÅü"SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUf£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ a0d06e874b684b74b904e4b2f28453ca@@@@@@@@@@@@Su  3Hi there!SÀ RRb ô[ c×I»§Õ…}€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ [ô×cI»§Õ…}€SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUg£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ 34b1b8c94f5b4930b36fe2480e9528dc@@@@@@@@@@@@Su  3Ho there!SÀ RRc ó9KÛA†ÒD‹˜]Ø' .ˆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÛK9ó†ADÒ‹˜]Ø' .ˆSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUh£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ 1288d1e729c44df1b53b156fb2b9c3d9@@@@@@@@@@@@Su  3Hey there!SÀ RRd ~²½åëûšNj|éH‡ÄôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜å½²~ûëNšj|éH‡ÄôSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUi£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ 638bbd40094040a7a01c9f76f760a057@@@@@@@@@@@@Su  3Hi there!SÀ RRe 0nØý©î@£Q#&Š)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Øn0©ý@î£Q#&Š)SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUj£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ 2aaa8e0faefe464f9e0045f29c042ae4@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRf ECãÆ{²O™¤XC&‹-¼C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãCE{ÆO²™¤XC&‹-¼SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUk£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ dfde108ce1114e25bc9f0cc2d4af34d7@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRg qßþ³â6@¿tü ëëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³þßqâ@6¿tü ëëSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUl£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ cd31fe2243434244bc028688a799c34c@@@@@@@@@@@@Su  3Hi there!SÀ RRh M˜ƒîA®ögu¦ÄzÃC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Mƒ˜Aî®ögu¦ÄzÃSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUm£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ 1e98b4094c184fe8a6825d349c7690a8@@@@@@@@@@@@Su  3Ho there!SÀ RRi ç_è…êcH€•uä¹ 6C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜è_çê…Hc€•uä¹ 6SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUn£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ 991ec1e3d8264b6895b436ae53cd3cfc@@@@@@@@@@@@Su  3Hey there!SÀ RRj Õ±Û»SI±utr9:n|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Û±ÕS»I±utr9:n|SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUo£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ 3fde53ba4fbe40729aae86a23096e13c@@@@@@@@@@@@Su  3Hi there!SÀ RRk 6tùñ>´ÂM¦ýÞ@÷–ÅC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ñùt6´>M¦ýÞ@÷–ÅSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUp£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ 94b88707475d4c32927c2c294feff41c@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRl “Eœðï©G…•°›xÞÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜œE“ïðG©…•°›xÞÕSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUq£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ e3691688028e45c4beeb7556b46ad5ad@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRm éÒ‹ÄGšÇ³ŽézC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Òé‹GĚdzŽézSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUr£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ ab44d47ec51f47e191fc38b7943bfdb1@@@@@@@@@@@@Su  3Hi there!SÀ RRn CýÝJ†KEKŠs°]©IC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜JÝýCK†KEŠs°]©ISrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUs£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ 1eb50643bea9447d803c9029ff2a2663@@@@@@@@@@@@Su  3Ho there!SÀ RRo :{›Û˜N½]Zb`¬7˜C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Û›{:˜N½]Zb`¬7˜SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUt£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ adad5bb9849745879d5b7d5cb94bf8bf@@@@@@@@@@@@Su  3Hey there!SÀ RRp JÒ\ŽØF•ÙÔz % C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜\ÒJØŽF•ÙÔz % SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUu£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ c9f11a3a83c44c018fd9ecb074483ce5@@@@@@@@@@@@Su  3Hi there!SÀ RRq ÷Víº3MœÅÞVÊÇC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜íV÷ºM3œÅÞVÊÇSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUv£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ 8e487ff4cddc4d729f82ea5886895c84@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRr ž 4ÊMK§Èµ˜OHPC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4 žMÊK§Èµ˜OHPSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUw£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ b906f9ef18d24346baaabf4fdab05c9b@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRs R™üÖK[K–2á§ (¾C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ü™RKÖK[–2á§ (¾SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUx£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ b66149d7d9cb4d2e931b03af3e0e22ab@@@@@@@@@@@@Su  3Hi there!SÀ RRt KX”5nåIm’*¯FÌC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”XKn5Iåm’*¯FÌSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUy£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ f4d87ea7ddc7453b9f90f68b5c88075e@@@@@@@@@@@@Su  3Ho there!SÀ RRu t9¼å×ímJŒÇUZÿ8ÇaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜å¼9tí×JmŒÇUZÿ8ÇaSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUz£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ f7bc24d1f4864680af962f69fe0ea14b@@@@@@@@@@@@Su  3Hey there!SÀ RRv ³ý ﯡO•w_Ð Ø­C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï ý³¯O¡•w_Ð Ø­SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberU{£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ 746ca05f92064841ac581390101110de@@@@@@@@@@@@Su  3Hi there!SÀ RRw Š4ß¹–LµhöXÞ²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ß4йL–µhöXÞ²SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberU|£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ 4101f41a967c41f9a1c264ba55f8d083@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRx 3 _¼zpK¸þžª›ôŸC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜_ 3z¼Kp¸þžª›ôŸSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberU}£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ a79f92a70b7542a69501ecc866898b66@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRy @[~»šðL¦HŸ£¸ßC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~[@š»Lð¦HŸ£¸ßSrÁU£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberU~£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ 1353f699ea3e4b379522ad20b2bbde7c@@@@@@@@@@@@Su  3Hi there!SÀ RRz º.AC¹1:E¥L›-¤œ õC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜CA.º1¹E:¥L›-¤œ õSrÁU£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ 1d5c59e32cf44ba083e2f0389f28525c@@@@@@@@@@@@Su  3Ho there! SÀ RR{  ‰F½`ߦ€ªÀC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ F‰½`ߦ€ªÀSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number€£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ b9120148f5ec4563a8eabdab305830ae@@@@@@@@@@@@Su  3Hey there! SÀ RR| ]måº`ßµIÈoÖô¬1C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ºåm]ß`IµÈoÖô¬1SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ b41f3f84833d4f76bab2c322677b6804@@@@@@@@@@@@Su  3Hi there! SÀ RR} ÕQwåå>A‘)×yñpC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜wQÕååA>‘)×yñpSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‚£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ dd6dd88d608043cdaa5d9751f2cb5f5b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR~ 8ÓæÿÿD¯ïØ…¨5C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æÓ8ÿDÿ¯ïØ…¨5SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberƒ£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ fcef537e85df4e329a85f0c30a206238@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR  d^>‚›C® ÙÏâPÀC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^d ‚>C›® ÙÏâPÀSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number„£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ d0e88b9701504935b31ed088f85f065e@@@@@@@@@@@@Su  3Hi there! SÀ RR€ ½Ó/ÄÿcN——ã$£î3C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ä/Ó½ÿNc——ã$£î3SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number…£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ ef5bada9164346c1805abe859d5812db@@@@@@@@@@@@Su  3Ho there! SÀ RR ê¹ïGŠ Iœaë­SC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï¹êŠGI œaë­SSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number†£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ 16ef7dd8fe2f4c4985f937ce1fa38df7@@@@@@@@@@@@Su  3Hey there! SÀ RR‚ ܤÚÌ.€§J²¨-÷°ÊÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ìڤ܀.J§²¨-÷°ÊÝSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‡£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ bea19b42b06845dbb94c88bc9b135d4b@@@@@@@@@@@@Su  3Hi there! SÀ RRƒ ԃaKH–³8úíC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÔЇîaƒKH–³8úíSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberˆ£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ 3b950801e5024818a5eb580777d6c1dc@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR„ »•ÒjÂ(%G®á”çB.ÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jÒ•»(ÂG%®á”çB.ÔSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‰£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ c57b5f6e099b45c99a27bbb6299ceede@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR… ¬Áòr~N¨Þ—î}K©ÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜òÁ¬rN~¨Þ—î}K©ÄSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberŠ£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ 7a561baad99c4c9ea1c4d57addfdf690@@@@@@@@@@@@Su  3Hi there! SÀ RR† &‰Gù{ãK±a›C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜G‰&{ùKã±a›SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‹£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ 2287bc3e1c64455dadee056841d134be@@@@@@@@@@@@Su  3Ho there! SÀ RR‡ Ô,EÉÉC´0ÓàÌ:‰C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜,ÔÉECÉ´0ÓàÌ:‰SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberŒ£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ 5f71a1b51ae74a0eb1e6bb62781be95e@@@@@@@@@@@@Su  3Hey there! SÀ RRˆ Zˆâ›)SXN´ÑÊXgq£C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜›âˆZS)NX´ÑÊXgq£SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ 640c0f24b41544faab254a2cac3b0dcf@@@@@@@@@@@@Su  3Hi there! SÀ RR‰ ޲>Ÿ’B¿×ðÜp±MC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>²ŽŸB’¿×ðÜp±MSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberŽ£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ fc070119619c45d3b6d3cf2b18683525@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRŠ ‘"QÛŸ¼F„V‰&QÚ|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÛQ"‘ŸF¼„V‰&QÚ|SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ fa8b7f0704484f4aaeb56296fc234a69@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR‹ NSe^fõþD­‘@¾GC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^eSNõfDþ­‘@¾GSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ 25ef926f741f4358be2eb2e6b2fd9957@@@@@@@@@@@@Su  3Hi there! SÀ RRŒ èBû#°†J·?b¹¼GŽC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#ûBè°J†·?b¹¼GŽSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‘£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ 694757a4accf4cf485ccaa8f73e7899d@@@@@@@@@@@@Su  3Ho there! SÀ RR ";6°H¯ÅH®Œv´'ÎXC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°6;"¯HHÅ®Œv´'ÎXSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number’£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ 3702a9f3d7ce4f1cb4266b4999793680@@@@@@@@@@@@Su  3Hey there! SÀ RRŽ ßjœÁ8ÄG’ä©'óõ!õC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Áœjß8GÄ’ä©'óõ!õSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number“£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ ad6b74b84d5a41ebbb4edde0dbfcdce6@@@@@@@@@@@@Su  3Hi there! SÀ RR š=ñ+å=F  ÁN•ׯC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+ñ=š=åF  ÁN•ׯSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number”£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ 10ff794e715e4d55825c8d094de9a232@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR @¹dnBH¤ÝÆ&Ù‰ ÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¹@ndHB¤ÝÆ&Ù‰ ÕSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number•£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ 9f5d7269d1694e57a9e65005be2e70aa@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR‘ ºE¯ÑЉK“J|¶“RoC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯EºÐÑK‰“J|¶“RoSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number–£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ b83cad52fee745ad8c58459edec2bcec@@@@@@@@@@@@Su  3Hi there! SÀ RR’ #3ÌÏÓ9GœÉó©; C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÏÌ3#9ÓGœÉó©; SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number—£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ e84e67d0e1404313a162c641d1cb1fa5@@@@@@@@@@@@Su  3Ho there! SÀ RR“ XÌ‚=\uD‡þWÝ~5ÐõC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚ÌX\=Du‡þWÝ~5ÐõSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number˜£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ c8ce7210d00c439fab64d144b35a70fe@@@@@@@@@@@@Su  3Hey there! SÀ RR” Ðrâ*Âá®M¢\Æ*Å3ÂíC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*ârÐáÂM®¢\Æ*Å3ÂíSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number™£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ efe786e68fd94f2a9c568ee49c758b79@@@@@@@@@@@@Su  3Hi there! SÀ RR• |¿Xåy5ÉH†gËÂG?/C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åX¿|5yHɆgËÂG?/SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberš£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ a07a60ab18db40379271c0750e2a7180@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR– ´ËA­%ÓÔCÐ|²þP{C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜­AË´Ó%CÔÐ|²þP{SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number›£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ a381d6e23c794138ab9de04b3009bcd1@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR— øf2D¥q/AŒ()ëÓC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜D2føq¥A/Œ()ëÓSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberœ£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 083ab1b6e61e4f688e8da04cb3790fe8@@@@@@@@@@@@Su  3Hi there! SÀ RR˜ ·uÓWèÎG¸ù»¹¶ÝLC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Óu·èWGθù»¹¶ÝLSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 107d78c61b684b55a1234e05a8b2ca95@@@@@@@@@@@@Su  3Ho there! SÀ RR™ àÌæ‡A‰'/í²y›YC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æÌà‡A‰'/í²y›YSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberž£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 2f2f0e30508041a2a12928f656b27376@@@@@@@@@@@@Su  3Hey there! SÀ RRš ç÷Šamæ©IƒBÂ+ÁIì«C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜aŠ÷çæmI©ƒBÂ+ÁIì«SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberŸ£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 698661f4454e440daedadae817e48304@@@@@@@@@@@@Su  3Hi there! SÀ RR› õ˜¡wksL»meÉ…ê¼âC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜w¡˜õkLs»meÉ…ê¼âSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number £x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 1d53a067687d47769e292e906a9749ad@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRœ Æ·A @E¬ä_2ÇRC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜A·Æ E@¬ä_2ÇRSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¡£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ ff25046060c94be69cb602ada3c43896@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR LŸ²à/†9H„Qˆ‚W$(BC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜à²ŸL†/H9„Qˆ‚W$(BSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¢£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ ba7c3a9462a440d49383c812773cb5bd@@@@@@@@@@@@Su  3Hi there! SÀ RRž Ûýýv±å,I¨xà]IBõC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜výýÛå±I,¨xà]IBõSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number££x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ 658c86a3015b463ea2ce564b7315934d@@@@@@@@@@@@Su  3Ho there! SÀ RRŸ ÊŸQ‘Á&A‚s+ÞèC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜QŸÊÁ‘A&‚s+ÞèSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¤£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ 989f7f8f457d470187bf7eaf1dab460e@@@@@@@@@@@@Su  3Hey there! SÀ RR  L Û.¥Mª •sçÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Û L¥.Mª •sçÏSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¥£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ ef02fcbac2c04469ba12c64ad4688569@@@@@@@@@@@@Su  3Hi there! SÀ RR¡ æ>èAÏ@šÃàaxjC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Aè>æÏ@šÃàaxjSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¦£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ dd57e47205604331859d05dc7be47a11@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR¢ ¥ŒøeÜ/N‚ýSræ§4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜øŒ¥ÜeN/‚ýSræ§4SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number§£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ d3636221a69142ce910bdf159be32d3d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR£ |-ïy+ÇLŒØ¶õùäÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï-|+yLnjضõùäÏSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¨£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ 77386d51738641a4be046c110cfe634e@@@@@@@@@@@@Su  3Hi there! SÀ RR¤ ‰Qd¿Ê­Mž|nEÁÐ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¿dQ‰­ÊMž|nEÁÐ SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number©£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ d49a578213964e7baa74d8d41cac052f@@@@@@@@@@@@Su  3Ho there! SÀ RR¥ îÂãh8p–K»÷¢ C‡ß¯C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hãÂîp8K–»÷¢ C‡ß¯SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberª£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ 8e8e607bf4c04c948ff6679474cf7ff2@@@@@@@@@@@@Su  3Hey there! SÀ RR¦ *ÂÉ"¾aD¢’÷‘ºEi‘C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÉÂ*¾"Da¢’÷‘ºEi‘SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number«£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ 0cb119b874344909941c34719c75769d@@@@@@@@@@@@Su  3Hi there! SÀ RR§ Y»‰¸WMIœ[#Ò•C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¸‰»YWIMœ[#Ò•SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¬£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ c94644c17ee64812827cabf3e39a61d4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR¨ ÎÖä:ä"_I·ckgêÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:äÖÎ"äI_·ckgêÔSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number­£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ 2b291706aeb041969befce5f65b86259@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR© qYKxÆÇF”à'ùÈà8C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜KYqÆxFÇ”à'ùÈà8SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number®£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ ebcd8d1f76b9494298f2545f3f9a4818@@@@@@@@@@@@Su  3Hi there! SÀ RRª j*†^^³B®Nºñ‘æ#ÎC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^†*j^B³®Nºñ‘æ#ÎSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¯£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ 720d07c5c1f744f4a37640003da03265@@@@@@@@@@@@Su  3Ho there! SÀ RR« ܾÓ&&ÌDžóUfjS‰ùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ó¾Ü&&DÌžóUfjS‰ùSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number°£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ d4723a5885f64de49a7092e9c004650d@@@@@@@@@@@@Su  3Hey there! SÀ RR¬ 4Ç´º O´ô\•쩘C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ç4º´O ´ô\•쩘SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number±£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ 2787ca5d76bd4182a32bf577bf3c6f26@@@@@@@@@@@@Su  3Hi there! SÀ RR­ h3D÷vïF<ð·\Y8C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜÷D3hïvF<ð·\Y8SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number²£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ 6e4bf0134adc41b0a03b57b0f56f1547@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR® "N~ ŽF¢»"ÆôàC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ~N"ŽF¢»"ÆôàSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number³£x-opt-locked-untilƒ`f¥|zSsÀ/ ¡ 724b7a3641b54c2c9c0ae81c208ecac6@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR¯ ”ö/ÚëµîI²€Ék›„C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ú/ö”µëIî²€Ék›„SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number´£x-opt-locked-untilƒ`f¥|zSsÀ/ ¡ 026a13c3f2614eb1919b91db3b01bde1@@@@@@@@@@@@Su  3Hi there! SÀ RR° 2…ÍÃF¨L÷Ï#®á DC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÃÍ…2¨FL÷Ï#®á DSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberµ£x-opt-locked-untilƒ`f¥|zSsÀ/ ¡ 3297935e6cd14c40a2971e66e8164e5f@@@@@@@@@@@@Su  3Ho there! SÀ RR± žéRT% Jšs- "³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Réž%TJ šs- "³SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¶£x-opt-locked-untilƒ`f¥|zSsÀ/ ¡ 4be135e5db3644e2b74c4746af77698f@@@@@@@@@@@@Su  3Hey there! SÀ RR² Þî· É’“à·ÿrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5¹Š¶#MHtŽ>’“à·ÿrSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberº£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ 156a8b12d1ce424bbedd5df1c81d8b46@@@@@@@@@@@@Su  3Hi there! SÀ RR¶ HÉÐÈ($øFŠ‘Óî–*C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÈÐÉH$(FøŠ‘Óî–*SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number»£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ f2f9b7ba39cf4392a25e99d136dc727f@@@@@@@@@@@@Su  3Ho there! SÀ RR· Žòüæß³V@‚2j>yØ,LC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æüò޳ß@V‚2j>yØ,LSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¼£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ 83cc01d73fdf4ac5b063ba5302807a86@@@@@@@@@@@@Su  3Hey there! SÀ RR¸ ¹°¾ƒûñG‡™O¡U}|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾°¹ûƒGñ‡™O¡U}|SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number½£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ 223f83990ef4481d9beabc54695e8502@@@@@@@@@@@@Su  3Hi there! SÀ RR¹ pîk+—ޝH¤ÿe‡Ë(fC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+kîpŽ—H¯¤ÿe‡Ë(fSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¾£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ 35dc8b8c5b60474db747703d4668a79a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRº ó aŒrM³{\ßñäÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜a órŒM³{\ßñäÞSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¿£x-opt-locked-untilƒ`f¥}SsÀ/ ¡ c431a44d0eab43c98418cb4be7c059d0@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR» ´Ž‰5wC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜8ÛàßgGQ¯¢k‹[>5wSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberÜ£x-opt-locked-untilƒ`f¥~}SsÀ/ ¡ 8f06d767f672423ba41e0a0a15e37568@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRØ ÐvBh7dFH¹P9tx'C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hBvÐd7HF¹P9tx'SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberÝ£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ ec8876acd49f4614a3a99998195cb99b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RRÙ qQ&·ÁÌA—V±êï«eC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜&QqÁ·AÌ—V±êï«eSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberÞ£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ c05a4478472b44f19023ee9edd18c1aa@@@@@@@@@@@@Su  3Hi there! SÀ RRÚ ìX•ÝC„ÿg[WGJÈC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ì•XCÝ„ÿg[WGJÈSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberߣx-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ a4d6f4c395964b968a2485185e3e05dc@@@@@@@@@@@@Su  3Ho there! SÀ RRÛ m&€#h:õK…‘³Ix$uC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#€&m:hKõ…‘³Ix$uSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberà£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ 82b03c260e0f4edeaf9ae40ab03dd516@@@@@@@@@@@@Su  3Hey there! SÀ RRÜ @ûrÄ¥ÑEº…Ú›Tq*C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜rû@¥ÄEѺ…Ú›Tq*SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberá£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ 04ea404508714aa7b52b8efaa95bc00a@@@@@@@@@@@@Su  3Hi there! SÀ RRÝ YA kú$K¾ÕË]3C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜k AYúK$¾ÕË]3SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberâ£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ ffde1734f93d4c75b3590e0716508c9a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRÞ ŠOœ¤^c·C³Ýd…ôêG™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤œOŠc^C·³Ýd…ôêG™SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberã£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ 3ff7af3dcf3a492ea5033aab64364a2f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RRß @Í iLiA­Pûîß*ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ Í@LiAi­Pûîß*ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberä£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ 69a705e1b68948acb21211633cd118c1@@@@@@@@@@@@Su  3Hi there! SÀ RRà ¢;l˜êTF ƉõàhC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜l;¢ê˜FT ƉõàhSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberå£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ dbcb72ada6524654b7f3c1f77e76359e@@@@@@@@@@@@Su  3Ho there! SÀ RRá ÿ#îXÍ„L¶;.?—·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Xî#ÿÍL„¶;.?—·SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberæ£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ 2dd57e04cedc4803ae1d9f1050b112c6@@@@@@@@@@@@Su  3Hey there! SÀ RRâ —mv}ÌÕçD€'˜ÂjhùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜}vm—ÕÌDç€'˜ÂjhùSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberç£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ d57e665a1b764308a94ff259425fb7be@@@@@@@@@@@@Su  3Hi there! SÀ RRã ÕTC'Y%O{‚.IC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜CTÕY'O%{‚.ISrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberè£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ 04bf17b9d74c47fba115df742179ab36@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRä ¡z^x[©G»ÙDvüÃ×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^z¡[xG©»ÙDvüÃ×SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberé£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ c9ccc81ffdb94fc8aac261053214162e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RRå Õ±Yâø5è@  Û)äìvC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜âY±Õ5ø@è  Û)äìvSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberê£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ 766c71a41ac649a4834a180faa578670@@@@@@@@@@@@Su  3Hi there! SÀ RRæ vîyñÕã±NŽ×" Þ’ùåC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ñyîvãÕN±Ž×" Þ’ùåSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberë£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ e78849aa93e9402bb5954364fc97bd1a@@@@@@@@@@@@Su  3Ho there! SÀ RRç ż0Žï÷5Dˆ§6&йeC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ž0¼Å÷ïD5ˆ§6&йeSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberì£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ 1c86ba96e0064b92a9ac9d138c78bc64@@@@@@@@@@@@Su  3Hey there! SÀ RRè Aä_?BêŸK™(ö¹¸½DPC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜?_äAêBKŸ™(ö¹¸½DPSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberí£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ cd77e7b7b69a474299041a3d3a2207bb@@@@@@@@@@@@Su  3Hi there! SÀ RRé c§¹æRMˆæaMB†;`C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¹§cæMRˆæaMB†;`SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberî£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ 77c71356fc5f4a128a7aca008eab6124@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRê ïx›-°Až tÒ´‡ØLC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜›xï°-Až tÒ´‡ØLSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberï£x-opt-locked-untilƒ`f¥ôSsÀ/ ¡ 6c0850b4da2f4b02ba02c07eba55dc81@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RRë ^ÅM´…¿5G¼²öƒÕ:žEÿêv^Eš¨|">KH¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿE>(vêE^š¨|">KH¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥LSsÀ/ ¡ dea138aa54634b06860267b951ff6599@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ˜AåkiUN¨EÒ†í¥+KC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜kåA˜iNU¨EÒ†í¥+KSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥LSsÀ/ ¡ eb014cd8456240a1a7e3fe9cc2a7e64f@@@@@@@@@@@@Su  3Ho there! SÀ" Rp ÷>â[P‚L¶>ýäíC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜â>÷P[L‚¶>ýäíSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥LSsÀ/ ¡ ac8849ddf40e4e709282d14384d9db1d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp wМqQJŽ1“kžâhuC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜œÐwQqJŽ1“kžâhuSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥LSsÀ/ ¡ c40a9a4359fa4e6b9d924eb8c4d35ff9@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ÿŠ_»ôŽK¢°*)g™üC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜_Šÿô»KŽ¢°*)g™üSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥LSsÀ/ ¡ c87f99e59a1049b7884fcc8896b79598@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ˜ù‡¶Ù[F–šU|Ræû¯C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¶‡ù˜ÙF[–šU|Ræû¯SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 151464175be14d0f913333c80290c835@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp  ¹?v tKª· ¨Ø'C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜v?¹ Ktª· ¨Ø'SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 9b1e8380ef0945819259c394ba148c2a@@@@@@@@@@@@Su  3Hi there! SÀ" Rp  ÇßN·nM¾àìÍ¥¿C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜NßÇn·M¾àìÍ¥¿SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 961f656b9cf74b4286c97c28e6c154c5@@@@@@@@@@@@Su  3Ho there! SÀ" Rp   IïJ¦-í9RC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜I Jï¦-í9RSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 8459fc5229c649f7a664317b9ae4bc99@@@@@@@@@@@@Su  3Hey there! SÀ" Rp  •æi¬M\A“¿¯PmØ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¬iæ•MA\“¿¯PmØ SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 32adb445e6084c679ef20f2c7ee4da5e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp  ÉPJ1í(Nµœôu ?ÖC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜1JPÉíN(µœôu ?ÖSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ abea8e376646410c86fecc7f8745a914@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp —Kf&™F¹bOÔÈÍC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K—&fF™¹bOÔÈÍSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ 4b5b952fb58c4e65aaec3a7ddbdeea2c@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp žÙ}h|ßH‚L{ lÓ–C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h}Ùž|Hß‚L{ lÓ–SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ 92b692e0e3524b58a8abc53a06088f8a@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ÛÐB@ûÑF£Ìª*>šú4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜BÐÛû@Fѣ̪*>šú4SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ e5f5b3364f4840679660874202ce0320@@@@@@@@@@@@Su  3Ho there! SÀ" Rp Ïj$ÇÁH´R¬DHˆ³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jÏÇ$HÁ´R¬DHˆ³SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ cd93fefa73124756b6841cf3e193ebd4@@@@@@@@@@@@Su  3Hey there! SÀ" Rp æH"«OÀK¾Ÿ²§MðñC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜"HæO«KÀ¾Ÿ²§MðñSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ 0c6238724eae4cf5908523888ffe6264@@@@@@@@@@@@Su  3Hi there! SÀ" Rp Ô÷PœËã²CúoÁ«rtC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜œP÷ÔãËC²úoÁ«rtSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ 08ccb57caa0a475591595e89e4a66ba7@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ˜NñáÒ/ÇF³/È*E·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜áñN˜/ÒFdz/È*E·SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ f07d366fe1bf4fec9acf4b70d32d13aa@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp E' ë\&¯A¤¥vàk°AC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ë 'E&\A¯¤¥vàk°ASrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ b2ed3517511543f8826dec4d97254249@@@@@@@@@@@@Su  3Hi there! SÀ" Rp Þg«š‡N—ƒxÆ‹ì]éC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜gÞš«N‡—ƒxÆ‹ì]éSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ dc0083cb929344ae9dcc9c52c0f2df3a@@@@@@@@@@@@Su  3Ho there! SÀ" Rp Êììæñ"=N°UN%“ú×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æììÊ"ñN=°UN%“ú×SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ 2f6af03ee0394084be75c76ec1ee6b3d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp Ì– h2ÔI„ämDd?õ1C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ –Ì2hIÔ„ämDd?õ1SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ 627c75139b7e4f628446c0a405ee5f5c@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ö1¥¯ yKD…ÑÖBC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯¥1ö KyD…ÑÖBSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ df9ba16bb75d494382e8a533a662d7c8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp %1dÏ”ë@M³˜PU¨üüZC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ïd1%ë”M@³˜PU¨üüZSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ 5e9a0c738d774345a8872bd53eed9c51@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp gAÔåìŠäK¶œCA1!m-C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åÔAgŠìKä¶œCA1!m-SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ 15f84acd8fd84166ae7d226a4aca16a9@@@@@@@@@@@@Su  3Hi there! SÀ" Rp L˜˜ˆ4úL³dE]CQûC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ˆ˜˜L4Lú³dE]CQûSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number!£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ d5b5ae82c2b64e4f89bf0da59e375667@@@@@@@@@@@@Su  3Ho there! SÀ" Rp €‰t:¹f@ˆÀ Þe§ëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:t‰€¹@fˆÀ Þe§ëSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number"£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ 7f52ad7e42c54cc58db96bb72f23b187@@@@@@@@@@@@Su  3Hey there! SÀ" Rp £c.â%±K„.÷kv‰ >C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜â.c£%K±„.÷kv‰ >SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number#£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ 0615a6e6574e435a96e53a7f0dd93c51@@@@@@@@@@@@Su  3Hi there! SÀ" Rp |»Ð<´µ£F—È|‘`6‹ÐC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜<л|µ´F£—È|‘`6‹ÐSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number$£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ e3e1af49000c4e35b17129e6b8616646@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  û†eò=]M¨)Óº¶õC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜e†û=òM]¨)Óº¶õSrÁ\£x-opt-enqueued-timeƒ`f¤‡£x-opt-sequence-number%£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 650ea52bdd2249c39578d9709f6c9b73@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp! \M7¤õO¦±$†gû C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜M\¤7Oõ¦±$†gû SrÁ\£x-opt-enqueued-timeƒ`f¤‡£x-opt-sequence-number&£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ c327a03fd378488897b0197035e7d883@@@@@@@@@@@@Su  3Hi there! SÀ" Rp" ÂòÇWzH³ª³2U #%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÇòÂzWH³ª³2U #%SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number'£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 6b7f1d241bb347eaa96ea2059b1fa48d@@@@@@@@@@@@Su  3Ho there! SÀ" Rp# ¡ˆè¢°OœÔOgKDÌC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜èˆ¡¢O°œÔOgKDÌSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number(£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 018ce47e79c7431caecfecaf9cbf6a88@@@@@@@@@@@@Su  3Hey there! SÀ" Rp$ €í ½qE‘(Ò'¾1C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ í€q½E‘(Ò'¾1SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number)£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 22aa9820b5054e2e9de9247a9ed8de0e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp% SÑÿ¸`‡O¸“3]ðiÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿÑS`¸O‡¸“3]ðiÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number*£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 46c9365259714adeb8ebb862ab108062@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp& U‰KL{”Cˆ÷þýõ¡çWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K‰U{LC”ˆ÷þýõ¡çWSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number+£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ f343508c9e0f4bf08977b3ef3a232382@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp' È [}ÂÛŸCžØ@=CùÖÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜}[ ÈÛÂCŸžØ@=CùÖÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number,£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ 3a7b3d48c9e7440185139e486234c19a@@@@@@@@@@@@Su  3Hi there! SÀ" Rp( …d =K{&B”8ˆ,æ ÍC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜= d…{KB&”8ˆ,æ ÍSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number-£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ 106f2f4993e74d54bf59662c7086b5bb@@@@@@@@@@@@Su  3Ho there! SÀ" Rp) lö6ØŽ™H¥¥÷ŸºÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜6ölŽØH™¥¥÷ŸºÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number.£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ d5957aa44c174389b812be4c5852e290@@@@@@@@@@@@Su  3Hey there! SÀ" Rp* ~-.ó‚~\K’^æ¨Ù¾ÌC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ó.-~~‚K\’^æ¨Ù¾ÌSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number/£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ 87c2499d7c3c40bdbafaaed8cc763869@@@@@@@@@@@@Su  3Hi there! SÀ" Rp+ pƺã{oLˆ$Ôµ'µY´C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ºÆp{ãLoˆ$Ôµ'µY´SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number0£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ c826ccdcfe2945aeb0669569698deae1@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp, Pmxôd 5O¼4”{«“ÅrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ôxmP dO5¼4”{«“ÅrSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number1£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ a25dfb3bc65345bfbb110f89aca1b441@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp- DBOž‡—HŠB;CÛ&ÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜OBD‡žH—ŠB;CÛ&ÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number2£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ 483083f747904824b60d599536786ae1@@@@@@@@@@@@Su  3Hi there! SÀ" Rp. 3 ›…1äF²\ÌŠÓ4zC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜…› 3ä1F²\ÌŠÓ4zSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number3£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ d71dc11cff7c426db020b714b2a3616f@@@@@@@@@@@@Su  3Ho there! SÀ" Rp/ ëcIp–ÔA„yÞëPâ©C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Icë–pAÔ„yÞëPâ©SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number4£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ ba20998dbf164c31b6b353889c222f08@@@@@@@@@@@@Su  3Hey there! SÀ" Rp0 V‚ÜÕ3K@‚m¼uÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ü‚V3Õ@K‚m¼uÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number5£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ 35894c5eb4b84f108867b8243669cc18@@@@@@@@@@@@Su  3Hi there! SÀ" Rp1 m iÅæL€ñpÌÖnC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Åi mLæ€ñpÌÖnSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number6£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ 7a555fd372734b53a7b0faacbb6544af@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp2 t™ÚvN¦JK™Æ·ÏMC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ú™tvN¦JK™Æ·ÏMSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number7£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ 11737e5254f246b1bc8297abedc71e03@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp3 Ó.Ód-íE¾UˆÚH/1øC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ó.Ó-dEí¾UˆÚH/1øSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number8£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ 1c45c1db59f04560b6e373b5b3f48508@@@@@@@@@@@@Su  3Hi there! SÀ" Rp4 ¾I›½üq«N·à ˜æòí“C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜½›I¾qüN«·à ˜æòí“SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number9£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ a3eb3e3b59684f2ba88d337d9225a03a@@@@@@@@@@@@Su  3Ho there! SÀ" Rp5 $µÑ·Ÿ¸N€#ËäLQ`C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ñµ$Ÿ·N¸€#ËäLQ`SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number:£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ c313e4076d294fccb3117906cbccb8a6@@@@@@@@@@@@Su  3Hey there! SÀ" Rp6 †y„¼†4F°áÇa†z=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜„y††¼F4°áÇa†z=SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number;£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ 7b865139ae6548448cb832b4953674cb@@@@@@@@@@@@Su  3Hi there! SÀ" Rp7  â’j±rI¢^\¾ì¸[BC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜’â ±jIr¢^\¾ì¸[BSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number<£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ 0671cc17f07c4328a757560a6b858763@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp8 «Þj DO‚Ú…¦Kœ¿C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jÞ«D O‚Ú…¦Kœ¿SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number=£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 2c2434caad7d47edb11e852802e77742@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp9 ƒ=­¼ÛIŽZt`ÄuC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜­=ƒ¼IÛŽZt`ÄuSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number>£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ bf2dbf4e445f4b70a8fd21940a65e3a6@@@@@@@@@@@@Su  3Hi there! SÀ" Rp: B{°Ì¨B‰®ÔäíëˆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°{BÂÌB¨‰®ÔäíëˆSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number?£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 1af95c6d049240e7b66ef00714af278e@@@@@@@@@@@@Su  3Ho there! SÀ" Rp;  h†ú¯ÓÄB–üîæ¿§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ú†h Ó¯BÄ–üîæ¿§SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number@£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 1005ddc503f84f4aaf702adf6ca4008f@@@@@@@@@@@@Su  3Hey there! SÀ" Rp< Î2—{p~5J€}šðŽ›jC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{—2Î~pJ5€}šðŽ›jSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberA£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 9bb2253398f64adea274b0114dfdc9a8@@@@@@@@@@@@Su  3Hi there! SÀ" Rp= æ=§ƒVL£³í"]4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜=惧LV£³í"]4SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberB£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 602a8df4231a4ba5aa48625a66b8faa8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp> ÂlÎu½Ë¬A‡¯9c2ñîC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜uÎlÂ˽A¬‡¯9c2ñîSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberC£x-opt-locked-untilƒ`f¥„˜SsÀ/ ¡ 2d64836fbe984dee935428c18808bea6@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp? Qàe—†dpJ“4«_S‚¤ÁC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜eA2ÑÖDk»G>‚¤ÁSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberM£x-opt-locked-untilƒ`f¥„æSsÀ/ ¡ 92605924b77c4480b8d69f02601ef993@@@@@@@@@@@@Su  3Hi there! SÀ" RpI ñ‹Ü‰£5F…tîý^'[C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ü‹ñ£‰F5…tîý^'[SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberN£x-opt-locked-untilƒ`f¥„æSsÀ/ ¡ bbb047a607ad467fbd6e34f2462b869d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpJ T|dWÞþI»’0…RA§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Wd|TÞIþ»’0…RA§SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberO£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ ddc11f78ab6a409897b40d06d5e7262b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpK ^¹ ‡ªN‹M¬a#¿³úC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ¹^‡Nª‹M¬a#¿³úSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberP£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ 648de61a7b0d4dcea04b0ed877278e39@@@@@@@@@@@@Su  3Hi there! SÀ" RpL _ª Í­ÛÑC¯´ïZ¡ï;C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Í ª_Û­Cѯ´ïZ¡ï;SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberQ£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ f9adbd21c34946ee8a3984b2e32e211f@@@@@@@@@@@@Su  3Ho there! SÀ" RpM LY}=Ó*†M³(}³&Fá^C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜=}YL*ÓM†³(}³&Fá^SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberR£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ 8339b72a2ac6455abc3370f9c92162ce@@@@@@@@@@@@Su  3Hey there! SÀ" RpN .ÓWŽHÑvC­g ìç3,C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ŽWÓ.ÑHCv­g ìç3,SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberS£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ ce2f274feaec4f70b91d09eed3bddd19@@@@@@@@@@@@Su  3Hi there! SÀ" RpO š>NåÚÁC‚—ª[À¸›/C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜N>šÚåCÁ‚—ª[À¸›/SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberT£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ 653527ab84044d13a427e1baca67f3c0@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpP ¼å.MÏeF¾)•çr:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜M.å¼eÏF¾)•çr:SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ 519abdb61d7f420ba2f36e39bb3db0ef@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpQ Åx9|FRsG™Ï³xÓ¤C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜|9xÅRFGs™Ï³xÓ¤SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberV£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ fb5a0884a8c6441ea51718e0a661aaa0@@@@@@@@@@@@Su  3Hi there! SÀ" RpR r˜ÂÑH,°L¥ª–*xæiC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ñ˜r,HL°¥ª–*xæiSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberW£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ 07f8fb16fddd49c4b3c8f7c1ab22ade4@@@@@@@@@@@@Su  3Ho there! SÀ" RpS e³u­;*ºMŒƒæ9ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜­u³e*;MºŒƒæ9ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberX£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ 650f6d81885e4cdabb4b592e0646d34b@@@@@@@@@@@@Su  3Hey there! SÀ" RpT džI:?KŠï«ìÈâ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜I†Ç:K?Šï«ìÈâ SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberY£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ 75207c55e09f4beaa8c28a706ec232de@@@@@@@@@@@@Su  3Hi there! SÀ" RpU ôí® ìC­>'xbT C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜íô ®Cì­>'xbT SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberZ£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ c47b6a35cc134e658f12aa37d88df884@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpV –¼‚ªÈÐB’lß_Ê~C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚¼–ȪBÐ’lß_Ê~SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number[£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ ebafb73a5f7e4ac4a1d51b30d17838c1@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpW ñ3ÀùÖËM²Ä} ¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜À3ñÖùM˲Ä} ¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number\£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ dafd5e6d798445819eed719630728f49@@@@@@@@@@@@Su  3Hi there! SÀ" RpX mÜmYYäD…Ã9×à¾?C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜YmÜmYDä…Ã9×à¾?SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number]£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ 9a476888f07c435eada3ab1fbc28f785@@@@@@@@@@@@Su  3Ho there! SÀ" RpY 0S³h%iH¥0¶Y´´ç…C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h³S0i%H¥0¶Y´´ç…SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number^£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ fb7ebd9baa234a43a3e57fc21ed19bf6@@@@@@@@@@@@Su  3Hey there! SÀ" RpZ ²ÂÞ©q@ºh%@trC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜²©Þ@qºh%@trSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number_£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ c56111cdf1914729b9b4d1d40a91100e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp[ ØÊ>"møC°îíǯmbC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜">ÊØmCø°îíǯmbSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number`£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ 0482790c38bf4833b12b2964cefb8cd4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp\ H‚Îà0¾›H·â©”g j¡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜à΂H¾0H›·â©”g j¡SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbera£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ 2b4dbc3d4d0b4127a844cdb834072149@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp] ï@Ì=Ì»AŸˆv•}šAC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜=Ì@ïÌA»Ÿˆv•}šASrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberb£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ 91b6a4d551314d358d9f1a2fc9ead8cd@@@@@@@@@@@@Su  3Hi there! SÀ" Rp^ u a-¤:ñH¼‚yƒ±/7QC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜-a u:¤Hñ¼‚yƒ±/7QSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberc£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ 5bb798a0f56f407fb32f4aced9ab7b6b@@@@@@@@@@@@Su  3Ho there! SÀ" Rp_ @þA¾> H²âpʱÚ4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾Aþ@>H ²âpʱÚ4SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberd£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ 7e4da77629734338b421821736db8ccd@@@@@@@@@@@@Su  3Hey there! SÀ" Rp` ÿÝXIÌÐÅIŽe+™ÞùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜IXÝÿÐÌIÅŽe+™ÞùSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbere£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ ede20d5ad1e347599325619172beac8f@@@@@@@@@@@@Su  3Hi there! SÀ" Rpa Þ±l@‰è}M‹Ëòïkt@BC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@l±Þè‰M}‹Ëòïkt@BSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberf£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ a80a2c36a07d458e8bdfc5018418cc24@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpb Öÿ˜ÃíSO Í1H}C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜˜ÿÖíÃOS Í1H}SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberg£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ 4492376ecb1648efb9ee4b6893453099@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpc ¬Ìžú!ÔIµ©€“{˜²ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜žÌ¬!úIÔµ©€“{˜²ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberh£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ 3e1c68767862407e9a9e9d3870aa12f5@@@@@@@@@@@@Su  3Hi there! SÀ" Rpd Ã}4€îÀØE©D?Lš¶C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜€4}ÃÀîEØ©D?Lš¶SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberi£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ 68f57d9977eb4f8f8d65e0abea2fcaa6@@@@@@@@@@@@Su  3Ho there! SÀ" Rpe 7<—h¯»ÌH‹õ…äJëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h—<7»¯HÌ‹õ…äJëSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberj£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ c9aa539506a641d592f0f1692a6c4ac0@@@@@@@@@@@@Su  3Hey there! SÀ" Rpf MÙcÀƒþ§I¯Oò`˜Ø1C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÀcÙMþƒI§¯Oò`˜Ø1SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberk£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ d9c2ab8cf4f64518a275db31095e8c42@@@@@@@@@@@@Su  3Hi there! SÀ" Rpg û¬Ëÿ8:Lšïû—xC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ë¬û8ÿL:šïû—xSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberl£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ 5fe0bd2523664c5f87390a60a16e5080@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rph -”tCnÿNƒD õr-C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ct”-ÿnNƒD õr-SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberm£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ d577786be88e41c5bdb5ec6421544710@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpi  ¤¦ôþKG—[–…ß­ÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¦¤ þôGK—[–…ß­ÔSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbern£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ b893ca6baec74cafbf9d3889e8aa2509@@@@@@@@@@@@Su  3Hi there! SÀ" Rpj NCš8BüÙJ±?b±`yÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜8šCNüBJÙ±?b±`yÕSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbero£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ 426e348bd0b442b6aaf28349ec32488f@@@@@@@@@@@@Su  3Ho there! SÀ" Rpk YûÖwüÆêH¯pk¨›‰C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜wÖûYÆüHê¯pk¨›‰SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberp£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ aec5bbec59a64cabb871323b79fc912c@@@@@@@@@@@@Su  3Hey there! SÀ" Rpl ­a›cݸMˆ¹IÍ×lªC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜›a­ÝcM¸ˆ¹IÍ×lªSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberq£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ 6cf1d22a20cb44718704f632b663f760@@@@@@@@@@@@Su  3Hi there! SÀ" Rpm ÇB£>*7)K½ÌwlYC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>£BÇ7*K)½ÌwlYSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberr£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ 6d9988e933b34965bb6d4247fa5ac1c2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpn ¼0 ÄE|»Kž—¿è\¾0C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ä 0¼|EK»ž—¿è\¾0SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbers£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ cae36d3818a94ca0a12e5b9e4a9a1e73@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpo ä^•‹:ÙàN¨­Qà.ODÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‹•^äÙ:NਭQà.ODÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbert£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ a08aafd79c2745608b67419d0f9a842e@@@@@@@@@@@@Su  3Hi there! SÀ" Rpp ·èû ‘ñNm<uDêC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ûè·‘ Nñm<uDêSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberu£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ 6cc28418df78436faf166b756a90141c@@@@@@@@@@@@Su  3Ho there! SÀ" Rpq Ó¯¬sœ Mƒ›,¿9gÀ†C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¬¯ÓœsM ƒ›,¿9gÀ†SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberv£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ f1d50cdb4cdf46479dc40a37b95a1ad6@@@@@@@@@@@@Su  3Hey there! SÀ" Rpr …Ð?0EbkO¼âoNH©C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜0?Ð…bEOk¼âoNH©SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberw£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ edfea29f7c354106a353e2c20f55c4ca@@@@@@@@@@@@Su  3Hi there! SÀ" Rps ÏcÎ××1CƒdH²ÊÏÂC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜×ÎcÏ×C1ƒdH²ÊÏÂSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberx£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ 31d831e3d1814f03be9903e7dbe8f86c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpt þÄOh>‹ìIšÁ¼Ø@>åC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hOÄþ‹>IìšÁ¼Ø@>åSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbery£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 486b9a77939c46f4bcf89994c5bd520e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpu ”æ‹MF..M©ÆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”æM‹F..M©ÆSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberz£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 0969feee786c43aca37b2f0ec735d761@@@@@@@@@@@@Su  3Hi there! SÀ" Rpv ƒå:êú¤ E‰ÛŒË$qaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ê:僤úE ‰ÛŒË$qaSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number{£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 711e988fc2504fa5a52159c33f591804@@@@@@@@@@@@Su  3Ho there! SÀ" Rpw Ì*y‰•ŒUGˆî“SÖƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰y*ÌŒ•GUˆî“SÖƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number|£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ a693da10927c42478b528f385ccfd083@@@@@@@@@@@@Su  3Hey there! SÀ" Rpx Ñ„^!cCÄJºmG^ÃŽQ\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜!^„ÑCcJĺmG^ÃŽQ\SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number}£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 7af0c7c0d9ff48a1b7c95523cd35f4f0@@@@@@@@@@@@Su  3Hi there! SÀ" Rpy ÈkO1øK·o?Ž5vy‰C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜1OkÈKø·o?Ž5vy‰SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number~£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 680826af446243f89f9841b77509b6cb@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpz ƹ  5¦OŠzvC`6hC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ¹Æ5 O¦ŠzvC`6hSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ 57cf557907214318883c9d73dd09598b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp{ ¤ÈÚ߸§»IžôPQÍÔy(C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ßÚȤ§¸I»žôPQÍÔy(SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number€£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ 136ebcc72ced4412b4f84d2071498789@@@@@@@@@@@@Su  3Hi there! SÀ" Rp| ±žðU+FŠá†ÿ¯ÐCC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ðž±UF+Šá†ÿ¯ÐCSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ 6eaea7033c214f80a651e3b7defc4f83@@@@@@@@@@@@Su  3Ho there! SÀ" Rp} ÷8·ž>¬I¸ö¤¶§ÕgøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ž·8÷>I¬¸ö¤¶§ÕgøSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‚£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ b5cfe961723849318a07efdf536ec915@@@@@@@@@@@@Su  3Hey there! SÀ" Rp~ /p[W? K³ÄzÏ$^·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜[p/?WK ³ÄzÏ$^·SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberƒ£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ aed7595d2ce04c6e84c9f4b54154a1f7@@@@@@@@@@@@Su  3Hi there! SÀ" Rp #V˜„)O€8O2á÷C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜V#„˜O)€8O2á÷SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number„£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ adc378acd37b4865b4043cccb49afcbf@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp€ FÓ}„ULLƒü¬­79C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜„}ÓFULLƒü¬­79SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number…£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ bfa9c37793954385bf685eb3e62e8dd1@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ÛÛ4\õLº¤­9–öºC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4ÛÛ\Lõº¤­9–öºSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number†£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ 69932e0b86b745799a607d88d3af732f@@@@@@@@@@@@Su  3Hi there! SÀ" Rp‚ „âJ—•ÝA¹98ž~~²µC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Jâ„•—Aݹ98ž~~²µSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‡£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ 39413c18102743658efe4351725c536d@@@@@@@@@@@@Su  3Ho there! SÀ" Rpƒ õ!N[;´G˜´à3üå¶,C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜N!õ;[G´˜´à3üå¶,SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberˆ£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ 4211d7eac992432c8d659e8dab039161@@@@@@@@@@@@Su  3Hey there! SÀ" Rp„ Ã4[Ïá+L¤c —OåR³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜[4ÃáÏL+¤c —OåR³SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‰£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ e0ac40ff8b764ca28024d8b6f4b3a39f@@@@@@@@@@@@Su  3Hi there! SÀ" Rp… Á×ÍÂØ+E¿÷5&ë1zC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÂÍ×ÁØE+¿÷5&ë1zSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberŠ£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ 18d645d90b7e4527857c0106a25a009d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp† Ê0@KÃîþF©I TÓ€Q|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K@0ÊîÃFþ©I TÓ€Q|SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‹£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ 148c1ceb97b346d094f7ed6ff416a11a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp‡ ººÞð$©B…›m)`ä>“C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ðÞºº©$B…›m)`ä>“SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberŒ£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ 21e60487af14473cbd6ec54459cbbef4@@@@@@@@@@@@Su  3Hi there! SÀ" Rpˆ ØrcÂ}×Fˆ”`7r-ÖÇC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜crØ}ÂF׈”`7r-ÖÇSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ f23f39da000f46a0a8cb69abb87bc729@@@@@@@@@@@@Su  3Ho there! SÀ" Rp‰ ̽<Ù먩EºdòSÈZ˜LC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ù<½Ì¨ëE©ºdòSÈZ˜LSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberŽ£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ 06dbd3d95e8246b0a306e66b1ff07d25@@@@@@@@@@@@Su  3Hey there! SÀ" RpŠ '„—\¼D§GƒÞ#Z0fëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜\—„'D¼G§ƒÞ#Z0fëSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ 90bb8fe5e8664fa5b0c171ecf2385eed@@@@@@@@@@@@Su  3Hi there! SÀ" Rp‹ óØ&à?¿I‹pÀ˜vˆæC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜à&Øó?I¿‹pÀ˜vˆæSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ d01da4c17d374fad82a7c093bdb0188b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpŒ ª~ó‚Æ-”BŸl_PK‡¦~C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚ó~ª-ÆB”Ÿl_PK‡¦~SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‘£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ 912bbebe64334dd59e52ee9fef3310ab@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp œV”W§Ðà@”b¯8meRÆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜W”VœÐ§@à”b¯8meRÆSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number’£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ ef0f9d5850ff41ca850f1138a7c438be@@@@@@@@@@@@Su  3Hi there! SÀ" RpŽ æIxâÖP@œyUâÎÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜âxIæÖ@PœyUâÎÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number“£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ a85b88afa5584862a01e01675cc04c5e@@@@@@@@@@@@Su  3Ho there! SÀ" Rp l‹×]emC´î0ò’  HC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜×‹le]Cm´î0ò’  HSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number”£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ 3986c87884d04541bc63d8028dc3c13d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp b`(ÏMÊÜN™¨9d£?ÎC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ï(`bÊMNÜ™¨9d£?ÎSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number•£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ dcdf15688112471c88dc10f29aeb47b4@@@@@@@@@@@@Su  3Hi there! SÀ" Rp‘ ?–ðÕÙ+$OŒäD°ëxëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Õð–?+ÙO$ŒäD°ëxëSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number–£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ e028991f81dd4be2a8a72990e2c76bc2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp’ ñOaú™D„æt+|-q–C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úaOñ™D„æt+|-q–SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number—£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 30edcf484c174e88bb8ea2ae3dd2e08b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp“ –óþhVH'”±™zuTC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þó–hHV'”±™zuTSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number˜£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 50fd3fb4123e4dfd8b5e097a22d622c4@@@@@@@@@@@@Su  3Hi there! SÀ" Rp” »ð‡cá~B³Þ/¹‰"hìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‡ð»ácB~³Þ/¹‰"hìSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number™£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ a23bce9429f046399344be85403db60b@@@@@@@@@@@@Su  3Ho there! SÀ" Rp• MŸ¢ûv×›L¼ÑoUðšC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜û¢ŸM×vL›¼ÑoUðšSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberš£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 619549b376c3477a894023b18f3fd64e@@@@@@@@@@@@Su  3Hey there! SÀ" Rp– ðÅ»± ð½D¢ÿÙxy~.)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜±»Åðð D½¢ÿÙxy~.)SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number›£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 653c7dfa638c41eea352b9ce9511b159@@@@@@@@@@@@Su  3Hi there! SÀ" Rp— „¥{…¤H¦¼ßÒFÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{¥„…H¤¦¼ßÒFÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberœ£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 637c73f14bc0439c82068cea85f93d7a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp˜ Õ€9én-ûL™Œp¾²7šÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜é9€Õ-nLû™Œp¾²7šÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ c6b09cdbf84e4cdda2c12398bf2066c6@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp™ [xã>‚ÚbB®=øW鿳tC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>ãx[Ú‚Bb®=øW鿳tSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberž£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 31f48b62112e46719eca4ec904841e0b@@@@@@@@@@@@Su  3Hi there! SÀ" Rpš (æ7£rMC°Æ‚ –úC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜7æ(r£CM°Æ‚ –úSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberŸ£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 38045f42127c442c9d7291d059dca2b4@@@@@@@@@@@@Su  3Ho there! SÀ" Rp› pCßüQÖJH³ØãÄPáC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜üßCpÖQHJ³ØãÄPáSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number £x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 8893b6436fd74a5699a831de8c487dda@@@@@@@@@@@@Su  3Hey there! SÀ" Rpœ ¾BzfèN„ î[®ì=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜B¾fzNè„ î[®ì=SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¡£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 8bcea1a979f646f7aeba7c90cdbbc2c6@@@@@@@@@@@@Su  3Hi there! SÀ" Rp '"Á‚˜¼F˜[ß©,õaCC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Á"'˜‚F¼˜[ß©,õaCSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¢£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 1927b14318714a1b9fa7d10ca8a0b887@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpž R ÉßNˆjÓz‚C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜É RN߈jÓz‚SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number££x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 4b92b23ff9ec4d6f891e3f3c24474a6f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpŸ @«ñÿ0ïE˜×7•3Ù#"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿñ«@0Eï˜×7•3Ù#"SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¤£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 631ec385bb0e49f4a3c44c3519b33e56@@@@@@@@@@@@Su  3Hi there! SÀ" Rp  >*\ÃôgAK†›OåââgôKA†›Oåââ<SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¥£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 85a8b774051d44aabeb4569da3f7edd1@@@@@@@@@@@@Su  3Ho there! SÀ" Rp¡ Ý"n—ðzËC¢Ÿ›QϺÃQC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜—n"ÝzðCË¢Ÿ›QϺÃQSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¦£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 2259ae44561b44efb84d622f9043d438@@@@@@@@@@@@Su  3Hey there! SÀ" Rp¢ Ê}ôjåD‡*ôHLRHC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jô}ÊDå‡*ôHLRHSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number§£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 9ce5d4c86fdf4393b91a62cc07825c0c@@@@@@@@@@@@Su  3Hi there! SÀ" Rp£ Í/ˆÐ°ßHœa¼ Õ€LC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ðˆ/Íß°Hœa¼ Õ€LSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¨£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 30784821025d421b99c8e97b8a679553@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¤ ±zd¾‰ŒJ¦Lõ„Xo]°C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾dz±‰JŒ¦Lõ„Xo]°SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number©£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ 67b68a0da97b4f5d90e1b26ce46c6c5d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¥ ‚ƒqýæIF‹Ç[NV4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ýqƒ‚æFI‹Ç[NV4SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberª£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ f5f0d0d0c18a4b5892b2af14a4453e1f@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¦ VP0âfquCƒ†-Ù(0C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜â0PVqfCuƒ†-Ù(0SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number«£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ f69f253ce17e45a4a4ff31c07d1dba0e@@@@@@@@@@@@Su  3Ho there! SÀ" Rp§ Yíc4ÖÐrB½!•Yüo¢VC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4cíYÐÖBr½!•Yüo¢VSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¬£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ 2b7666a039744898a6e4bba808e8b734@@@@@@@@@@@@Su  3Hey there! SÀ" Rp¨ ØpýüŒF§ŸVÍpÒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜üýpØFŒ§ŸVÍpÒSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number­£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ 0ef38c1f0dc24359be8732f10f5d0d9b@@@@@@@@@@@@Su  3Hi there! SÀ" Rp© P%x]&b`Mž;°Q]×»[C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜]x%Pb&M`ž;°Q]×»[SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number®£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ 26e31930d6b145c9b50ef24070ae2c2b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpª ñ/ÊX¿Ü¬HŒáiŸÇ–C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜XÊ/ñÜ¿H¬ŒáiŸÇ–SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¯£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ 32baf8efe91e4bc29ee5624c417a156d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp« ¨€:^^î¼F… ƒâ`ÙðC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^:€¨î^F¼… ƒâ`ÙðSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number°£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ d94a25f8dee4474f99f116154a2cd125@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¬ ZA[¿’'J‹®1µeðû>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¿[AZ’J'‹®1µeðû>SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number±£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ 0abb27c1131c416e83def98954d97c79@@@@@@@@@@@@Su  3Ho there! SÀ" Rp­ ˆx>ý,½C¦´ ¨Öì°úC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ý>xˆ,C½¦´ ¨Öì°úSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number²£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ 8c441228f5fe4005bf5a843d90b76c2a@@@@@@@@@@@@Su  3Hey there! SÀ" Rp® “E ¤ G3Fi‘ÀíDå‡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤ E“G F3i‘ÀíDå‡SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number³£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ c66eaf951cf84a6b80bc83133e8b925d@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¯ ð¦D3&:eNš0øI1Z‚C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜3D¦ð:&Neš0øI1Z‚SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number´£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ 9cd09b92ecb642fb834e0f1520f542d1@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp° ðY¦ZrsNœ¢<¤ýoùÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¦YðrZNsœ¢<¤ýoùÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberµ£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ 19afa46b9c9a4ff48e3b6188c2369751@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp±  óåüÇÌF©~xÿ²uLC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åó ÇüFÌ©~xÿ²uLSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¶£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ 4c7f79e936c74e319912e925bdc4ac2e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp² v[A2÷J‘]!kª†ÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜A[v2J÷‘]!kª†ÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number·£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ f4ab574d1bac428a8bba691a49bb5c90@@@@@@@@@@@@Su  3Ho there! SÀ" Rp³ Ê0@`þ™.Dš.tÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜`@0Ê™þD.š.tÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¸£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ d67fb17a7a6b435a830d8c7cdd7e371b@@@@@@@@@@@@Su  3Hey there! SÀ" Rp´ 8MòˆH± ‘>å)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜M8ˆòH± ‘>å)SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¹£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ 5189e604ff2b4fe8bd691a6edbcdf631@@@@@@@@@@@@Su  3Hi there! SÀ" Rpµ A\5 à¹G²Ì‹RrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5\Aà G¹²Ì‹RrSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberº£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ 787c735ed44b47ba93b65cf28f052ccd@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¶ Œtx8ÞýB¤Šs™ñ¶ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜8xtŒýÞB¤Šs™ñ¶ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number»£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ 53645a6c3065425e9cf7e282f9fc9634@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp·  Éÿ±O¡ ºUr1ˆ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿÉ O±¡ ºUr1ˆ SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¼£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ 25aa4e15f8d24a5d92498d2f4ec513c3@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¸ ¡šã¥LJ¶÷+ÿó¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãš¡L¥J¶÷+ÿó¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number½£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ acfa03ecfeec464cb3c39e2106c6a0fb@@@@@@@@@@@@Su  3Ho there! SÀ" Rp¹ » Æ„žgL£ |È‘©dC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Æ »ž„Lg£ |È‘©dSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¾£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ 7fc686d892a549ac99138901391ab851@@@@@@@@@@@@Su  3Hey there! SÀ" Rpº Ù'‘K0xÜJŒ÷”g°k{C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K‘'Ùx0JÜŒ÷”g°k{SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¿£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ 2211601696ee43b7ba46d44ef2791ab6@@@@@@@@@@@@Su  3Hi there! SÀ" Rp» Ë£!IÔºC­E3 úk²·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜!£ËÔICº­E3 úk²·SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÀ£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ c24f9c84dfac45dfbfa7d75f497d517a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¼ ×ç¾PEDÂ=‘‘ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾ç×PDEÂ=‘‘ SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÁ£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 6e0a51c71312468bbbd6a5a8ed86d62e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp½ åüCAáCˆÒ yxlC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ACüåCáˆÒ yxlSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 112333264d3a4102b19a6b1ca6fbcd3b@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¾ UÒº‰ÛC­¡÷AWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰ºÒUÛC­¡÷AWSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberãx-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 8173360d7e594832aa4cb1fb7c20dedc@@@@@@@@@@@@Su  3Ho there! SÀ" Rp¿ Sé߈o£OŠ@Œ¹BÕ¨|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ˆßéSoO£Š@Œ¹BÕ¨|SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÄ£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 114d1167ce3f420c9e2f26174d2db230@@@@@@@@@@@@Su  3Hey there! SÀ" RpÀ š³~üI+B›¿rìaÒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ü~³šIB+›¿rìaÒSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÅ£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 434eddca7b8342b9b54bb9bc41283095@@@@@@@@@@@@Su  3Hi there! SÀ" RpÁ uëÎvðE¨B˦r†;C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÎëuvEð¨B˦r†;SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÆ£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 37941aefbb0d4e289d610d722f6471e8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ÛPzúãi@¬éž‡ºÙ9ŒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úzPÛã@i¬éž‡ºÙ9ŒSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÇ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ 7ff35f4f34f04777861116499a408cdb@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpà" ©*¤†GŽÉKlŸ¨C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜© "¤*G†ŽÉKlŸ¨SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÈ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ 3b19c8f8e747458fa1ec3f697d842945@@@@@@@@@@@@Su  3Hi there! SÀ" RpÄ ºØjÅ;o€M‡ødãÝ—C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Åjغo;M€‡ødãÝ—SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÉ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ e2bfc1f634214a029f8aba5ac6645153@@@@@@@@@@@@Su  3Ho there! SÀ" RpÅ ¯ì ·cSO²Zá¥>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ì¯c·OS²Zá¥>SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÊ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ e908ef6c4376446f82a6446e81701321@@@@@@@@@@@@Su  3Hey there! SÀ" RpÆ  .ƒöˆÂO–ÿIvý+©C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ƒ. ˆöO–ÿIvý+©SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberË£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ c05fde47fa2747f0a56882cabf9e384a@@@@@@@@@@@@Su  3Hi there! SÀ" RpÇ èšj*suC¹øtÂ÷ª½UC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*jšèsCu¹øtÂ÷ª½USrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÌ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ e43145ae5de74b029c05e4089b085e3d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÈ "TÖÛ-ïnM=šÁÓ”C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÛÖT"ï-Mn=šÁÓ”SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÍ£x-opt-locked-untilƒ`f¥ŒxSsÀ/ ¡ 8e58134ca46047d49dfaefe4b46c3a82@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÉ )·»G°~äK¢¬v±O|gC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜G»·)~°K䢬v±O|gSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberΣx-opt-locked-untilƒ`f¥ŒxSsÀ/ ¡ cf4b2bad521341e783e03118778c946e@@@@@@@@@@@@Su  3Hi there! SÀ" RpÊ çÖ¬í{N’SóºIã% C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¬ÖçíN{’SóºIã% SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÏ£x-opt-locked-untilƒ`f¥ŒxSsÀ/ ¡ a5ddaee4d0de4fb582258e6cccc829af@@@@@@@@@@@@Su  3Ho there! SÀ" RpË Š+) B´·©ëÖóC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+Š )B´·©ëÖóSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberУx-opt-locked-untilƒ`f¥ŒxSsÀ/ ¡ 86901e68368543c59ae709c82877ec2f@@@@@@@@@@@@Su  3Hey there! SÀ" RpÌ ÌÞ"¿<¶õG‘d7*YÒÎ.C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¿"Þ̶DŽVýÿ8ÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:Îë—KD>ŽVýÿ8ÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number×£x-opt-locked-untilƒ`f¥ŒÆSsÀ/ ¡ 5faa1af76e394104bd5da79b0ef870cf@@@@@@@@@@@@Su  3Hi there! SÀ" RpÓ kTå Ï2F¥Ó|ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ åTkÏF2¥Ó|ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberØ£x-opt-locked-untilƒ`f¥ŒÆSsÀ/ ¡ d0ee55e08dc74998969f3714a68927dd@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÔ e^_þí%èDƒlûä¿9tC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þ_^e%íDèƒlûä¿9tSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÙ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ f714c31c7aba4896ad2349d8438c50dc@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÕ {¸ºäg|E·}¬åV&WÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜º¸{gäE|·}¬åV&WÞSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÚ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ d6c759f332d3400c82188804f8e5342e@@@@@@@@@@@@Su  3Hi there! SÀ" RpÖ ä«°y ÛµK¾¹TPQ.C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜y°«äÛ Kµ¾¹TPQ.SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÛ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 0ba4ac26561948ebbfdb2563704374c1@@@@@@@@@@@@Su  3Ho there! SÀ" Rp× lÕ2qþºÊD³E"G3¹LC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜q2ÕlºþDʳE"G3¹LSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÜ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 75e0d1c552cd4d6da23f92c3d712b94b@@@@@@@@@@@@Su  3Hey there! SÀ" RpØ 2Ord—øE‹ i‡ñLKÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜rO2—dEø‹ i‡ñLKÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÝ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 91bbd851652d42088ff7c7eb4f32879a@@@@@@@@@@@@Su  3Hi there! SÀ" RpÙ ¯5‡€JB O±Í‘Ñt›fC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜€‡5¯BJO ±Í‘Ñt›fSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÞ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 9aee763ce29040f19a222a9c0f19892a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÚ  $YÙì}Aš¹î÷ϪC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Y$ ìÙA}š¹î÷ϪSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberߣx-opt-locked-untilƒ`f¥rSsÀ/ ¡ 36e8111bd0554634a345071a49be9236@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÛ T²÷Þ]L«TgÊ{à=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜÷²TÞL]«TgÊ{à=SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberà£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ 6451dcc418404ed28a2bb7c57ecf350d@@@@@@@@@@@@Su  3Hi there! SÀ" RpÜ ‡DÉ‚¶‚eL¡`:ÁAÑ8•C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚ÉD‡‚¶Le¡`:ÁAÑ8•SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberá£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ a83ca419440a4a26bb2629e3c47a1817@@@@@@@@@@@@Su  3Ho there! SÀ" RpÝ ò&êRͺIŸÒ?%xC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Rê&òÍIºŸÒ?%xSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberâ£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ 91d0d9bb627143ec984eda4c6a1cd97f@@@@@@@@@@@@Su  3Hey there! SÀ" RpÞ › Ddpƒ5MÔR˜­:£yC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜dD ›ƒpM5ÔR˜­:£ySrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberã£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ 9543e09285ee40a6b069f5f238d570ff@@@@@@@@@@@@Su  3Hi there! SÀ" Rpß „¿ÒL[Oš%ˆCêøq}C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ò¿„[LOš%ˆCêøq}SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberä£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ b386990d8448445f908b6667c77866cf@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpà r›Íñߨ¦Aä¿—þ¶äØC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ñÍ›r¨ßA¦ä¿—þ¶äØSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberå£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ dbf16ba9d2c048ba8d1e5213e970da06@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpá Þêæó­3K³Ft˜“=»uC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜óæêÞ­K3³Ft˜“=»uSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberæ£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ c2f7b8b42387451f974c4fdbccaa321b@@@@@@@@@@@@Su  3Hi there! SÀ" Rpâ z|ôÑîNˆu‘g™üÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ô|zÑNîˆu‘g™üÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberç£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ f74767b1407d42aba1b34c1409fec9ae@@@@@@@@@@@@Su  3Ho there! SÀ" Rpã 6m¬Ì ut@˜ê<"DcP:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ì¬m6u @t˜ê<"DcP:SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberè£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ 33181aa960a54a7fb91fb08dd2d9fe8e@@@@@@@@@@@@Su  3Hey there! SÀ" Rpä ~†&Gz7QDˆ ^¡Ôš2%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜G&†~7zDQˆ ^¡Ôš2%SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberé£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ 5ee5b1c27443453a89d34566478ec4e9@@@@@@@@@@@@Su  3Hi there! SÀ" Rpå x¤ÓçèøaEƒ¦—Øe…þC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜çÓ¤xøèEaƒ¦—Øe…þSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberê£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ d85b52a03640426881390f396a8c08d9@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpæ ýÀû È OŸ³|±¼6¸DC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ûÀýÈO Ÿ³|±¼6¸DSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberë£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ 3872c42ee15244d3b7277a0905311822@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpç  É»´T/I»µQ÷¨¯<-C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜»É T´I/»µQ÷¨¯<-SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberì£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ 4701cf5d70ed4dfc96b48266bf413ae0@@@@@@@@@@@@Su  3Hi there! SÀ" Rpè Ö¶ü $¢YO“e¹BŠ$'C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ü¶Ö¢$OY“e¹BŠ$'SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberí£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ f535c210ac0649d89437308ce6666dc1@@@@@@@@@@@@Su  3Ho there! SÀ" Rpé ^¿ÓåUl@Ÿ\æ>Î*pC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ó¿^Uå@lŸ\æ>Î*pSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberî£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ aacebdcbbbe04974907d8ad9724db662@@@@@@@@@@@@Su  3Hey there! SÀ" Rpê äÙV›¨HAˆÔ‰‚óa,C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜VÙ䨛AHˆÔ‰‚óa,SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberï£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ 267a5075eb894056b586b3bb043912cb@@@@@@@@@@@@Su  3Hi there! SÀ" Rpë ÔUìÊ¥«A“!™zåC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ìUÔ¥ÊA«“!™zåSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberð£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ 043bad9c3fb4408d8273254b008bf440@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpì 7–gE~Æ[@–`¨ú…u‰%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Eg–7Æ~@[–`¨ú…u‰%SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberñ£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ e5f6c3a3befa4bd1b8c09657f96d24c1@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpí (õg‚Ù!F”çFÕùæÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜gõ(Ù‚F!”çFÕùæÕSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberò£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ a16979b0c7974d1e8722e7a2ac7327ba@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpî ðÕ ³ê©F¯·…s 2<þC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³ ÕðêF©¯·…s 2<þSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberó£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ 4ddc94209d2a48cd9d6fd9536b651a33@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpï ªõ!•ÂéA»¤Ë›Ç¦’C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜!õªÂ•A黤˛Ǧ’SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberô£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ 42e45d2ab986484b901217ddac1b5a9f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpð P&hŽÙC’È Î¬Ð(C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h&PŽCÙ’È Î¬Ð(SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberõ£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ 978d42eb59bf4033812830d4a39b6f22@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpñ ãj–¥¾nC†W3ý¹tûxC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜–jã¾¥Cn†W3ý¹tûxSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberö£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ 82fba79dd5bf4b249dd5dc9d79462dae@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpò G§¼£ìDF‡6݃¸{›@C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼§Gì£FD‡6݃¸{›@SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number÷£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 396da32c3a8947b79c8567daccf381c7@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpó ÓµDRË,F@Ž|I ïÇ.C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜RDµÓ,Ë@FŽ|I ïÇ.SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberø£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 9b01f868100645c4902e8fd5a0a6ca06@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpô ™g5g'ÓBª7±ˆ9œ«}C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5g™'gBÓª7±ˆ9œ«}SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberù£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 137699977b1741eaa90c11444a53b3ed@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpõ aŸã:>GDžJ«ƒ¬àùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:ãŸaG>DžJ«ƒ¬àùSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberú£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 4d82454b1c48436a9e262c89fea04ba7@@@@@@@@@@@@Su  3Hey there! SÀ" Rpö Q2À·mãL¦v_%Ýè=™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜À2Qm·Lã¦v_%Ýè=™SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberû£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 6dfa3af2e01740db83a1ea39a145a4f6@@@@@@@@@@@@Su  3Hi there! SÀ" Rp÷ ô·ÄÇFnC̯¸ÑÇúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ä·ôFÇCn̯¸ÑÇúSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberü£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 599c4a5aa7b24994ba89e2c9b08da0c7@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpø Ò÷ò*ŒŒE«;Ëñx05=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ò÷ÒŒ*EŒ«;Ëñx05=SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberý£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ c098c3ec9c12492f849ba7ee7aab3fb3@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpù ZÎ>ÆBž<‰ÀF{µ>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>ÎZÆBž<‰ÀF{µ>SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberþ£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ 4fd8bd1220c54d7e9230ac8d8d4d8aa2@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpú á€*÷¶K/)8öC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜€á÷*K¶/)8öSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberÿ£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ ea04628be1704c61964bb18d726ea2b7@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpû kVíVþE•âOüŒõOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜íVkVEþ•âOüŒõOSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ a608d9eab4ce48339bf3c4dbe8294aa7@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpü  dî†;)N™7 CJ¯!ßC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜îd ;†N)™7 CJ¯!ßSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ 0d0cb6fe5b2a4b44bd52a74f4c5833ec@@@@@@@@@@@@Su  3Hi there! SÀ" Rpý }i·(tèFŒK;£ZLðôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜·i}t(FèŒK;£ZLðôSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ 5627c91b596148138186f4e9f3f4a135@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpþ 4üÝš;M„OøËŸ+ AC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜šÝü4;M„OøËŸ+ ASrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ 3268fe13af0948a8ba53ecf593426e39@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpÿ #Ià%YïH»ä†u4ÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜àI#Y%Hï»ä†u4ÝSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ e452d477fc4b476083f49abab999aab4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp a° KE™ lQçÅÒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ °aKE™ lQçÅÒSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ d0c98453c3ca40b1bec6f8a2922d68c9@@@@@@@@@@@@Su  3Ho there! SÀ" Rp ?¥ãÅ[A³,WÛ˜lC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ã¥?[ÅA³,WÛ˜lSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ 2fb1ea3796a8484c8769efbd9a2848de@@@@@@@@@@@@Su  3Hey there! SÀ" Rp Íšö±q¥‹Mœ_ƒÄƒÅªÖC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜±öšÍ¥qM‹œ_ƒÄƒÅªÖSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ 35149ed8b0c448b09d6cb3e415451b65@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ¨设ÿ@D­»—`”@­C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®è¨ÿ¾D@­»—`”@­SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ 6465f8ad488a495490021a556063e111@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp füI€”ÅL˜©6vâ†j¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Iüf”€LŘ©6vâ†j¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ 38822eadef534447824d52f1df266d1a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp r«hЯAžÒݳÿU*jC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h«rÐA¯žÒݳÿU*jSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ e0d684eca51a4087a9977b81825a52e8@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp "ìr¯@#N‚Ý›Â>¿ÍÎC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜rì"@¯N#‚Ý›Â>¿ÍÎSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ 1ac84f73229f4680aab93e18fc6d877f@@@@@@@@@@@@Su  3Ho there! SÀ" Rp Ò?.Nª¥¿‚p±C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼¦î?ÒN.ª¥¿‚p±SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ abb1dfa8e0314b96a085f771719abd72@@@@@@@@@@@@Su  3Hey there! SÀ" Rp +µ nßÁªN¸‰_é!?“œC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜n µ+ÁßNª¸‰_é!?“œSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ 3e70a12d3ef142ab843869dd22b5ad2d@@@@@@@@@@@@Su  3Hi there! SÀ" Rp  wÓ‹4Í N¦|ö:NC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‹ÓwÍ4N ¦|ö:NSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥GSsÀ/ ¡ 1a55ccdb37324ee8957398fbb4394784@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  Lçá`Á[.M‡ùI°9·>‰C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜`áçL[ÁM.‡ùI°9·>‰SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ eba5cdc452c14ce7962baf283535de67@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp  ~íW4áøEž‡šö¦Ù¡?C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Wí~á4Eøž‡šö¦Ù¡?SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 59175d6c221d4f5d9d60933201ec32c8@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp  ä¥;?^­DŠ’kuR_z\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜?;¥ä­^DŠ’kuR_z\SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 462a7808b1524491818a1cba727e5456@@@@@@@@@@@@Su  3Ho there! SÀ" Rp  å´Ñ`ްG°4ž@–Ú,C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ñ´åŽ`G°°4ž@–Ú,SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ b94470eda6c5455fb3acf71935ece29f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ㈑¸hIYS¥ ™òC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ˆã¸‘IhYS¥ ™òSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ cc31aeb4f2a544eeaeac2223b749fb74@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ÚnjfyÚTJ‚EŽ@s›ÓC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜fjnÚÚyJT‚EŽ@s›ÓSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 81d8460421774164ac95238b29713c0f@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ø÷;ôAC­Á襧{8C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜;÷øôCA­Á襧{8SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 5e64d56e674e44159f7a686e90afd438@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp 7‡Å?c·@º&ƒjº©ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Å‡7c?@·º&ƒjº©ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 0de8b8399e54456e97d5ff34e85c9d6e@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ÍzŒã½síF“-kIgr¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãŒzÍs½Fí“-kIgr¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 3185b0909c7b48c8849274be34c5bce9@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp [žuÔʺ‹BÏÝqí˜öÒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ôuž[ºÊB‹ÏÝqí˜öÒSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 0ed32855a83a4222a8689c1d85ff3a70@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ‘>,qxpHœˆV‰Ô+rC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜q,>‘pxHœˆV‰Ô+rSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ e1342725429b4f68b7242e41992f8954@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp  ÌÙIJ¿OH„ÑrÍ1þ©cC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÄÙÌ ¿²HO„ÑrÍ1þ©cSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 1921dbda02e441c096cbf41052ba5a99@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp j§1S,8dF¯2ÊSÀLP\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜S1§j8,Fd¯2ÊSÀLP\SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 3c4bed9995274187a5cac72c01774f0c@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp haTRiO³1=-F åC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜RTahOi³1=-F åSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 1e842fd3a601416aa677407f2f974403@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ª¦QÂéªsOŠë-œPôRFC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÂQ¦ªªéOsŠë-œPôRFSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 21a9ea597e384b7c93b9f194f3db5f6d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ZذšK_F­2ÝLBñ[C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°ØZKšF_­2ÝLBñ[SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ d55c6d181f1141759cb8ffe7cce1f0b0@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ¾’ÖhvßI®lUúÈã.C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hÖ’¾ßvI®lUúÈã.SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 5ba349c406f54bb19766daa158be46e4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp 8a)W³lÓA‚¾ù—§ÃÖøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜W)a8l³AÓ‚¾ù—§ÃÖøSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 70994474eaf34965be6d5ebfbf76d0c6@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ÑGôØžI´@Ù§ïC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜GÑØôIž´@Ù§ïSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number!£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 5f44931293c6433ba52e8d2fa7c501ca@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ~@½*òNI™*ÈÝ©ØìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*½@~NòI™*ÈÝ©ØìSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number"£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 176372ef59364c6394de20773fd28dc0@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ÆD®ýòšO©»nH-«eC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®DÆòýOš©»nH-«eSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number#£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 9a5ea7aa841c4889b34e36753f8ee47b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp qŽ~ lï@C ™ñÐ>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~Žql @ïC ™ñÐ>SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number$£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 83d206e1ffca49aeb6f0a585299f7e33@@@@@@@@@@@@Su  3Hey there! SÀ" Rp  §ýÕ)Ö>Ošéÿí½XkC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜)Õý§ÖO>šéÿí½XkSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number%£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 17f58b0657d74afa9e0ba8aac57f1419@@@@@@@@@@@@Su  3Hi there! SÀ" Rp! DnÁ;¿»OŸ(ª?¯ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÁnD¿;O»Ÿ(ª?¯ SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number&£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 1d988772ad7541eab0703b8904b6c065@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp" ÝH×awCbÌ»CóëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜HÝa×CwbÌ»CóëSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number'£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 70645150b3d64225a467d522b9a39638@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp# GÅ,„ùâOºÂ1ô>tÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜,ÅGù„OâºÂ1ô>tÔSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number(£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ ad1d09a6e57d41c887995628e39b6691@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp$ í}«·ôðT@”eƒ'üèC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜·«}íðô@T”eƒ'üèSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number)£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 1124737e583c479782e34c4879a2fcb6@@@@@@@@@@@@Su  3Ho there! SÀ" Rp% «·v*PÔmO–‚¬/A…C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*v·«ÔPOm–‚¬/A…SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number*£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 851c50b4e7994a7a8109939eaf8fc76d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp&  Ä/®ºCŽ>ŽØ!á/C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/Ä ®CºŽ>ŽØ!á/SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number+£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 04c81170b4da452a93abafefc697d332@@@@@@@@@@@@Su  3Hi there! SÀ" Rp' ᧃNNŽ"çßøŽÌOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ƒ§áNNŽ"çßøŽÌOSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number,£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 3414f7da4ef14f55908ea08a8ff3020d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp( ßÊ5Ï›_Kœ—G Ñ:EøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ï5Êß›K_œ—G Ñ:EøSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number-£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ f239c1f839f94a259496d0decb0dcb43@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp) Ú ôÃÅNœV^íïÊC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ô ÚÃNÅœV^íïÊSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number.£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ 9e950d61416c450796b3bde3e73d6ffe@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp* V™S/à¿ÑF€L•‘=ÖÈC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/S™V¿àFÑ€L•‘=ÖÈSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number/£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ fb6f3d8d5aa742a493ba84d2d21c2d03@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp+  •ƒ¾3ŒO´»P ­ùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾ƒ• Œ3O´»P ­ùSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number0£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ e6674f6f8536481f926d22b5fc7c1696@@@@@@@@@@@@Su  3Hey there! SÀ" Rp, šÕzµT«ˆEˆ0}LÖOÈC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜µzÕš«TEˆˆ0}LÖOÈSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number1£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ 53f32bc22ce34755858100a362eaf3af@@@@@@@@@@@@Su  3Hi there! SÀ" Rp- C§J¤ôÉJK‹˜#œ 9çYC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤J§CÉôKJ‹˜#œ 9çYSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number2£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ f91075b702414b8e900dcf432e0aedd3@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp. Íá ±(UM¤È|vS1¦C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ áÍ(±MU¤È|vS1¦SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number3£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ c262a834095c4db883162c3bf2aa9302@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp/ ñxxw·G®$“\³åC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜xñwxG·®$“\³åSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number4£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ baa1950bbd56477b9a7cb701fa86f17e@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp0 ÛjÆã|”ÒL£:˜rL(XC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãÆjÛ”|LÒ£:˜rL(XSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number5£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ 6513a3af59af475497b4d0c7a02f85df@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp1 ¬òg5L§¾ ¸ÿyTC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜gò¬5L§¾ ¸ÿyTSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number6£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ 31f8fefb308f426b8890f5eeb1542602@@@@@@@@@@@@Su  3Hey there! SÀ" Rp2  X¯ï L½êÑà¹üÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯X ïL ½êÑà¹üÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number7£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ 680a03dc4285440ab798a07f8eff0c49@@@@@@@@@@@@Su  3Hi there! SÀ" Rp3 è¹,Jv6JQÜ´Å–4ÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜,¹èvJJ6QÜ´Å–4ÞSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number8£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ 07bf5edfedbd468cbf4295c23a554d6c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp4 M„Cõ­êÇ@‘“LÂù–³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜õC„Mê­@Ç‘“LÂù–³SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number9£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ 9196724ef71042dba4f5f52efd6a83e7@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp5 ¥‰aÕõ –F±€NƒeôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Õa‰¥ õF–±€NƒeôSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number:£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ ad87afaec73841c49e00f5577163852c@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp6 Ÿý®ÇK¨D”XZõ9™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®ýŸKÇD¨”XZõ9™SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number;£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ 0a2909d7c3f6443093a3796960501cf6@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp7 >°MT™tI€Ä¤ÇëÀWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜TM°>t™I€Ä¤ÇëÀWSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number<£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ 2bab5dcabc3841d780a05d687d156f36@@@@@@@@@@@@Su  3Hey there! SÀ" Rp8 R‰/º»E¼‡*™ deC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜º/‰R»E¼‡*™ deSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number=£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ ec0923c15f884fb9a063c39bc7896af5@@@@@@@@@@@@Su  3Hi there! SÀ" Rp9 ú(å¾2Ï`F«4¢ã`t™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾å(úÏ2F`«4¢ã`t™SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number>£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ 0a9cca7276e94b328bea8995a8e91e5f@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp: )ÈÉà4 ¯§èe†$L¾3KE,ÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜e觯†L$¾3KE,ÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberC£x-opt-locked-untilƒ`f¥ÍSsÀ/ ¡ 5f0e095098134f48a974395913b841bb@@@@@@@@@@@@Su  3Hi there! SÀ" Rp? B}o3gVÏE‰HõW¾ZávC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜äü Æ1J÷‚û6Œi²>vSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberS£x-opt-locked-untilƒ`f¥‘ÇSsÀ/ ¡ 023d483c72bd4ac9923b97747e129ddd@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpO  k‡.D§M¼£ê|YÂrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‡k D.M§¼£ê|YÂrSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberT£x-opt-locked-untilƒ`f¥‘ÇSsÀ/ ¡ 697bf6094d06411ca4977a8aa032f6f2@@@@@@@@@@@@Su  3Hey there! SÀ" RpP Ÿxxþ| ŠJ„¤&øt _4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þxxŸ |JŠ„¤&øt _4SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥‘ÇSsÀ/ ¡ 31b1a8546d7844f098b6c57c68e51ce1@@@@@@@@@@@@Su  3Hi there! SÀ" RpQ —h@’üÔšNž`ï’?lC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜’@h—ÔüNšž`ï’?lSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberV£x-opt-locked-untilƒ`f¥‘ÇSsÀ/ ¡ 4022a64c4ab84aba95ff6d7f3c3969a8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpR ù®&nBûH­Þ^¢=g¼ëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜n&®ùBHû­Þ^¢=g¼ëSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberW£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ da8d8098270e416d933d44f2d82622c8@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpS 'ˆyýøBK‹ö!âOµ8JC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜yˆ'øýKB‹ö!âOµ8JSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberX£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ e0e59df5eab24a1b8553b42fb89edeed@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpT ÞÕFßÔC– cTtq&C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÕÞßFCÔ– cTtq&SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberY£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ a56c133cc8e94784a4bb045968a22469@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpU ,5¯‚3‘³J—é©Ne¨ŠC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚¯5,‘3J³—é©Ne¨ŠSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberZ£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ 2ab51e0ea1274e199e12fe8a19dcf9a4@@@@@@@@@@@@Su  3Hey there! SÀ" RpV |¦˜×Í3D¢ðk¡ÕbêÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜˜¦|Í×D3¢ðk¡ÕbêÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number[£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ f7da4884b4f14b1793711fa2b997805d@@@@@@@@@@@@Su  3Hi there! SÀ" RpW ðMM›¸²ØO’ø” fn0+C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜›MMð²¸OØ’ø” fn0+SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number\£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ ad1ed6c9c2534584a21fa614e1e55f66@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpX ÄÉPò SI¨ëÌséY]C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜PÉÄ òIS¨ëÌséY]SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number]£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ c6eecf4b353645ca81d79f9a3a991e2e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpY ûf–*8*8G˜ˆÁB ãT¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*–fû*8G8˜ˆÁB ãT¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number^£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ 21d241852eb144c69a7dbfee6ef91ee9@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpZ ^Úϯ™hMìG §ÓáC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯ÏÚ^™MhìG §ÓáSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number_£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ 6dd03069fa82494ba90acf9ec6be0db2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp[ ÑùÁ8išøG½x[sù› [C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜8ÁùÑšiGø½x[sù› [SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number`£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ b565e556ffc149babe1eedd0693a601e@@@@@@@@@@@@Su  3Hey there! SÀ" Rp\ OË??{gAª!Õ*ÚéÂúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜??ËO{Agª!Õ*ÚéÂúSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numbera£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ 3c874884cb1c49af9107671daf5b613e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp] Tüö{ŽEªtåë§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{öüTŽEªtåë§SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberb£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ d8e3742d4ce7418992c2ce81fb9d0ab4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp^ 7&:PÐAfF¾•N«íx—C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜P:&7AÐFf¾•N«íx—SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberc£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ e2186f1259ff4e75902dc619cff6b887@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp_ ¡Z"ÝŸ ©@±Ô¯% Šx÷C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ý"Z¡ Ÿ@©±Ô¯% Šx÷SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberd£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ 92ffbb7f715e4e85aedc200d241c881d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp` '¤<­WG‘rêóŸÆ²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜<¤'­GW‘rêóŸÆ²SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numbere£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ 0aad1b6d001846e3af01fa070f1de177@@@@@@@@@@@@Su  3Ho there! SÀ" Rpa ;YVøÙ‹K¸? *°5C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜øVY;ÙK‹¸? *°5SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberf£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ ed67a0288c804e8086c059ab8e62baf7@@@@@@@@@@@@Su  3Hey there! SÀ" Rpb ‹Kγ5O´Èd$ÇjMêC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÎK‹³O5´Èd$ÇjMêSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberg£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ e4b868c6576b44508429299b360432da@@@@@@@@@@@@Su  3Hi there! SÀ" Rpc \áWSCªï^{nSC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜á\WCSªï^{nSSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberh£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ 105030a7b49b4a7b8b431866ab26dbe1@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpd Æû ¨‹D˜–\öÌÕx_C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ûƨ D‹˜–\öÌÕx_SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberi£x-opt-locked-untilƒ`f¥’uSsÀ/ ¡ f1b4511895774d5799ccbd0caf9ab485@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpe ¨®ƒÌ)ÇI‰UUß´__C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ìƒ®¨Ç)I‰UUß´__SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberj£x-opt-locked-untilƒ`f¥’uSsÀ/ ¡ 85869c9156e340a890c57ff4316af570@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpf 9‚_~°Òê¾ðÐûB»^ éä„_C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ð¾ê>ûÐB»^ éä„_SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number|£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ 89659b61df2a47cbbd087714a8cee3c8@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpx #x~@O– 5}Y<ŸùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~x#@O– 5}Y<ŸùSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number}£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ e491a2cc42754accb4c23bfb477f4294@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpy ïèwˆ¿KL£pÕý79¤C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜wè￈LK£pÕý79¤SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number~£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ 072df25e914d4959830145d62ef3df9e@@@@@@@@@@@@Su  3Hey there! SÀ" Rpz UÛ-ï­q@­~´T™=¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï-ÛU­@q­~´T™=¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ 55e1a7de4742450a98718d2baded449e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp{ ¦¬BiYcB‹Úv¹÷ÑÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜B¬¦YiBc‹Úv¹÷ÑÕSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number€£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ fab93f675a5b4bb981527b54d2dda891@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp| üú†« N•4µ¸‘ ¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úü«†N •4µ¸‘ ¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ 4a0b8e2a2d054b3ebb4faa122637d0ae@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp} ÆâŒŠ¯åñMƒÜBƒÛB§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ŠŒâÆå¯MñƒÜBƒÛB§SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number‚£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ 2be88db13a074a61a4d001635dd389c6@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp~ ïÝÄìȽLH•*›ýÌ«ÕÐC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ìÄÝï½ÈHL•*›ýÌ«ÕÐSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberƒ£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ ddf5b88367a741ea8b34de072ff9285e@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp dbì@©¯»E¶wËVò¢ÏgC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@ìbd¯©E»¶wËVò¢ÏgSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number„£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ a9a263676ca147a59b2ce05e49604bab@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp€ Þ>šquJ´òç ï±C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>ÞqšJu´òç ï±SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number…£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ 7f976a1e527948e1811fad26b1e8fa48@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp [ô®ÇC È¡uÙoVC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®ô[ÇC È¡uÙoVSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number†£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ 17488fef89a94cc6bddc87a47fd4105c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp‚ ¥;PÞ}ŽL¶µîOOé9C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÞP;¥Ž}L¶µîOOé9SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number‡£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ 425502cd944049e28ae2b656e3644043@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpƒ ÍÄ QAF¼ÐÙ+·0¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ÄÍQFA¼ÐÙ+·0¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberˆ£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ 9d6a19c0d22d4a3fae447086670c459d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp„ ïl*‘HK„3B³ 7¸ìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*lï‘KH„3B³ 7¸ìSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number‰£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ f1163b7ddadb41d5894d93701e144efb@@@@@@@@@@@@Su  3Ho there! SÀ" Rp… sèN ýðK¾ZN,3ÞÆôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ NèsðýK¾ZN,3ÞÆôSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberŠ£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ 5392bd0956e040a9abb47c921913598d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp† ù,ªÀF¤ŒCRN×ÊC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ª,ùÀF¤ŒCRN×ÊSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number‹£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ 6834000aa763487492852ccef6c15260@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp‡ Ò °þ vM‚%ùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þ° Ò Mv‚%ùSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberŒ£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ d280da296ba6488eb20aec4c1708f636@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpˆ  ß 6·K¿&¥¸Qã½C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ß 6K·¿&¥¸Qã½SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ d0d6ded463034c19beaf00d763f033f7@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp‰ þP6ìÄýêC†,8ToóÿC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ì6PþýÄCê†,8ToóÿSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberŽ£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ 98dfea8d416d474fb39d5cc4690c341f@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpŠ Jµ^}í°­J¸F4<£)C½C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜}^µJ°íJ­¸F4<£)C½SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ 3159c9cc01b6417b88f84d885ae2ca37@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp‹ Õ‹¨_*,G’ä²>ûÿlC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¨‹Õ*_G,’ä²>ûÿlSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ ae5c4827585c4dab8321f14d86d2870f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpŒ E¹Î¤¿Å~M°[ÕâKÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤Î¹EÅ¿M~°[ÕâKÝSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number‘£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ 0691f33e4d684b32b1bf6b458d866ce4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ?éí¡¿–uM«Ú%»Ûîï­C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¡íé?–¿Mu«Ú%»Ûîï­SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number’£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ 4ffbbb94fa7442ff9103357e25a1642a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpŽ Ñ6ÍYoX @Ë[ûv*ãC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜YÍ6ÑXo@ Ë[ûv*ãSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number“£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ e904b86305f44a8b934a2158fe1a2033@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp Èþ³ cG¬êºGàËŽ*C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³þÈ Gc¬êºGàËŽ*SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number”£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ 2f10faaac80741c3854f4212b8e99d64@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ûsø¿õ¡A¤¡V ÕO‡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¿øsûõA¡¤¡V ÕO‡SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number•£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ e6565b5388f4423ead605b198eb20379@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp‘ Ôâg¬DñF— ¢¬–Q±ÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜gâÔD¬Fñ— ¢¬–Q±ÝSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number–£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ f447feed0fca424691464d80751259ac@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp’ × Μ(5§@Œqëëw][C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜œÎ ×5(@§Œqëëw][SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number—£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ aab4ecacb12940daba5a78d1feea585d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp“  b뵂J™C'@F+ÈC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜b µëJ‚™C'@F+ÈSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number˜£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ e7b5dc7c9837457fbdde44655bb60265@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp” m,T¶báæLª‚‚æ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¶T,mábL檂‚æ SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number™£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ b22ce84951094021b525d4dcb00fe719@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp• [}CUÖÑ5@ŠÎÔÀŸiOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜UC}[ÑÖ@5ŠÎÔÀŸiOSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberš£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ 3b59dfbe6a1a47849e926d283783c7f5@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp– Ö âHn(ŒE›\Ø4ShŽÁC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Hâ Ö(nEŒ›\Ø4ShŽÁSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number›£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ a1867a1aa7c64f6aae6eaae5db528c75@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp— Ƶ°ìe{zC˜Õ5u#ž C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ì°µÆ{eCz˜Õ5u#ž SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberœ£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ e22ca95313814b37895dcbd258b040a8@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp˜  àÔRÊ'AL’*ÁŠËßC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜RÔà 'ÊLA’*ÁŠËßSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ d3d1b161845d4e81b03bd9d035659265@@@@@@@@@@@@Su  3Hi there! SÀ" Rp™ 7aú/C^mB¿¾jBP #C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/úa7^CBm¿¾jBP #SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberž£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ 489f071dd43d4c88abe7bb1d483c1c72@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpš  Ñ#ãÊNM¡S(ÝÃOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ã#Ñ NÊM¡S(ÝÃOSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberŸ£x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 29c3defe62ca496bb190a49b6f949313@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp› rgbܭѬK·†õf“³6"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÜbgrÑ­K¬·†õf“³6"SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number £x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 5a8201d5940c4635b2511ffd9d3a0b52@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpœ „•|”¦>ÒM°©!w4-ïÆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”|•„>¦MÒ°©!w4-ïÆSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¡£x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 2892990673a7488995664a715f9941b2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp hT0wB£ú • Îh”C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h0TBw£ú • Îh”SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¢£x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 663fc790cdf3401fbc4db9de7d632e4f@@@@@@@@@@@@Su  3Hey there! SÀ" Rpž c‰}‘]êI¢\«(þÇ÷EC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‘}‰cê]I¢\«(þÇ÷ESrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number££x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 9f8188cc13bf492cb1427936a269ed25@@@@@@@@@@@@Su  3Hi there! SÀ" RpŸ ÁÞ&î„£yM‚Õ7J³kª¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜î&ÞÁ£„My‚Õ7J³kª¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¤£x-opt-locked-untilƒ`f¥” SsÀ/ ¡ b2969854a2674fa39be214c2bb2b68ec@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  (¡å«rZG¢¢Rå>BÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜«å¡(rGZ¢¢Rå>BÔSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¥£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ f7bbfd9e554d4a3f9bdea6db6889289d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¡ ^dÅ,A”ÀG™í> Š;ôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜,Åd^”AGÀ™í> Š;ôSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¦£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ d5d5f1e59ddb4b3d94012d743d2589fe@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¢ dñèfݬK±ìP‡"³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜fèñdÝK¬±ìP‡"³SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number§£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ 66337d8b097948d4bf96a0be4558bcbd@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp£ ~˜öVõ*F›•jÍi½[„C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Vö˜~*õF›•jÍi½[„SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¨£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ d92af4e591034c8eb953dd0034e69144@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¤ ^Ú :ˆ—]G‘ï¢]š‰×ÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜: Ú^—ˆG]‘ï¢]š‰×ÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number©£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ 94fcbcf24c5743b39a9eb1c90a495de3@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¥ ›W\‚q»N­×XpéòçC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜\W›q‚N»­×XpéòçSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberª£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ d6707e7d644a43cdafe5bb1b3e680953@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¦ þ‡©è1E«–*ms g'C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‡þè©E1«–*ms g'SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number«£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ 01f24d5e6dc1459b8a3d2cdcf6e630f6@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp§ ÿ]Jk–eB—“Ïû¥1€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜kJ]ÿe–B—“Ïû¥1€SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¬£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ 8b6ad48a368f496a8ce8d9129ea8c8e4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¨  Xo°iãwB„®H½eC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°oX ãiBw„®H½eSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number­£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ 70b9ab13d65a470c801aba222320497a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp© ÍS~©SÔC¸ׂJx•fC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~SÍS©CÔ¸ׂJx•fSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number®£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ c61aa096e0d945a886167d3ece46ec67@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpª Åx?!ïD·ç.,ìB C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜xÅ!?Dï·ç.,ìB SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¯£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ fffdf33f9f62410ea09ed3226aea14dd@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp« b‰ð!'xF¤þpsÐŒ§ØC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ð‰b'!Fx¤þpsÐŒ§ØSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number°£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ f44d0beb61204ea2a6ed35f7e244d423@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¬ S#l&ÜB•Á- ïûôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#S&lBÜ•Á- ïûôSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number±£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ 3cb74b14fbbc442ea33b1170f5436141@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp­ ’ eRãmO¢<ô|š#ÔìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Re ’ãOm¢<ô|š#ÔìSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number²£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ 1b428482f3da45ec8e99a4a9bcac7f83@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp® kžXÖcqF•+ m C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÖXžkcFq•+ m SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number³£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ dd43e092b495423f913cbe5f6aa71659@@@@@@@@@@@@Su  3Ho there! SÀ" Rp¯ *²éñüG¥=:œC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜²*ñéGü¥=:œSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number´£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ 5db7c237020e44cb9b4a46f3f2844aff@@@@@@@@@@@@Su  3Hey there! SÀ" Rp° °œ+L)úJ´k5@X“ÇîC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜L+œ°ú)J´k5@X“ÇîSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberµ£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ 565d6d4e5af541f19104157697826ff8@@@@@@@@@@@@Su  3Hi there! SÀ" Rp± Ô+]ur)gF¸i©Môv5C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜u]+Ô)rFg¸i©Môv5SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¶£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ a5d1952ca7d4441c98b9e689960c3343@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp² ’¬¼=¢ŠtM¿tU«¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜=¼¬’Š¢Mt¿tU«¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number·£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ ba3c49feadf240938fe3a966a2fc811a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp³ cÙ€¢°ECºÆŒÈÀøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¢€Ùc°CEºÆŒÈÀøSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¸£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ 1e80fe3b126c47e7a6a5e9feddfb2a84@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp´ gÅë âs@¹_|4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ëÅgâ@s¹_|4SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¹£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ 65a7e870b5fe46f89f7a9dd1467dd4ce@@@@@@@@@@@@Su  3Ho there! SÀ" Rpµ hÊ%+Éû°O‰áÍ~ò®ivC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+%ÊhûÉO°‰áÍ~ò®ivSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberº£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ 12b1d88797cc4e3aa9761ec4adc8f6a2@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¶ ’}j”¸ÜG¯eëáýãøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜j}’¸”GܯeëáýãøSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number»£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ e628453574074820b0d7e2659790d664@@@@@@@@@@@@Su  3Hi there! SÀ" Rp· ”<FÎB²òXœ8%jC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜F<”BβòXœ8%jSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¼£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ c6917bc1bfcc42f8be9656f8d5e5e4ac@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¸ ºÂë¦ô—”Dƒ>õE½C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¦ëº—ôD”ƒ>õE½SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number½£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 3c58df00f7d042f1a8f957842ed1cc6e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¹ ÁÝq‡i¥B³ŽÅèA„ünC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜qÝÁi‡B¥³ŽÅèA„ünSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¾£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 7709e4bf90e64855bec1186a5be2088c@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpº jemé‚IC°Çi¼ÞóÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜émejI‚C°Çi¼ÞóÔSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¿£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 8db6e73131a741c38a2b5470423d151a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp» s]ZY–êmBs6âøc ®C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜YZ]sê–Bms6âøc ®SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÀ£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 9aeba14b22004fed81b39b77c7848b79@@@@@@@@@@@@Su  3Hey there! SÀ" Rp¼ Â¥ÇÂßG’€‘ª^fC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ç¥ÂÂGß’€‘ª^fSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÁ£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ a2b7a5a8fc5a48b5ac7847148b24877c@@@@@@@@@@@@Su  3Hi there! SÀ" Rp½ ƒ|>€ñ%A¡ñ檥@ˆ†C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜€>|ƒñA%¡ñ檥@ˆ†SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 2715af4992484b9dbc49074b3a1f5a4b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¾ W¿•‡ÁÛMJ”pÌ¥g`”C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‡•¿WÛÁJM”pÌ¥g`”SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberãx-opt-locked-untilƒ`f¥•SsÀ/ ¡ 717768a46be1427abe65804f4f2bc271@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¿ 72< ×dI¨E®"x•àC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜<27× Id¨E®"x•àSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÄ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 4be9cfda917144f3b1a5e7d1345af706@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÀ ÀƒÔ”YhJ·SçÑ$ÖãËC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”ÔƒÀhYJ·SçÑ$ÖãËSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÅ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 340ceb2d61f64511ad6fc668bbc4447a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÁ ´?ÐñzèùFºð¡V†¶ÀC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ñÐ?´èzFùºð¡V†¶ÀSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÆ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ ef4e44c7b43247c2af2df6e3aa3274ac@@@@@@@@@@@@Su  3Hey there! SÀ" Rp µèÖd»žL–¼×]]TOÿC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Öèµ»dLž–¼×]]TOÿSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÇ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 89b8ca99735c4cfca9c72e21c5bfc3b3@@@@@@@@@@@@Su  3Hi there! SÀ" Rpà¥Çpú?ÂðD¤Â·ËwOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úpÇ¥Â?Dð¤Â·ËwOSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÈ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 5934c26da4bf49c8a0bd1cadb4966d1e@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÄ &xìË#ÒËN¼.Ž®ðñC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ëìx&Ò#N˼.Ž®ðñSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÉ£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ 0d6dd29ed44849c0abc95c36ad386ed3@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÅ ÁPÝãï‰ÝEžª;2BÝÖC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãÝPÁ‰ïEÝžª;2BÝÖSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÊ£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ aa29211d04184741919e17beb65edd8f@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÆ ¦ð;Ú*D¨~lá2…‘‹C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜;ð¦ÚD*¨~lá2…‘‹SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberË£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ 2091c06408b64375aa26a99db0b3eed9@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÇ ¦T7j•¯L²ƒÀu˜òC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜7T¦•jL¯²ƒÀu˜òSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÌ£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ 96ef14d8ca1042d682230dbaa239724d@@@@@@@@@@@@Su  3Hey there! SÀ" RpÈ `§k@ÄL¾?#÷¥'ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜§`@kLľ?#÷¥'ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÍ£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ 8a60c2329c5d403a8430fc3185869dab@@@@@@@@@@@@Su  3Hi there! SÀ" RpÉ íâ;}:¥H˜IeZÚbBRC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜;âí:}H¥˜IeZÚbBRSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberΣx-opt-locked-untilƒ`f¥•4SsÀ/ ¡ d076ad6eac4540479bc510601eb87990@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÊ [¶š<Û¤I0;è©>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜š¶[ÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÏ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ 83a7f2ec54b742c2804e9a99935ae489@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpË ¦u޼€åÒI…z;þ¶Ã½òC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼Žu¦å€IÒ…z;þ¶Ã½òSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberУx-opt-locked-untilƒ`f¥•cSsÀ/ ¡ f22da8c9c87b4cb786e9bfa085d1e634@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÌ ìÕO^kBûO”’Wø‘HÖC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^OÕìBkOû”’Wø‘HÖSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÑ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ 00a939d662454514bb807f09039a8b7a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÍ 8³Êåú3@šÜˆl­å‡lC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åʳ83ú@šÜˆl­å‡lSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÒ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ bf3ccc1b9a6740378c2fb0a284e77f62@@@@@@@@@@@@Su  3Hey there! SÀ" RpΠÁ›™Þq“ K¢cÅx˜ÆdC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Þ™›Á“qK ¢cÅx˜ÆdSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÓ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ 8dbfb9fd75f04487bd7f572007aa3fd0@@@@@@@@@@@@Su  3Hi there! SÀ" RpÏ ðë€~Û>±J’øèDóZmoC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~€ëð>ÛJ±’øèDóZmoSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÔ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ c6704fde073b4bd8a360f9a6ff4768f2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpРª|Š1\A²I¸(þ »:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜1Š|ªA\I²¸(þ »:SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÕ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ e3bb9e63b0674176b3a6a2edf1e1ed2d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÑ ‚Æ ÏÛ¼‹E¦šaÄè¡¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ï Æ‚¼ÛE‹¦šaÄè¡¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÖ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ d754ba81e82a4fb593a5bedaab6e72b0@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÒ ÚˆëwæÇÂO’,÷šÁ½ –C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜wëˆÚÇæOÂ’,÷šÁ½ –SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number×£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ 7660d3d55d014f6fa3ea7a190d5b489a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÓ χ)~–WEžp) ª$mC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~)‡Ï–EWžp) ª$mSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberØ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ f97c3b4e480e47d9ba18d20fe8e4bab4@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÔ +7ƒ‰'ëBåûm±C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰ƒ7+ë'Båûm±SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÙ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ b93d78b09ff34782aef9eda564603c27@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÕ ½†9({DB ù²Å´¢›±C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜9†½{(BD ù²Å´¢›±SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÚ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ a706f26ab0d846dd9f15918430a99732@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÖ ÙÇ»NO GˆsóÅß"]ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜N»ÇÙOG ˆsóÅß"]ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÛ£x-opt-locked-untilƒ`f¥•ÁSsÀ/ ¡ 5e65abf215424d4cb0c91a5aadf17a5a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp× ½jIɲA„G¤ )eNC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÉIj½A²G„¤ )eNSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÜ£x-opt-locked-untilƒ`f¥•ÁSsÀ/ ¡ 0b30d2807ca24b8486d4ba3beed87654@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpØ „eÛá™1äC·¼ÈV´-ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÃÌ!¸æDªU>ÈV´-ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberæ£x-opt-locked-untilƒ`f¥–SsÀ/ ¡ 0e7f712f8ac244b8b97bb47f0e7c5b8d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpâ تN­(¹êM‘Y9ÿ$cŽC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜­NªØ¹(Mê‘Y9ÿ$cŽSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberç£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 20eaa9a4855d405d9b5e9b26d60f1d00@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpã ŽoèTøe E¼vôIC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜TèoŽeøE ¼vôISrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberè£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 6abee82d88384c10b1071778712c68b5@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpä ÙÍ…ÁNJCˆý»ÿ‡XhC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Á…ÍÙNCJˆý»ÿ‡XhSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberé£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 7c9cd21953394e3d89d6584cea623a02@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpå ©“ÈDÚ %G¢óUµÀ´œJC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜DÈ“© ÚG%¢óUµÀ´œJSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberê£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 1b443f5fa4ef4648a158b2036670073a@@@@@@@@@@@@Su  3Hey there! SÀ" Rpæ ÁK127F@¾1o,²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜21KÁ7@F¾1o,²SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberë£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 4c49b0073da84f25a0244ca670efe72e@@@@@@@@@@@@Su  3Hi there! SÀ" Rpç òB{ÐÕÓJ¡b•Ë WÂC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ð{BòÕJÓ¡b•Ë WÂSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberì£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 40fcbdb23f8d450d93891dc4ec3ec637@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpè çkû× t‘KŽã`b%¬×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜×ûkçt K‘Žã`b%¬×SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberí£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ 036046deb9774666aeaabf16eafa6ef5@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpé ›…çbyÑ[Nœô‡’( ÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜bç…›ÑyN[œô‡’( ÞSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberî£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ 99669e48e3a54f659fac27949a1f6769@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpê S•mS‚›F‘ ÀáºÍfÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜m•S‚SF›‘ ÀáºÍfÝSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberï£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ f2e8fbce0be3470586512a790d1a6830@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpë j[Åq4KEÄvœÒ‡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Å[jqK4EÄvœÒ‡SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberð£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ da0ae1dd5dad4914aa11ef99de7abb2f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpì )Ú¯µ©oLŒ<޹º¸è^C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜µ¯Ú)o©LŒ<޹º¸è^SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberñ£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ ae54458ff97a4c22b30f3230e2aa870a@@@@@@@@@@@@Su  3Hi there! SÀ" Rpí Œé¤æ°ÿAŠ»< U"3¨C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤éŒ°æAÿŠ»< U"3¨SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberò£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ 2184a1504b6d490aa6a6e4b274e46d27@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpî Ad„Þ_ÿ’Iª}–ÁÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Þ„dAÿ_I’ª}–ÁÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberó£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ 9b91f6aacf70450bb36bf07cc9588dac@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpï oEO°`Eàfô¦µ“(C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜OEo°E`àfô¦µ“(SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberô£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ 9c42ff2a7d334c8e9a168e131369a297@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpð å Ú3d~C·?PD™Á­¹C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜3Ú å~dC·?PD™Á­¹SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberõ£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ e756b252dd8b45b89ac4614e6a7f8b91@@@@@@@@@@@@Su  3Ho there! SÀ" Rpñ ç&F´œ·B‘cÇGši8)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜´F&çœB·‘cÇGši8)SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberö£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ 5d9e4fed9c8841f9ac856355206ae1e8@@@@@@@@@@@@Su  3Hey there! SÀ" Rpò zíèÕãEûF¡zâ÷ætC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÕèízEãFû¡zâ÷ætSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number÷£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ a707996655e846078df696374be3200f@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpó ¦ÁÛ±WI®}×IL:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜±ÛÁ¦IW®}×IL:SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberø£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ b423e35ac3e64217809b26daa95471d4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpô üyÜú„¬Lˆ=s‡‚kaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Üyü„úL¬ˆ=s‡‚kaSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberù£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ bc9490b246924d1f9425da265d8cf0d9@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpõ ^]æ/nòFH†lI×Lä+C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/æ]^ònHF†lI×Lä+SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberú£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ 839c628a652e4810b07dd78a23f80964@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpö ã pƒlÏÇF¼jÞ-ŸlÕJC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ƒp ãÏlFǼjÞ-ŸlÕJSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberû£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ be39ea4945f3400589bd77a7820a40d0@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp÷ ¿A’¾ëzG¾¤[á%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾’A¿zëG¾¤[á%SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberü£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ 9ff1907d07af4966aa8f44bff9e6014e@@@@@@@@@@@@Su  3Hey there! SÀ" Rpø a:Ž—.%M··ãËjä×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜—Ž:a.M%··ãËjä×SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberý£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ 4b7741a1fd574b4bbb714c32cbb0b501@@@@@@@@@@@@Su  3Hi there! SÀ" Rpù ƒ®šúë*A‹üsð•„C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜š®ƒëúA*‹üsð•„SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberþ£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ fdd88cd95d1b439ba28c642f268469e1@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpú #6¶ÙÍ#ïB®wX¼Í×iûC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ù¶6##ÍBï®wX¼Í×iûSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÿ£x-opt-locked-untilƒ`f¥–êSsÀ/ ¡ 7939b9854c6b46919e7cea62f3dc98d5@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpû À¼' ¬M¥KCC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Á¤Ôü¯Já›ÊÇA>KCSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—SsÀ/ ¡ 296e6ba15ac74c51941e52378388e9ae@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ë‰³+œKš4(H㱸]C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰ë+³Kœš4(H㱸]SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ ba8a8f356f3d4240997deeaa42f7e5be@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ¢“Œ[@ôòE²‰g‚êwÁC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜[Œ“¢ô@Eò²‰g‚êwÁSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ 025c69be6e5544de948f78c53cbf3cf0@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp rÂ³ÏØi_A¼²“DÚ€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ï³ÂriØA_¼²“DÚ€SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ c15045efa07a483da00dc3355fc59711@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  gÆäžÏMª°I3å*EC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜äÆgÏžMª°I3å*ESrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ 4fae76a81a7f4e6e8e6263f480e15e32@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp  5§@$V2åAh„lÃïC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜$@§52VAåh„lÃïSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ 3050ba68f4154b349e21e5ea2a85e4e1@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp  í þåÉ $Hºš„±ëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åþ í ÉH$ºš„±ëSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ 3f51b158dd46453a9ce879f0c4846d70@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  Š Ñ—µ±7A“ˆ‘n°éC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜—Ñ Š±µA7“ˆ‘n°éSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ c87d6b35f70949119c29833590b3ab1d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp  Ð Ù*„ÃëM¶ÏR軨w\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*Ù ÐÄMë¶ÏR軨w\SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ ea25bd71c6ca43e0bcab9fc1b228a496@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp H`.R#MK¶á ½ †C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜.`H#RKM¶á ½ †SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ 843abd4414894823b6a59ce0f62fa429@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp T=dÛÎñšM k¾ Z‚C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ûd=TñÎMš k¾ Z‚SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ 4c6e578d4e024e13916b9ad06a7b8f08@@@@@@@@@@@@Su  3Hey there! SÀ" Rp ñ;å‹E‚.D¥Øª&?z³ùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‹å;ñ‚ED.¥Øª&?z³ùSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ 516987c6da1c443faacb27738c5bffbb@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ¿ëXv*`I«Àiâ‹C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Xë¿*vI`«Àiâ‹SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—wSsÀ/ ¡ 4906a1a0e0974c549ae3cf780faf1b1b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp Vó¼šÓ®Mµ9¼ì " AC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼óVÓšM®µ9¼ì " ASrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ 37695c45fc5d49b4b7d195177fcc1bdc@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp Kþ.î£1 C§¸[T[ÆAC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜î.þK1£C §¸[T[ÆASrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ 9df38ed59faf414db7a0f6de45fa2e11@@@@@@@@@@@@Su  3Hi there! SÀ" Rp 9d@üÖýsH¹â˜3a:\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ü@d9ýÖHs¹â˜3a:\SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ 363af49c66b9414b9cb96e8b89803739@@@@@@@@@@@@Su  3Ho there! SÀ" Rp =6—¾šM¥H´+á¿”Ö°C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾—6=MšH¥´+á¿”Ö°SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ e4c6c8e3fb0746118db4bd81e70906d4@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp kéZúª,Lªh]rEøwC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úZékªL,ªh]rEøwSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ e4a22423d9224cf896bdc486fa9b5040@@@@@@@@@@@@Su  3Hi there! SÀ" Rp Ýb¹”¡ƒgF¬¶Š¯ GhC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”¹b݃¡Fg¬¶Š¯ GhSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ f08b79866799457eaa738721399cebd8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp €v¶¦ «kB—HÜ—­J¾ÓC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¦¶v€« Bk—HÜ—­J¾ÓSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ 1e2f202dbfb64da6a0088d5bf5f0bd58@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp L‹@ðjlIªÐåB¢ÙG–C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@‹LjðIlªÐåB¢ÙG–SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ 4cff2d4bd2a14eb298b508d2385ad7c1@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp Á€UÁ D¿Çv†^„C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÁU€Á D ¿Çv†^„SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ 940b1f78cda142688a5a2fd72e9b127e@@@@@@@@@@@@Su  3Ho there! SÀ" Rp -ÈøFó|ØJ®+t¾GNð²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜FøÈ-|óJØ®+t¾GNð²SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ 4a67be7715c54f239900332b50cdfe20@@@@@@@@@@@@Su  3Hey there! SÀ" Rp Åã8»pÆÕK’N¿OY¾q&C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜»8ãÅÆpKÕ’N¿OY¾q&SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number!£x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ f978f04bbedd4084abff5ad32a100274@@@@@@@@@@@@Su  3Hi there! SÀ" Rp mMvÿˆ E«^6U±c€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿvMmˆE «^6U±c€SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number"£x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ 29d1b6a7bb834fedaa915fd55d24af8a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ´îçÖ=¥H«ñ(,·mÇC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Öçî´=H¥«ñ(,·mÇSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number#£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ d13db326d34b484ab2664c0489e3c914@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ݼCæ ÂïFŸ­SâC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æC¼Ý FSâSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number$£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ dab10483ede14f559a7eeafa74c85b31@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp  b…ø xÊG¤Æ ¬jbZ—C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ø…bx GÊ¤Æ ¬jbZ—SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number%£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ 5dbc97d20ca547529fa9f5da693045ee@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp! ÉnÔ&KŠÍ«†&™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÔnÉ&KŠÍ«†&™SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number&£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ aa97846421cc4651afbc15938d25ec5a@@@@@@@@@@@@Su  3Hey there! SÀ" Rp" HS,·ÍJ\CŠVû:§f£C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜·,SHJÍC\ŠVû:§f£SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number'£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ 7219e23c0084475c97a46ee16f46315c@@@@@@@@@@@@Su  3Hi there! SÀ" Rp# #7©BÖ«KŸEÍ”/=¦€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜B©7#«ÖKŸEÍ”/=¦€SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number(£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ b430e046f4a3469faea051b0f2f22bd2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp$ å3ã§¾¢ÏLšaáë®FèC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜§ã3墾LÏšaáë®FèSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number)£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ b6044c08f57543a7af6b2ca816965d50@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp% Ó&`;ý,Ncx7¢3¨bC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜;`&ÓýN,cx7¢3¨bSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number*£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ f6918a4ddfa7424f82f8b1d6afe7a055@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp& ¤ iT½F› gæ‹¢*™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ¤TiF½› gæ‹¢*™SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number+£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ 19a3d6ca8449490b8be0869c6955340c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp' švž‰( ®J°÷Ù/Žï’HC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰žvš (J®°÷Ù/Žï’HSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number,£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ 7b37addaedca4fb1a09a6a0a5889e90d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp( ËV/…PwK»$FnïóÍþC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/VËP…Kw»$FnïóÍþSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number-£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ 2310b3fafda44ddcb1a47bfa6898b494@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp) dÑ3 c0OƒGHî¿Ù›C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜3Ñdc O0ƒGHî¿Ù›SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number.£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ 3318dcc6b8834bdbb40c11554dbed234@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp* Ôû-J£+óC˜JÑð"ÇÑÎC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜J-ûÔ+£Có˜JÑð"ÇÑÎSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number/£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 802821aa99d7498f8f4f187cb759a364@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp+ ôb2ÖO„¤ýÖ;RC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ö2bôO„¤ýÖ;RSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number0£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 6ca927451abb44cc8822685055c201b4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp, _=ÄŒæG„ÐA(ƒÕh}C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ŒÄ=_Gæ„ÐA(ƒÕh}SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number1£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 7ec928f8c10546bb8cfa9992d7e83362@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp- " 8¸¸„H©Ý'šÛÛøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¸8 "¸H„©Ý'šÛÛøSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number2£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 52a52c6f490e457286a72f6e4719c7be@@@@@@@@@@@@Su  3Hey there! SÀ" Rp. Ì$†¤kO¦Tçï8îTC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†$̤Ok¦Tçï8îTSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number3£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 065d3d7251d14af6a1bd63cae9a2a9cd@@@@@@@@@@@@Su  3Hi there! SÀ" Rp/ }Õ†v­ G¶Âѱªu*C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†Õ}­vG ¶Âѱªu*SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number4£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 4b38cc7cde2240ee82edd2cd2c6f5873@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp0 QàÔ-Ì E¥”…Ye×"ÍC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÔàQÌ-E ¥”…Ye×"ÍSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number5£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ cc9cf3fb011349f691cbecc179c61e62@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp1 fº¶®™ ÚMŽ­É7à>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®¶ºf ™MÚŽ­É7à>SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number6£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ f9738fc9cea84de29e05b65e33f0ce0e@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp2 û45bö’Kµ<´Û3¬MC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜b54ûöK’µ<´Û3¬MSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number7£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ f48d7d1af4dd4ca1a58e3a985c559a61@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp3 PT½Yp F T´Wfvò"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜½TPpYF  T´Wfvò"SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number8£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ e1a668f7a2c449a39a25b1a652cd2a15@@@@@@@@@@@@Su  3Hey there! SÀ" Rp4 UÜ$g«H•ø@µ;LÃC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜$ÜUgH«•ø@µ;LÃSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number9£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ 3ff7a743767a4b0785efd6526d47781e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp5 CéͳŠvH—z¤° Ô C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³ÍéCŠHv—z¤° Ô SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number:£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ 51687a302a174f2bbfdeb10e7b7e638c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp6 ‡\ OZÙÇKˆéÔö½#C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜O \‡ÙZKLjéÔö½#SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number;£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ f6d5174486e049c3a7b264605ef968ff@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp7 òAݺçÞWM–6a[Ó·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ºÝAòÞçMW–6a[Ó·SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number<£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ 6b40baace0f94efa894f541a933dfe26@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp8 Í蔡,?1O¾7'*(í–=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¡”èÍ?,O1¾7'*(í–=SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number=£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ bb702b08e67b4bcfade3b263201027fa@@@@@@@@@@@@Su  3Ho there! SÀ" Rp9 ÆYþæŽêG²bã±›6C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þYÆŽæGê²bã±›6SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number>£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ dc89f50d66f54b9fb9988b4140cccf46@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp: $ ÍࢴÉN›ðá/ŒñC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜àÍ $´¢NÉ›ðá/ŒñSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number?£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ ff83c301f382406caeb724d4603000d7@@@@@@@@@@@@Su  3Hi there! SÀ" Rp; ª9b @‚üO´FjÄÊC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜9ªb@ ‚üO´FjÄÊSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number@£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ 752ab8972a02454d92599d9f2004f856@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp< ¢´Š5ùN}F”ŒI{dôªC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5Š´¢NùF}”ŒI{dôªSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberA£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ 84079d948d5b4943b3c76e7112a4dafe@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp= ˆÐì!xkA—Æ o G•jC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ìЈx!Ak—Æ o G•jSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberB£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ 294a1aaf54fc4606a0aaf11388fea829@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp> ¯ èGHŒŠc¼gÙ©%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ¯GèHŒŠc¼gÙ©%SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberC£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ bcc1885e95d94aa5a6c9832cf5f52bf5@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp? {NøtßDMMŠq¡S­(¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜tøN{DßMMŠq¡S­(¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberD£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ 70a2c063066240e687ab1b70946a29f9@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp@ §ÇÆTúJ¾ØJŠ©Ù\4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÆÇ§TJú¾ØJŠ©Ù\4SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberE£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ bf23b22751c04a1ea5e4fb36b23c923d@@@@@@@@@@@@Su  3Hi there! SÀ" RpA nf»ž ÚN¹*}µù³ÕËC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜»fn žNÚ¹*}µù³ÕËSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberF£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ 67540e32ecb24534add77ff3dd696c4d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpB 8~Ø "L©Ø––—«`C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~˜¼ï ØL"©Ø––—«`SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberG£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ cf78c769f8fe487abc6b574a68341011@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpC ã€KGu±M®VMvj/Ê”C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K€ãuGM±®VMvj/Ê”SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberH£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ e5e184ddb0964263af8cb147b4fb1a77@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpD DÚÇG>ÓG¸Ó ‡û¢C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜GÇÚDÓ>G¸Ó ‡û¢SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberI£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ 3f44e6c3574844d8a5efec71b6c04058@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpE ’ÖŸXø‰~N¹fÌ"žc·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜XŸÖ’‰øN~¹fÌ"žc·SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberJ£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ 7792f92416434251930cc2a6abcbc3cd@@@@@@@@@@@@Su  3Hey there! SÀ" RpF ›GÄÍ¢=DAfýgƒOñbC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÍÄG›=¢ADfýgƒOñbSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberK£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ fdd5a392544e435aba4946949483631a@@@@@@@@@@@@Su  3Hi there! SÀ" RpG  ̓8£F» \­%ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ƒÍ £8F» \­%ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberL£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ 6e4f475d32d14033aacdce52e481363e@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpH *Xÿ45ÈE½r¼³Ý±Ó/C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4ÿX*5EȽr¼³Ý±Ó/SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberM£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ 4e71fe51f49144dab61191f2ef616aed@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpI 6!J1è ÞHŠF®ì:[¾óC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜1J!6 èHÞŠF®ì:[¾óSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberN£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ 571a258f5b3a4c42b06875d62d6c7dd9@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpJ ½/hFÁCláà²@™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Fh/½CÁláà²@™SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberO£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ 8857349005454867bc35c88999293897@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpK ’¸¡¡9ÿ9FšÍdôeÂÌC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¡¡¸’ÿ9F9šÍdôeÂÌSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberP£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ e77554f574804ade827c981e376fd626@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpL FÞ‹ ÏêQK®ì˜^ŒqC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ‹ÞFêÏKQ®ì˜^ŒqSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberQ£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ e221474ab17944819156118c9240c886@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpM óÛ6ä;I»LD=U¨C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ûóä6I;»LD=U¨SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberR£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ 4bafe90a74df43449cbe90e53ef2f528@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpN %«Nâ:DŠ*Nàƒ"ZÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜N«%âD:Š*Nàƒ"ZÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberS£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ 1e6f05f776cb4081b0b2859b9c3b809b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpO ªHA©*J´~ÞÚ&ÅÍôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜AHª*©J´~ÞÚ&ÅÍôSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberT£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ 559c699f1e32462c983ec7bbe545e6fb@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpP =Q‘¾ñø!A¼_#‚ãúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾‘Q=øñA!¼_#‚ãúSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ e20ea8ef4a494b579cfdc70793f3ad07@@@@@@@@@@@@Su  3Ho there! SÀ" RpQ 饋ÛèC»=„÷Ó™%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‹¥éÛCè»=„÷Ó™%SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberV£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ 289b6f708d314d238fffc53a37d02430@@@@@@@@@@@@Su  3Hey there! SÀ" RpR V/ âÛ­5@¯ÏæÍ3P C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜â /V­Û@5¯ÏæÍ3P SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberW£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ 11f706bd4cd940dabb5cb9a63fa79872@@@@@@@@@@@@Su  3Hi there! SÀ" RpS èŒBH`ï±JŒ´& &0NC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜HBŒèï`J±Œ´& &0NSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberX£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ 9bd6e1c922f544d89e2f02a0e9129e01@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpT ÚE4§hCH¾¹v¹—ö¡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4EÚh§HC¾¹v¹—ö¡SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberY£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ 6d0a94b98db146e7b53259fa0e8f00da@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpU äÀÚc¸E’|X{yÙSC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÚÀä¸cE’|X{yÙSSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberZ£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ b6ae5f3e921d4c068d4b96707a1c649d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpV ‡yНtwI“>+«Ôv¨PC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Šy‡t¯Iw“>+«Ôv¨PSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number[£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ 80e40c354bda4222a1af6851755f435a@@@@@@@@@@@@Su  3Ho there! SÀ" RpW  Kî¿N`J§É12¯C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜îK N¿J`§É12¯SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number\£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ 90b4436516504614a2e5de9703844d88@@@@@@@@@@@@Su  3Hey there! SÀ" RpX ßøÉ&ÉÁ-E±Þ¢ÂmY%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜&ÉøßÁÉE-±Þ¢ÂmY%SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number]£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ f7851009b76c445ebaa803f5459497a6@@@@@@@@@@@@Su  3Hi there! SÀ" RpY /˜Ës%„O ÂE†m¹Ÿ:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜s˘/„%O ÂE†m¹Ÿ:SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number^£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ e80aaefcfd2848d5932c195817e0949a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpZ c}°ôÖûlC»ù¹ÔqçE½C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ô°}cûÖCl»ù¹ÔqçE½SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number_£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ be1bac5782ad48ad991e4003774da3ed@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp[ ÞŒª.+L°uø ÄèÅC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ªŒÞ+.L°uø ÄèÅSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number`£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ 11d3b9cd6ebb46cfaa372792d014e6e5@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp\ Ïåû…NFwDÛG´Øx^VC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜…ûåÏFNDwÛG´Øx^VSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbera£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ b732a9c958534034ba3e1cfd6baee508@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp] ä|‹R¸&ŒO¦]urR ÙóC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜R‹|ä&¸OŒ¦]urR ÙóSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberb£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ 39a2fc2984eb4648a0dbbfd4424a11fb@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp^ VŒû 1±Dƒ2{Íx›$þC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ûŒV±1Dƒ2{Íx›$þSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberc£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ 6eb94357de7c4ad5a12f340cec66b731@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp_ øéø· L„vÞ§#~s§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜øéø·L „vÞ§#~s§SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberd£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ dc50143a2b4d4ab2ba8aa04472949111@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp` fÁÎãËÊA»ßQÒu­TC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÎÁfËãAÊ»ßQÒu­TSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbere£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ 37a41ed7489648be9b2ec0e642bcb6ce@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpa Óĸ…?­LF…žq2ûrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜…¸ÄÓ­?FL…žq2ûrSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberf£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ 67af5e20b7fa4ca1a74be482dfe111e3@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpb ¯6‹ÖJ•B;6ßÍïÍC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Â6¯‹JÖ•B;6ßÍïÍSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberg£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ bba22fa4bc914121b4c2e4c281df7e1f@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpc ÚìPô3A˜X]O@´­IC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜PìÚôA3˜X]O@´­ISrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberh£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ 43604d9b30e04f2d9dc0550a5020fac2@@@@@@@@@@@@Su  3Hey there! SÀ" Rpd È4ÖãH£…`‚‘}8×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ö4ÈãH£…`‚‘}8×SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberi£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ d4a132622b1d4e748042f0d222c9a6c4@@@@@@@@@@@@Su  3Hi there! SÀ" Rpe y„¾°;ÄPG²•#¦$DªC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°¾„yÄ;GP²•#¦$DªSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberj£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ cec9838bfc7e4c0db6d7d86fd6e4a0be@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpf 4À-hœJšï¿­®ðC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜-À4hJœšï¿­®ðSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberk£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 2d3ed5b1bcb84d5fa3aeff493da5ea9e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpg oã³Ä¿ä A‡ 5ÇW°þC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ä³ãoä¿A ‡ 5ÇW°þSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberl£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ d9912f6e611843408af4dd98985f0ddf@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rph Ë~Á LPN¿¬••šVC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Á~ËL NP¿¬••šVSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberm£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 41c23139f9a34b1590272682d4ac6458@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpi ÔÅ3©>TM¶A ‹³’aÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜3ÅÔ>©MT¶A ‹³’aÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbern£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 8f42f70baab542e1be0fb11a1eed0f27@@@@@@@@@@@@Su  3Hey there! SÀ" Rpj ÿ¶z:…äCŠºkHú{\²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:z¶ÿä…CŠºkHú{\²SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbero£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ cb75c39d7b6f48ffb84c656005dd6657@@@@@@@@@@@@Su  3Hi there! SÀ" Rpk sÛ+´ÌjX@€ÑÄe ²¸dC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜´+ÛsjÌ@X€ÑÄe ²¸dSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberp£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ d12cb86055024a9a9d3d60d74ed168ec@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpl îsf¼ôgÉIª„ #µ³CC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼fsîgôIɪ„ #µ³CSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberq£x-opt-locked-untilƒ`f¥š6SsÀ/ ¡ de05cacfb919483587287c6fd1a4d088@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpm Ú¢qìZ8»Fˆ•²)ì+RC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ìq¢Ú8ZF»ˆ•²)ì+RSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberr£x-opt-locked-untilƒ`f¥š6SsÀ/ ¡ e2d310ea25dc40d3bb46e0df8a2b1743@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpn ÈíÅN1@·4)ÎÔèZÚC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÅíÈN@1·4)ÎÔèZÚSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbers£x-opt-locked-untilƒ`f¥š6SsÀ/ ¡ ba0cc2432a8844ffb1ddf4add4cb7ebc@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpo üq#ôTOC`R[pC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ô#qüOTC`R[pSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbert£x-opt-locked-untilƒ`f¥š6SsÀ/ ¡ c6a275f2d301422b91c6c9b69c7aa30a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpp  -˜µ< ÕK»ôéºq¹C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜µ˜- ñ¨ùùÃK¼L÷¸qÍ_C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¨ñ>ùùKüL÷¸qÍ_SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbery£x-opt-locked-untilƒ`f¥šUSsÀ/ ¡ d7d09308bb034f599657facf6ff90653@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpu !ók¶JìúD ‚3F·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¶kó!ìJDú ‚3F·SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberz£x-opt-locked-untilƒ`f¥šUSsÀ/ ¡ ab5b9784c88b4777b30f14db37502ac9@@@@@@@@@@@@Su  3Hey there! SÀ" Rpv ÀÌØ:@lTK¤bõh}æ÷:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:ØÌÀl@KT¤bõh}æ÷:SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number{£x-opt-locked-untilƒ`f¥šUSsÀ/ ¡ e6ef7f83d3c146859921e598ae3413f5@@@@@@@@@@@@Su  3Hi there! SÀ" Rpw ÊY«Æ¿M¦}Ƈ[ûçC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜YÊÆ«M¿¦}Ƈ[ûçSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number|£x-opt-locked-untilƒ`f¥šUSsÀ/ ¡ 60a04385295d4bb7bd81dc1862ebfbe4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpx 9•.Ö\X*J‘Œ‰mhà‹ôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ö.•9X\J*‘Œ‰mhà‹ôSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number}£x-opt-locked-untilƒ`f¥š„SsÀ/ ¡ 5fa302ca01be4f6c841ad7ee4c7cee05@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpy Ê>4Ì„BÛG³F6†q¨üC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ì4>ÊB„GÛ³F6†q¨üSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number~£x-opt-locked-untilƒ`f¥š„SsÀ/ ¡ 103d6d7beae640c79e941947ccbd992a@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpz cº„V«eEJ½žL¹ËxiTA7ŸC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜%ÔgºOL>¹ËxiTA7ŸSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberŽ£x-opt-locked-untilƒ`f¥šâSsÀ/ ¡ aee65af05b504c3481f56954b89d32e5@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpŠ ˆ,­â• J²>þYdæXC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜­,ˆ•âJ ²>þYdæXSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥›SsÀ/ ¡ ec2a1e3003a9422fbabff3dbfe33b4fb@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp‹ ¾°{0ãEšÈc,*1?C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{°¾0EãšÈc,*1?SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥›SsÀ/ ¡ 741f860367344637841f6f6226a96001@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpŒ žHüa¸O¿'ˆå‹Œ?—C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜HžaüO¸¿'ˆå‹Œ?—SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number‘£x-opt-locked-untilƒ`f¥›SsÀ/ ¡ befb1bb17e2d4655ae84bb8d6d509b61@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ùýý¯±Ò-C¯<ËÆÉ[+C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯ýýùÒ±C-¯<ËÆÉ[+SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number’£x-opt-locked-untilƒ`f¥›SsÀ/ ¡ ff4c0a008be0404385b5974cf0c99d03@@@@@@@@@@@@Su  3Hey there! SÀ" RpŽ òÀoú?ÒOH“þ¼¦¼TáC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úoÀòÒ?HO“þ¼¦¼TáSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number“£x-opt-locked-untilƒ`f¥›SsÀ/ ¡ c81670e172944c54992de4ae11176c91@@@@@@@@@@@@Su  3Hi there! SÀ" Rp äW˜Å(I¦„ð3Ë€ !C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜WäŘI(¦„ð3Ë€ !SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number”£x-opt-locked-untilƒ`f¥›SsÀ/ ¡ 54fbc76e401c4551a5a0d9c542f720a4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ¶æ b¬fúAŒj«Ç;ŽC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜b æ¶f¬AúŒj«Ç;ŽSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number•£x-opt-locked-untilƒ`f¥›0SsÀ/ ¡ e3b863372d7a426f943dc7a5582ccc6f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp‘ `i|—„Ÿ?O‚ôPîUtC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜—|i`Ÿ„O?‚ôPîUtSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number–£x-opt-locked-untilƒ`f¥›0SsÀ/ ¡ eb588e300dd74e8e9d479ef183130fe0@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp’ ºWß:fOG±à<ÂÀ‹õC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ßWºf:GO±à<ÂÀ‹õSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number—£x-opt-locked-untilƒ`f¥›0SsÀ/ ¡ 8b3fe317f949466fb18100228c407d77@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp“ òºeSBÙGµ9d²N‡MNC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜SeºòÙBGµ9d²N‡MNSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number˜£x-opt-locked-untilƒ`f¥›0SsÀ/ ¡ bb3a673a3b134caf8a96696ce228e430@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp” <°ß˜)WNµbˆîL§Í!C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜˜ß°<)NWµbˆîL§Í!SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number™£x-opt-locked-untilƒ`f¥›0SsÀ/ ¡ dcd8c0faebf04fb2bfbdd9e9331b748a@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp•  ÂöüAµg@À¡„¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ öÂAüµg@À¡„¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberš£x-opt-locked-untilƒ`f¥›0SsÀ/ ¡ ea531afb4bb44a15b2593863a525ed47@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp– áØvñæï EŽm‰°6åZC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ñvØáïæE Žm‰°6åZSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number›£x-opt-locked-untilƒ`f¥›_SsÀ/ ¡ 3e67e9976b96429aa6174b6ada098b6d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp— s &û ›µE‡íÙ{$µ@C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜û& s› Eµ‡íÙ{$µ@SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberœ£x-opt-locked-untilƒ`f¥›_SsÀ/ ¡ 627866ec208242af82d6bfd48c4c4ff0@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp˜ ¥&×ÀOD” :üáþC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜×&¥ÀDO” :üáþSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥›_SsÀ/ ¡ c67878ee75b042239fcf7e60bbe1929d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp™ Áò#™ æLš± ÀZEöC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜™#òÁæ Lš± ÀZEöSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberž£x-opt-locked-untilƒ`f¥›_SsÀ/ ¡ 3d3d42229aa7416d9897547f229655c5@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpš …ÊK¯3N‹Û³«äûC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜KÊ…¯N3‹Û³«äûSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberŸ£x-opt-locked-untilƒ`f¥›_SsÀ/ ¡ a3b3dcf854f74fd2a6382315551b348a@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp› €ŸÛÿÙH®ÉNö3ïÃC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÛŸ€ÿHÙ®ÉNö3ïÃSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number £x-opt-locked-untilƒ`f¥›_SsÀ/ ¡ 67a8f31f8d83469eaed17924aec6e8af@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpœ ÿ4É©ÜF¤[É:Ο~C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜É4ÿ©Fܤ[É:Ο~SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number¡£x-opt-locked-untilƒ`f¥›ŽSsÀ/ ¡ 3987266543be466899991c95f9c17eff@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp Ž1ûÁ³ÆaFŸŸn¨uJ´C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Áû1ŽÆ³FaŸŸn¨uJ´SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number¢£x-opt-locked-untilƒ`f¥›ŽSsÀ/ ¡ 47d1c7817b8441e7a4087de6d53bd4eb@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpž DWæãvÒK‡u{0`‰C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãæWDÒvK‡u{0`‰SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number££x-opt-locked-untilƒ`f¥›ŽSsÀ/ ¡ 8a829ab613f3431baa9857420ea13745@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpŸ dÁ‡fÒöE³þnIh8C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‡ÁdÒfEö³þnIh8SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number¤£x-opt-locked-untilƒ`f¥›ŽSsÀ/ ¡ 20a3eaafc9684fd6b5d3357f5c0d7b89@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp  ÉðJÌK¾Xm‚Úq-C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜JðÉK̾Xm‚Úq-SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number¥£x-opt-locked-untilƒ`f¥›ŽSsÀ/ ¡ 5529940a42a346f890e503cd41c24fd1@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¡ «'úVHöA¸£*M[ÍC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ú'«HVAö¸£*M[ÍSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number¦£x-opt-locked-untilƒ`f¥›ŽSsÀ/ ¡ 70fb3afca044429b864c444c92913efc@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¢ ’ÊóÚêO+C¢9¥ß¾VÁBC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÚóÊ’OêC+¢9¥ß¾VÁBSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number§£x-opt-locked-untilƒ`f¥›½SsÀ/ ¡ 9974ed20260442daadbe9f8fde9c79a9@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp£ 4…Ì[[¢"K”Ç–‡óŸ ­C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜[Ì…4¢[K"”Ç–‡óŸ ­SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number¨£x-opt-locked-untilƒ`f¥›½SsÀ/ ¡ e84d3a3e21f24548ae127853bbaf4420@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¤ ƒ‡×XµñO…~D÷úª{C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜×‡ƒÂµXOñ…~D÷úª{SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number©£x-opt-locked-untilƒ`f¥›½SsÀ/ ¡ 6a9429751b0e414da5a331759411f2af@@@@@@@@@@@@Su  3Ho there! SÀ" Rp¥ §™ÎÏN¹EÂçÝ-ö¿C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Î™§NϹEÂçÝ-ö¿SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberª£x-opt-locked-untilƒ`f¥›½SsÀ/ ¡ 94e9255bd1164f1d8cad2c9ecabd3b86@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¦  [ÈçÁ?L«89DÝÌC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜È[ ÁçL?«89DÝÌSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number«£x-opt-locked-untilƒ`f¥›½SsÀ/ ¡ 6e1bac1c09324fce8be3992e75c4c778@@@@@@@@@@@@Su  3Hi there! SÀ" Rp§ —u X;ÿG•-›ØD³}šC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ u—;XGÿ•-›ØD³}šSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number¬£x-opt-locked-untilƒ`f¥›½SsÀ/ ¡ 9d2be5693189413e93059daf19d02989@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¨ ©ÿ0BdåC½~¯+ÓºC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜0ÿ©dBCå½~¯+ÓºSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number­£x-opt-locked-untilƒ`f¥›ëSsÀ/ ¡ 50bdb9ac3841450b8e6a4e6a5f99df08@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp© R³½14=B¼E´”œýfC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜1½³R4B=¼E´”œýfSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number®£x-opt-locked-untilƒ`f¥›ëSsÀ/ ¡ a67016f2338645a9a465a8bde168ad2d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpª ±‚.{”'nO·‹Ûõ“•®C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{.‚±'”On·‹Ûõ“•®SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number¯£x-opt-locked-untilƒ`f¥›ëSsÀ/ ¡ 48db03427d214061bfeab258f0880b26@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp« ›gç+ ó ›ƒO?Éy¿UC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ó +>› Oƒ?Éy¿USrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number´£x-opt-locked-untilƒ`f¥œSsÀ/ ¡ 7eab4a8759224a4a8ca0692bb337dc39@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp° ºÊÿW%G…ƒÀT ÝÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜WÿʺG%…ƒÀT ÝÞSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberµ£x-opt-locked-untilƒ`f¥œSsÀ/ ¡ 65e797113cbe4d35b5935e4c5e435e71@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp± m¸C®¼L­(õ ü¢¯÷C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜C¸m®L¼­(õ ü¢¯÷SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number¶£x-opt-locked-untilƒ`f¥œSsÀ/ ¡ 99d62b5845e94952b801454edcff8891@@@@@@@@@@@@Su  3Hey there! SÀ" Rp² ™´wZ=UF¤¥ðÞ«ÄX&C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜w´™=ZFU¤¥ðÞ«ÄX&SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number·£x-opt-locked-untilƒ`f¥œSsÀ/ ¡ 8a7109c078b34112814c186bd63856ec@@@@@@@@@@@@Su  3Hi there! SÀ" Rp³ ÆÏÇåáG’{ÉC4mÙ'C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÇÏÆåGá’{ÉC4mÙ'SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number¸£x-opt-locked-untilƒ`f¥œSsÀ/ ¡ a39ca947552347d09eb73e6dfdd802df@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp´ \ü™xoÒ|B‡\íin¢xC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜x™ü\ÒoB|‡\íin¢xSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number¹£x-opt-locked-untilƒ`f¥œ:SsÀ/ ¡ f46ea36f19c944e1af5c23c8d6a54727@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpµ gQ™%ÔH’jŠÑÈ_E¤C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜%™QgÔH’jŠÑÈ_E¤SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberº£x-opt-locked-untilƒ`f¥œ:SsÀ/ ¡ c844050f0f7e4905b6ef9cb2acc3d4a4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¶ ê $þÅFUÙŒ*]¦°C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ êþ$FÅUÙŒ*]¦°SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number»£x-opt-locked-untilƒ`f¥œ:SsÀ/ ¡ 4c0b096526b44fecb33f1921041a48e2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp· ·âÈá’DŒï¦CÜÝĶC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜â·áÈD’Œï¦CÜÝĶSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number¼£x-opt-locked-untilƒ`f¥œ:SsÀ/ ¡ e946fe08252941bf8f509dcd85027d4e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¸ vr…<ï·°L‡Øñ™øÊ»C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜<…rv·ïL°‡Øñ™øÊ»SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number½£x-opt-locked-untilƒ`f¥œ:SsÀ/ ¡ 5923daca681e45f79693fd1a6cba2e9d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¹ ¬Œ€á¿æBšZ^©NqC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜á€Œ¬¿BæšZ^©NqSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number¾£x-opt-locked-untilƒ`f¥œ:SsÀ/ ¡ 47d4ffda18d649738a239b5e855fc1c8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpº ìíÓ|;OõG‰Ã¶ÅP²h¼C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜|ÓíìO;Gõ‰Ã¶ÅP²h¼SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number¿£x-opt-locked-untilƒ`f¥œiSsÀ/ ¡ b8872c4b528f4746b37575e4dcf7aa2a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp» ŽíøÏsU2Jµ­#u0@ŽC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÏøíŽUsJ2µ­#u0@ŽSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberÀ£x-opt-locked-untilƒ`f¥œiSsÀ/ ¡ 6cf261d4b1b94949b05b8ee13dfa098d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¼ æÕ’žJ:M˜£?} ÊšSC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜’ÕæJžM:˜£?} ÊšSSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberÁ£x-opt-locked-untilƒ`f¥œiSsÀ/ ¡ 25bf09a3dcdf4676af5672a35203516e@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp½ a+´âÝÓ~E†ÍC/>P„ÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜â´+aÓÝE~†ÍC/>P„ÕSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥œiSsÀ/ ¡ 607a88da74a34bc19e01c80a75a4df31@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¾ K~ŒÙÏÉA—@wÆqqÅC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Œ~KÏÙAÉ—@wÆqqÅSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberãx-opt-locked-untilƒ`f¥œiSsÀ/ ¡ 250aa65ab3c94ff3ad78960b54bbd3ff@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¿ ¥n‹‘ÒórC‹5ŽdKT_I§h Ю:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ûÂ>I_§h Ю:SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberÚ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 479dbdabf6724b3da4b3150d09dfaae7@@@@@@@@@@@@Su  3Hey there! SÀ" RpÖ .ò25Äù~K„¶»¿•¾žkC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜52ò.ùÄK~„¶»¿•¾žkSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberÛ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 55844ba355fa489f88a13a369c9e6912@@@@@@@@@@@@Su  3Hi there! SÀ" Rp× 1üP¿MG‡¾å9¡ŒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¿Pü1MG‡¾å9¡ŒSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberÜ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 920048d665cd45cdb7c52d87193d5855@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpØ S’úN£­Ü@©­K—gäH@C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Nú’S­£@Ü©­K—gäH@SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberÝ£x-opt-locked-untilƒ`f¥SSsÀ/ ¡ fafe6722c34942a3ae308b5e74fade12@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÙ /Ü¢œþQF›îÖø/]C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜œ¢Ü/þFQ›îÖø/]SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberÞ£x-opt-locked-untilƒ`f¥SSsÀ/ ¡ daf6ff0a02a84cfe8f9e4bbf3efaaed2@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÚ <[jS‡VE¨üߧƃŸŽC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Sj[<‡EV¨üߧƃŸŽSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberߣx-opt-locked-untilƒ`f¥SSsÀ/ ¡ f119f61414c84ab588d713ffa9fc2420@@@@@@@@@@@@Su  3Ho there! SÀ" RpÛ °"u:¡ŽK¢"ZÕÑ´›C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜u"°¡:KŽ¢"ZÕÑ´›SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberà£x-opt-locked-untilƒ`f¥SSsÀ/ ¡ 7e9601209c494d0baf237db16b72f28f@@@@@@@@@@@@Su  3Hey there! SÀ" RpÜ ×<Íê©G¶\Û {òPZC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Í<שêG¶\Û {òPZSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberá£x-opt-locked-untilƒ`f¥SSsÀ/ ¡ a73beb4a8844529e70f90f9ffbe6de5456ad87a42e-8000066400000000000000000000001441454613650200352530ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿×½ÿ¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUB{XfLCB@Pq(À ¡/test@@@@@@@c@@@@@C€W@@@3c7f0fe664c05f6c8dabdaec135760221902e813-1000066400000000000000000000015241454613650200350460ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-numbergolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/4.bin000066400000000000000000000001071454613650200302460ustar00rootroot00000000000000GSÀ: ¡$83a29bedd884468ba2e37f3017eeab1d_G29@p`p©€@@@@@42e16fc885d17d82470cb6aa50823b51a06da37b-7000066400000000000000000000001441454613650200347650ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿ï½¿ï€½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUBrXfdwCB@PQ(À ¡/test@@@@@@@@@@@@@C€W@@@43000b19e1803c78e4ffae5d506d5445986b48cc-12000066400000000000000000000001441454613650200350030ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿×½SÀÿ¿ï½¿ï½¿ï½¿ïソソ`ÿÿ{XfLCB€test@@@@€test@@P€(À ¡/@@@@@€€439cc9b3273c6c2995ada1f14da96513beb0af58-4000066400000000000000000000023371454613650200351450ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusRSPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT ncodingWelcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC ="utf-8"?> Hi mate, how are you?SPLIT 43f0eae24cefab820c1128fdde06a2f73248d7fe-13000066400000000000000000000001441454613650200354260ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusd#SÀW¡(pqa½Ûñ½¿½Ûñ½¿½¿ï%¿½Jð¿¿ñ½½€ñ¿ñº¿ñ½½ñ½¿½ÛCB@PS(À ¡/test@@@@@@@@@@@@@C€€@@@44ae0093c65c7afdc8a0170c856c62f10de61a44-8000066400000000000000000000005201454613650200350420ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pq�ڼ��qï¿PSPLITHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@44d0a23a3b2c763f30517cb60db8366f8a2daad3-16000066400000000000000000000005201454613650200351700ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb560e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqï½ڼ﬽Ó½qï½W﬽ӿ½qï˽éÄ��ހdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@4524c782aa10b39fa57e8aa1c7c7f481d3c4ef98-6000066400000000000000000000000771454613650200351550ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³MS  SPLAIN ANONtMOYS"  Uf455504c4cd8841a19eeb9bd216b5da3a35717cc3-11000066400000000000000000000005201454613650200351230ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaaÿ½ vzÿÿQrˆ@Þ¿½HVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@4664647c32c509e60ee8d438d62792b05fdd125e-12000066400000000000000000000001441454613650200347330ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿ï½ß¿ï½¿ï½¿ï½¿ïÿÿÿ€½¿ï½¿ï½¿BrXfdwCB@P`S(À ¡/test`@@@`@@@@@@`@C@@`S@@@@`@468725911ff45b555730087f2d66853fd7b62cce-12000066400000000000000000000005201454613650200346630ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e114eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT  SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿ï½ï½¿ï½¿ï¿ï½¿ï½¿ïexeUB VfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@46e7480c0e6f5b33ac814248aee775d86ce89acf-5000066400000000000000000000000771454613650200351710ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³MSSBCBÓPLAIÎ ANS@YMOUÊ"utfPQòØ471c0d9985aed622b6bb426a6f08b70abdaf486b-6000066400000000000000000000001441454613650200352160ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ï½¿ï%UeXhØ¿½J𿽀ǽDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@4759a0f9fb7f74d9c3845e3685bc6b02e02e87df-7000066400000000000000000000001331454613650200351130ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus[S@À2à/#£MSSBCBSPLAIN ANONYMOUSb520e114eaa9a0bcad796d3e988_G0@p47968bfa23ca001b74862e0b31d6b91fb4de6ea6-12000066400000000000000000000005201454613650200352050ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqa€½ vzÿÿQrˆ@Þ¿½HVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@486a3a7b8abc12095aa89d20bbc8d6b4b178d5be-9000066400000000000000000000005201454613650200352720ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pq�ڼ��qï¿PS��;��ހdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@498beec6aaf9d7b3d1eafb46f6f4ed08c71f5e75-4000066400000000000000000000025671454613650200355570ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusSPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT @StÁ8¡ MachineName¡WINasn1: structure error: -37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-loc{ed-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC ="utf-8"?> Hi mate, how are you?SPLIT 4a471ff0b4a5cb9447f88573873cd44ed7a10aa1-5000066400000000000000000000000771454613650200350650ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³MSSBèÓPLAIÎ ANS@YMOUÊ"utfPQòØ4adb19fbae69dc2c959b8099f6e81d85dbb75220-10000066400000000000000000000001441454613650200353170ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusd#SÀW¡(pqa½Ûñ½¿ï%½Ûñ½¿ï%¿½Jð¿¿ñ½½Ûñ¿ñº¿ñ½½Ûñ½¿wCB@PS(À ¡/test@@@@@@@@@@@@@C€€@@@4b1b1991281939848ea232af98642c2c10aec411-11000066400000000000000000000005201454613650200346240ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e114eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ï½¿ï½ï½¿ï½¿ï¿ï½¿ï½¿ïexeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@4b3901b740e435e29a30a3934af3ed25e984e908-12000066400000000000000000000005201454613650200347160ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿ï½ñ½¿ñ½¿ï¿ñ½¿ï½¿ïexeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@4b7669b2d084f3a83c929b84e70587d7f60227a5-12000066400000000000000000000005201454613650200346630ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿ï½ï½¿ï½¿ï¿ï½¿ï½¿ïexeUBrVfäwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@4c6f7b98063212e75f72df39df85a9c4c1368568-12000066400000000000000000000003671454613650200347650ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusSSSPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SP`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿4c7425ac0947722b0044753621e0f031094eb30e-7000066400000000000000000000000771454613650200343770ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³MS PLAIN A YS" Uf4e560a0720f3bb9af595f25fe5a11d825c07d270-14000066400000000000000000000005201454613650200350450ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e114eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`Rp½ˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/¿ñ½¿ï½ï½@ï½Ûï¿ï½[]½¿ïexeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@4e9cf8513631796135932211e1213df139582d10-5000066400000000000000000000005201454613650200342530ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT deSÀpqaJaBRgAvzLXqzRrrU0Yv¡IujoptYjxeUBrVfdwCB8PS(À ¡/test@@@@@@@@@@@@@C€@@@golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/5.bin000066400000000000000000000000371454613650200302510ustar00rootroot00000000000000SÀ`RpˆRRÿ@@@50bd39da8164c546e096ee32913f7136fd372792-4000066400000000000000000000000771454613650200346030ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³MSSBCBSPLAIN ANS@YMOUS"utfPQòØ530fe9145da243e0736189e40c0a379922c75f93-13000066400000000000000000000005201454613650200345650ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaaÿÿÿQˆ@Þ¿½HVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@5328b6ce74535601bd4704458a7a567cbb6d718f-3000066400000000000000000000000771454613650200346530ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³MSSBCBSYLAIN AAIN AEXTERNAL537dc8f98850c453b4aa9730a525c1cd5f02364d-6000066400000000000000000000000771454613650200347270ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?AS@À2à/³ CBSYLIN  AE L53a4f692661bbd9ddbd1aad24042971fb80248e8-14000066400000000000000000000003461454613650200351420ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpáˆRR?C@@53f65f8da27ec6a98397dff6c1f9a0e501932849-8000066400000000000000000000000771454613650200350470ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À5à/³"CBSPLAIN A"S" A"556272a6e5ce872670537252d63870ef2e6e7e9e-2000066400000000000000000000001071454613650200346100ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSYLAIN ANONYMOUSEXTERNAL556bd681846d6d6b89c87f1601ea6904d115b5cb-15000066400000000000000000000003461454613650200350220ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`@RpáˆRRÿ@@@562e445ec72bb66afb9f257d7bb955614a04466d-7000066400000000000000000000005201454613650200350130ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJa ¿½ vzLXqzR��?�DpH€jxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@56516e7ae31bee40748844feeb20f9da8c7c0423-7000066400000000000000000000001331454613650200350650ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus[S@À2à/ÿ€MSSBCBSPLAIN ANONYMOUSb520e114eaa9a0bcad796d3e988_G0@p5697426e22762a92e37f37078c8bb0f0477b3ffc-9000066400000000000000000000001441454613650200346670ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿ï½¿ï€½¿ï½¿ïº¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUBrXfdwCB@PQ(À ¡test@@@@@@@T@@@Q(@@C€W56ecefd28d7ad7a5829cce9d0050efe0fdaa1fa6-11000066400000000000000000000001441454613650200356570ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(p߽¿ï½SÀW¡(p߽¿ï½¿ïCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@57b1d5928d4a9bd3d9f450b5c794307255af84c9-6000066400000000000000000000005201454613650200347430ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJa ¿½ vzLXqzRrrUIYvaIujDpH€jxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@58182b94f70d0f86dcf5e672136cc59c2a55747c-4000066400000000000000000000000201454613650200347340ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPAMQP598429cc8d450b23fe96dda61e62eb060e99eab0-1000066400000000000000000000034071454613650200351520ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-f1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR ”äYÃ?–?AƒÕðÔž‰6÷C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nlH£x-opt-sequence-number™£x-opt-locked-untilƒ[£ná‡SsÀH ¡$f5b39d65-785d-4f40-8106-52c089dab354@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[áISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P SPLIT 5c71d9bd9be4a3f0f94dcb37d5a36f1a640d1cf9-5000066400000000000000000000001651454613650200353650ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP[S@À2à/³MSSBCBSPLAIW ANONYMOUSEXTPLIT uSDÀ#P à/³lcome!SPLIT AMQPSP5efb9902326af0a758f7d7bc770a9dc55a16a318-11000066400000000000000000000005201454613650200351420ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pq�ڼ��qï½W���;��ހdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@5f07a0e3345ddf703ba686a98be46eb1a7b6631d-5000066400000000000000000000013171454613650200351410ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJa ¿½ vzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number@@@x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb7-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineNamÿ`@��U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/6.bin000066400000000000000000000001441454613650200302510ustar00rootroot00000000000000dSÀW¡(oJnNPGsiuzytMOJPatwtPilfsfykSBGplhxtxVSGCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@6063cbf032af3217dd4ba63fc583a5920137f3ae-2000066400000000000000000000000071454613650200350310ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusSSBCBS606d93189878bddbd42f2f7191d9bda2be72dd04-4000066400000000000000000000001441454613650200351530ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ï½?ïÚªšÎ1½¿ïrUIY½¿ï½¿ï½¿ï½¿ïUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@61e6c13531178604365c017e9b3959c7918f72bc-12000066400000000000000000000005201454613650200345120ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿ï½ñ½¿ï½¿ï¿ï½¿ï½¿ïexeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@62b56d57eccac8f46db7a97478feafd120744a72-5000066400000000000000000000013171454613650200352410ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJa ¿½ vzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-time[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName@WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?63a689195ed4f2378d5d823dfec0df5040c81577-16000066400000000000000000000005201454613650200350240ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT ìSDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e114eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT  SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(p ½¿ï/ VfdwC½ ソソ ¿ï½¿ï½¿ïexeUB VfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@63c2db9b962b434627ec60155ecac367eb5ebe95-19000066400000000000000000000005201454613650200352310ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb560e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqï½ڼ﬽Ó½qï½W﬽Ó½qï˽;ï½ï½ހdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@6419df74819f079b8db624c5271858683f04aa48-13000066400000000000000000000005201454613650200346110ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqa€½ vzÿÿQrˆ@Þ¿½H VfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@64da57ef6a02510d0233f6ce89cdb12b0ebdfd52-1000066400000000000000000000023641454613650200352610ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@@@@SPLIT cked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT 650b8b3ab420afcb575879aad0e0f05a43fe9f74-12000066400000000000000000000005201454613650200352660ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿ï½ñ½¿ñ½¿ï¿ñ½¿ñ½¿ïexeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@65b3874e693b135ac49a9230f21a1cf2030719d1-3000066400000000000000000000013171454613650200345440ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@AUpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£-opt-sequence-number–£x-opt-locked-untlƒ[£nßSÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ3¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?z667151551ca4413bbcb41b02eec285af5275c8d5-5000066400000000000000000000000771454613650200347650ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³MSSBCBÓPLAIN ANS@YMOUÊ"utfPQòØ66892dbbc150b44b4f28a2058b10e2967791110d-8000066400000000000000000000000771454613650200345560ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus? fS@À2à/³MS PLAIN AN  YS"  f679432600f030846401d896d3de1f9159731c710-15000066400000000000000000000001231454613650200343420ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusSSSSPLIT SSSSPLIT @P`W(À ¡SÀ`Rp USSSSSSSSEXTERNALSPLIT ÿÿP`680490296fdf052500a1075f0c3107595c0a86f8-13000066400000000000000000000003461454613650200344770ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6aS@À2à/³Sa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT áS@`RpˆRRÿ@@@686e7df71b99dd5c41c42f2a0eac26abd2f81cdf-15000066400000000000000000000001351454613650200355230ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus]SÀ¡(p½¿ï½ß¿ï½¿ï½¿ï½¿ïÿÿÿ€½¿ï½¿ï½¿BrXfdw`@CB@P`S(À ¡/test`@@@`€@@@@@pBrX6b8583870d49f8b4a4f0dd40e44890bd9fd94ce5000066400000000000000000000025541454613650200347600ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT GSÀ: ¡$bf1fc6cfef4149b6b1799f6989662b34_G42@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ‚SÀu¡(MMmvYmaFEjLgSvndTeranxGMNCcCdlEBYqxqrgAiCAP@@S)À0¡'integration-receive-5577006791947779410@@@@@@@@@€@@@SPLIT #SÀ CpˆRRCCpèC@B@SPLIT ‡SÀz¡(eJuFVZUsgPmweLRmsdTIwtLUDqoBSNtPRViLXLCrRB@PS(À4 ¡'integration-receive-5577006791947779410@@@@@@@@@@@@@C€@@@SPLIT SÀCA@SPLIT SÀ RC žO#ÉúC­>¹ ü;ÙðC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#OžÉCú­>¹ ü;ÙðSrÁU£x-opt-enqueued-timeƒ`f¤~R£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥háSsÀ/ ¡ cebbd2d485bf4218a9f9d4ac1e0bc82e@@@@@@@@@@@@Su  2Hey there!SÀ RR A÷³ˆú€ðAˆ xî[½ñC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ˆ³÷A€úAðˆ xî[½ñSrÁU£x-opt-enqueued-timeƒ`f¤~R£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥háSsÀ/ ¡ 19c5f419a07f4615a618b179e38f39fb@@@@@@@@@@@@Su  2Hi thSPLIT ere!SÀ RR óÿ-siC¯*˜°óØC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜-ÿósCi¯*˜°óØSrÁU£x-opt-enqueued-timeƒ`f¤~R£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥háSsÀ/ ¡ f4f9e187b6984c7d82a195307a17f377@@@@@@@@@@@@Su  2Ho there!SPLIT SÀRA@6c98b1614e66edd69bdc5240bf261fa25bd1cc16-11000066400000000000000000000000771454613650200352750ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?AS@À2à/³ääYLIN "êMMOYS"ää6cc3a087a07c713fd35540070a2acb5eba87058e-3000066400000000000000000000001441454613650200350330ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ï½¿ï%Ue11½¿ïrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/FSÀ9 ¡#cc6abb520e114eaa96cd56f15132a8785204f911b9afe47ec20d10ad3-2000066400000000000000000000001571454613650200347670ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusXTERNA?SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT !SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT 6d1c9fba598a3f8690e98a8792317f8396fdb875-15000066400000000000000000000005201454613650200350610ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb560e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqï½ڼ﬽ӿ½qï½W﬽ӿ½qï˽;��ހdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@6e1bab969f17880756c4e7974a49738e9bb1cae6-16000066400000000000000000000005201454613650200351210ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb560e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqï½ڼ﬽Ó½qï½W﬽ӿ½qï˽;��ހdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@6e4766610fbb9e353dbf899f4099d2c9b76da9f9-5000066400000000000000000000001441454613650200351330ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ï½¿ï%UeXhØ¿½Jð¿½ïǽDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@6f68750ff79a6ef42acc336dbed863c87c0616a9-8000066400000000000000000000001431454613650200351720ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP[S@À2à/²ñMSa0bcad7SPLAIW ANONYMOUSb520e114eaa9a0bcad796d3e988_G0@pgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/7.bin000066400000000000000000000005711454613650200302560ustar00rootroot00000000000000ySÀ CC F>Æ\&úEœ¨Žçƒã;C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[œ_)Ñ£x-opt-sequence-numberx£x-opt-locked-untilƒ[œ_ŸSsÀH ¡$5e84053f-81c9-49fc-ae42-ff0ab353d998@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?70315ef06d85af0e46e498e82e00014f5a7accb0-7000066400000000000000000000001441454613650200350500ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ïÄ¿ï%UeXhØ¿½JðǽïǽDpHYjxeUBrVfdCB@PS(À ¡/test@@@@@@@@@@@@@C€w@@@70db9fead22a5e770997eb60fed1cb1e1e47c14f-16000066400000000000000000000005201454613650200354420ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿951_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿½¿ñ½¿¿ï½¿ñ¿½¿ñ½¿½ïexeUBrVfäØCB@PS(À ¡st@@@@@@@@@@@@@b@@SÀ9 @71fc1e23c9155df82a2d13783dbb858528ae318c-5000066400000000000000000000013171454613650200350070ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJa ¿½ vzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName@WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?727f7777c11572c4b3fbb98e841a9de8b8efcef3-2000066400000000000000000010043441454613650200352620ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusSPLIT ERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT GSÀ: ¡$3d9065c2239c48f88056bcfdd3334d81_G41@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ‚SÀu¡(zjrRNLRzGpzDszPvweGxRQcoxpAQxuFkaowCKoRcCAP@@S)À0¡'integration-receive-5577006791947779410@@@@@@@@@€@@@SPLIT #SÀ CpˆRRCCpèC@B@SPLIT ‡SÀz¡(cTyTJHeKKokJNwUaqKCBRxMSdypnuVQlXTxlLUfRRB@PS(À4 ¡'integration-receive-5577006791947779410@@@@@@@@@@@@@C€@@@SPLIT SÀ AR@AS$E@SÀ AR@AS$E@SÀ AC@AS$E@SÀ AR@AS$E@SÀ AR!@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR @AS$E@SÀ AR @AS$E@SÀ AR @AS$E@SÀ AR @AS$E@SÀ AR @AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SPLIT SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR @AS$E@SÀ AR"@AS$E@SÀ AR#@AS$E@SÀ AR$@AS$E@SÀ AR%@AS$E@SÀ AR&@AS$E@SÀ AR'@AS$E@SÀ AR(@AS$E@SÀ AR)@AS$E@SÀ AR*@AS$E@SÀ AR+@AS$E@SPLIT SÀ AR,@AS$E@SÀ AR.@AS$E@SÀ AR/@AS$E@SÀ AR-@AS$E@SÀ AR;@AS$E@SÀ AR0@AS$E@SÀ AR1@AS$E@SÀ AR2@AS$E@SÀ AR3@AS$E@SÀ AR4@AS$E@SÀ AR5@AS$E@SÀ AR6@AS$E@SÀ AR7@AS$E@SÀ AR8@AS$E@SÀ AR9@AS$E@SÀ AR:@AS$E@SÀ ARX@AS$E@SÀ ARY@AS$E@SÀ ARZ@AS$E@SÀ AR[@AS$E@SÀ AR\@AS$E@SÀ AR]@AS$E@SÀ AR^@AS$E@SÀ AR_@AS$E@SÀ AR`@AS$E@SÀ ARa@AS$E@SÀ ARb@AS$E@SÀ ARc@AS$E@SÀ ARd@AS$E@SÀ ARe@AS$E@SÀ ARf@AS$E@SÀ ARg@AS$E@SÀ ARh@AS$E@SÀ AR<@AS$E@SÀ AR=@AS$E@SÀ AR>@AS$E@SÀ AR?@AS$E@SÀ AR@@AS$E@SÀ ARA@AS$E@SÀ ARB@AS$E@SÀ ARC@AS$E@SÀ ARD@AS$E@SÀ ARE@AS$E@SÀ ARF@AS$E@SÀ ARG@AS$E@SÀ ARH@AS$E@SÀ ARI@AS$E@SÀ ARJ@AS$E@SÀ ARK@AS$E@SÀ ARL@AS$E@SÀ ARM@AS$E@SÀ ARN@AS$E@SÀ ARO@AS$E@SÀ ARP@AS$E@SÀ ARQ@AS$E@SÀ ARR@AS$E@%SÀ RypsRRCRypÓC@B@SÀ ARS@AS$E@SÀ ART@AS$E@SÀ ARU@AS$E@SÀ ARV@AS$E@SÀ ARW@AS$E@SÀ ARi@AS$E@SSPLIT À ARj@AS$E@SÀ ARk@AS$E@SÀ ARl@AS$E@SÀ ARm@AS$E@SÀ ARn@AS$E@SÀ ARo@AS$E@SÀ ARp@AS$E@SÀ ARq@AS$E@SÀ ARr@AS$E@SÀ ARs@AS$E@SÀ ARt@AS$E@SÀ ARu@AS$E@SÀ ARv@AS$E@SÀ ARw@AS$E@SÀ ARx@AS$E@SPLIT SÀ AR|@AS$E@SÀ AR{@AS$E@SÀ ARy@AS$E@SÀ ARz@AS$E@SÀ ARÝ@AS$E@SÀ ARÞ@AS$E@SÀ ARß@AS$E@SÀ ARÓ@AS$E@SÀ ARÔ@AS$E@SÀ ARÕ@AS$E@SÀ ARÖ@AS$E@SÀ AR×@AS$E@SÀ ARØ@AS$E@SÀ ARÙ@AS$E@SÀ ARÚ@AS$E@SÀ ARÛ@AS$E@SÀ ARÜ@AS$E@SÀ AR»@AS$E@SÀ AR¼@AS$E@SÀ AR½@AS$E@SÀ AR¾@AS$E@SÀ AR¿@AS$E@SÀ ARÀ@AS$E@SÀ ARÁ@AS$E@SÀ ARÂ@AS$E@SÀ ARÃ@AS$E@SÀ ARÄ@AS$E@SÀ ARÅ@AS$E@SÀ ARÆ@AS$E@SÀ ARÇ@AS$E@SÀ ARÈ@AS$E@SÀ ARÉ@AS$E@SÀ ARÊ@AS$E@SÀ ARË@AS$E@SÀ ARÌ@AS$E@SÀ ARÍ@AS$E@SÀ ARÎ@AS$E@SÀ ARÏ@AS$E@SÀ ARÐ@AS$E@SÀ ARÑ@AS$E@SÀ ARÒ@AS$E@SÀ AR}@AS$E@SÀ AR~@AS$E@SÀ AR@AS$E@SÀ AR€@AS$E@SÀ AR@AS$E@SÀ AR‚@AS$E@SÀ ARƒ@AS$E@SÀ AR„@AS$E@SÀ AR…@AS$E@SÀ AR†@AS$E@SÀ AR‡@AS$E@SÀ ARˆ@AS$E@SÀ AR‰@AS$E@SÀ ARŠ@AS$E@SÀ AR‹@AS$E@SÀ ARŒ@AS$E@SÀ AR@AS$E@SÀ ARŽ@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR‘@AS$E@SÀ AR’@AS$E@SÀ AR“@AS$E@SPLIT SÀ AR”@AS$E@SÀ AR•@AS$E@SÀ AR–@AS$E@SÀ AR—@AS$E@SÀ AR˜@AS$E@SÀ AR™@AS$E@SÀ ARš@AS$E@SÀ AR›@AS$E@SÀ ARœ@AS$E@SÀ AR@AS$E@SÀ ARž@AS$E@SÀ ARŸ@AS$E@SÀ AR @AS$E@SÀ AR¡@AS$E@SÀ AR¢@AS$E@+SÀ p p0RRCp pC@B@SÀ AR£@AS$E@SÀ AR¤@AS$E@SÀ AR¥@AS$E@SÀ AR¦@AS$E@SÀ AR§@AS$E@SÀ AR¨@AS$E@SÀ AR©@AS$E@SÀ ARª@AS$E@SÀ AR«@AS$E@SÀ AR¬@AS$E@SÀ AR­@AS$E@SÀ AR®@AS$E@SÀ AR¯@AS$E@SÀ AR°@AS$E@SÀ AR±@AS$E@SÀ AR²@AS$E@SÀ AR³@AS$E@SÀ AR´@AS$E@SÀ ARµ@AS$E@SÀ AR¶@AS$E@SÀ AR·@AS$E@SÀ AR¸@AS$E@SÀ AR¹@AS$E@SÀ ARº@AS$E@SÀ ARà@AS$E@SÀ ARá@AS$E@SÀ ARâ@AS$E@SÀ ARã@AS$E@SÀ ARä@AS$E@SÀ ARå@AS$E@SÀ ARæ@AS$E@SÀ ARç@AS$E@SÀ ARè@AS$E@SÀ ARé@AS$E@SÀ ARê@AS$E@SÀ ARë@AS$E@SÀ ARì@AS$E@SÀ ARí@AS$E@SÀ ARî@AS$E@SÀ ARï@AS$E@SÀ ARð@AS$E@SÀ ARñ@AS$E@SÀ ARò@AS$E@SÀ ARó@AS$E@SÀ ARô@AS$E@SÀ ARõ@AS$E@SÀ ARö@AS$E@SPLIT SÀ AR÷@AS$E@SÀ ARø@AS$E@SÀ ARù@AS$E@SÀ ARú@AS$E@SÀ ARû@AS$E@SÀ ARü@AS$E@SÀ ARý@AS$E@SÀ ARþ@AS$E@SÀ ARÿ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SPLIT SÀAp!@AS$E@SÀAp"@AS$E@SÀAp @AS$E@SÀAp#@AS$E@SÀApx@AS$E@SÀApy@AS$E@SÀApz@AS$E@SÀAp{@AS$E@SÀApo@AS$E@SÀApp@AS$E@SÀApq@AS$E@SÀApr@AS$E@+SÀ p´pRRCp±pcC@B@SÀAps@AS$E@SÀApt@AS$E@SÀApu@AS$E@SÀApv@AS$E@SÀApw@AS$E@SÀAp$@AS$E@SÀAp%@AS$E@SÀAp&@AS$E@SÀAp'@AS$E@SÀAp(@AS$E@SÀAp)@AS$E@SÀAp*@AS$E@SÀAp+@AS$E@SÀAp,@AS$E@SÀAp-@AS$E@SÀAp.@AS$E@SÀAp/@AS$E@SÀAp0@AS$E@SÀAp1@AS$E@SÀAp2@AS$E@SÀAp3@AS$E@SÀAp4@AS$E@SÀAp5@AS$E@SÀAp6@AS$E@SÀAp7@AS$E@SÀAp8@AS$E@SÀAp9@AS$E@SÀAp:@AS$E@SÀAp;@AS$E@SÀAp<@AS$E@SÀAp=@AS$E@SÀAp>@AS$E@SÀAp?@AS$E@SÀAp@@AS$E@SÀApA@AS$E@SÀApB@AS$E@SÀApC@AS$E@SÀApD@AS$E@SÀApE@AS$E@SÀApF@AS$E@SÀApG@AS$E@SÀApH@AS$E@SÀApI@AS$E@SPLIT SÀApJ@AS$E@SÀApK@AS$E@SÀApL@AS$E@SÀApM@AS$E@SÀApN@AS$E@SÀApO@AS$E@SÀApP@AS$E@SÀApQ@AS$E@SÀApR@AS$E@SÀApS@AS$E@SÀApT@AS$E@SÀApU@AS$E@SÀApV@AS$E@SÀApW@AS$E@SÀApX@AS$E@SÀApY@AS$E@SÀApZ@AS$E@SÀAp[@AS$E@SÀAp\@AS$E@SÀAp]@AS$E@SÀAp^@AS$E@SÀAp_@AS$E@SÀAp`@AS$E@SÀApa@AS$E@SÀApb@AS$E@SÀApc@AS$E@SÀApd@AS$E@SÀApe@AS$E@SÀApf@AS$E@SÀApg@AS$E@SÀAph@AS$E@SÀApi@AS$E@SÀApj@AS$E@SÀApk@AS$E@SÀApl@AS$E@SÀApm@AS$E@SÀApn@AS$E@SÀApÜ@AS$E@SÀApÝ@AS$E@SÀApÞ@AS$E@SÀApß@AS$E@SÀApÃ@AS$E@SÀApÄ@AS$E@SÀApÅ@AS$E@SÀApÆ@AS$E@SÀApÇ@AS$E@SÀApÈ@AS$E@SÀApÉ@AS$E@SÀApÊ@AS$E@SÀApË@AS$E@SÀApÌ@AS$E@SÀApÍ@AS$E@SÀApÎ@AS$E@SÀApÏ@AS$E@SÀApÐ@AS$E@SÀApÑ@AS$E@SÀApÒ@AS$E@+SPLIT SÀ ppp¨RRCpppC@B@SÀApÓ@AS$E@SÀApÔ@AS$E@SÀApÕ@AS$E@SÀApÖ@AS$E@SÀAp×@AS$E@SÀApØ@AS$E@SÀApÙ@AS$E@SÀApÚ@AS$E@SÀApÛ@AS$E@SÀAp|@AS$E@SÀAp°@AS$E@SÀAp}@AS$E@SÀAp±@AS$E@SÀAp~@AS$E@SÀAp²@AS$E@SÀAp³@AS$E@SÀAp@AS$E@SÀAp´@AS$E@SÀAp€@AS$E@SÀApµ@AS$E@SÀAp¶@AS$E@SÀAp·@AS$E@SÀAp¸@AS$E@SÀAp¹@AS$E@SÀApº@AS$E@SÀAp»@AS$E@SÀAp¼@AS$E@SÀAp½@AS$E@SÀAp¾@AS$E@SÀAp¿@AS$E@SÀApÀ@AS$E@SÀApÁ@AS$E@SÀApÂ@AS$E@SÀAp@AS$E@SÀAp‚@AS$E@SÀApƒ@AS$E@SÀAp„@AS$E@SÀAp…@AS$E@SÀAp†@AS$E@SÀAp‡@AS$E@SÀApˆ@AS$E@SÀAp‰@AS$E@SÀApŠ@AS$E@SÀAp‹@AS$E@SÀApŒ@AS$E@SÀAp@AS$E@SÀApŽ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp‘@AS$E@SÀAp’@AS$E@SÀAp“@AS$E@SÀAp”@AS$E@SÀAp•@AS$E@SÀAp–@AS$E@SPLIT SÀAp—@AS$E@SÀAp˜@AS$E@SÀAp™@AS$E@SÀApš@AS$E@SÀAp›@AS$E@SÀApœ@AS$E@SÀAp@AS$E@SÀApž@AS$E@SÀApŸ@AS$E@SÀAp @AS$E@SÀAp¡@AS$E@SÀAp¢@AS$E@SÀAp£@AS$E@SÀAp¤@AS$E@SÀAp¥@AS$E@SÀAp¦@AS$E@SÀAp§@AS$E@SÀAp¨@AS$E@SÀAp©@AS$E@SÀApª@AS$E@SÀAp«@AS$E@SÀAp¬@AS$E@SÀAp­@AS$E@SÀAp®@AS$E@SÀAp¯@AS$E@SPLIT SÀAp|@AS$E@SÀAp}@AS$E@SÀApa@AS$E@SÀApb@AS$E@SÀApc@AS$E@SÀApd@AS$E@SÀApe@AS$E@SÀApf@AS$E@SÀApg@AS$E@SÀAph@AS$E@SÀApi@AS$E@SÀApj@AS$E@SÀApk@AS$E@SÀApl@AS$E@SÀApm@AS$E@SÀApn@AS$E@SÀApo@AS$E@SÀApp@AS$E@SÀApq@AS$E@SÀApr@AS$E@+SÀ ppmRRCp pÑC@B@SÀAps@AS$E@SÀApt@AS$E@SÀApu@AS$E@SÀApv@AS$E@SÀApw@AS$E@SÀApx@AS$E@SÀApy@AS$E@SÀApz@AS$E@SÀAp{@AS$E@SÀAp~@AS$E@SÀAp@AS$E@SÀAp€@AS$E@SÀAp@AS$E@SÀAp‚@AS$E@SÀApƒ@AS$E@SÀAp„@AS$E@SÀAp…@AS$E@SÀAp†@AS$E@SÀAp®@AS$E@SÀAp‡@AS$E@SÀApˆ@AS$E@SÀAp‰@AS$E@SÀApŠ@AS$E@SÀAp‹@AS$E@SÀApŒ@AS$E@SÀAp@AS$E@SÀApŽ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp‘@AS$E@SÀAp’@AS$E@SÀAp“@AS$E@SÀAp”@AS$E@SÀAp•@AS$E@SÀAp–@AS$E@SPLIT SÀAp—@AS$E@SÀAp¯@AS$E@SÀAp˜@AS$E@SÀAp™@AS$E@SÀApš@AS$E@SÀAp›@AS$E@SÀApœ@AS$E@SÀAp@AS$E@SÀApž@AS$E@SÀApŸ@AS$E@SÀAp @AS$E@SÀAp¡@AS$E@SÀAp¢@AS$E@SÀAp£@AS$E@SÀAp¤@AS$E@SÀAp¥@AS$E@SÀAp¦@AS$E@SÀAp§@AS$E@SÀAp¨@AS$E@SÀAp©@AS$E@SÀApª@AS$E@SÀAp«@AS$E@SÀAp¬@AS$E@SÀAp­@AS$E@SÀAp°@AS$E@SÀAp±@AS$E@SÀAp²@AS$E@SÀAp³@AS$E@SÀAp´@AS$E@SÀApµ@AS$E@SÀAp¶@AS$E@SÀAp·@AS$E@SÀAp¸@AS$E@SÀAp¹@AS$E@SÀApº@AS$E@SÀApà@AS$E@SÀApá@AS$E@SÀApâ@AS$E@SÀApã@AS$E@SÀApä@AS$E@SÀApå@AS$E@SÀApæ@AS$E@SÀApç@AS$E@SÀApè@AS$E@SÀApé@AS$E@SÀApê@AS$E@SÀApë@AS$E@SÀApì@AS$E@SÀApí@AS$E@SÀApî@AS$E@SÀApï@AS$E@SÀApð@AS$E@SÀApñ@AS$E@SÀApò@AS$E@SÀApó@AS$E@SÀApô@AS$E@SÀApõ@AS$E@SPLIT SÀApö@AS$E@SÀAp÷@AS$E@SÀApø@AS$E@SÀApù@AS$E@SÀApú@AS$E@SÀApû@AS$E@SÀApü@AS$E@SÀApý@AS$E@+SÀ pMp“RRCp1pC@B@SÀApþ@AS$E@SÀApÿ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp!@AS$E@SÀAp"@AS$E@SÀAp#@AS$E@SÀAp$@AS$E@SÀAp%@AS$E@SÀAp&@AS$E@SÀAp'@AS$E@SÀAp(@AS$E@SÀAp)@AS$E@SÀAp*@AS$E@SÀAp+@AS$E@SÀAp,@AS$E@SPLIT SÀAp-@AS$E@SÀAp.@AS$E@SÀAp/@AS$E@SÀAp0@AS$E@SÀAp1@AS$E@SÀAp2@AS$E@SÀAp3@AS$E@SÀAp4@AS$E@SÀAp5@AS$E@SÀAp6@AS$E@SÀAp7@AS$E@SÀAp8@AS$E@SÀAp9@AS$E@SÀAp:@AS$E@SÀAp;@AS$E@SÀAp<@AS$E@SÀAp=@AS$E@SÀAp>@AS$E@SÀAp?@AS$E@SÀAp@@AS$E@SÀApA@AS$E@SÀApB@AS$E@SÀApC@AS$E@SÀApD@AS$E@SÀApE@AS$E@SÀApF@AS$E@SÀApG@AS$E@SÀApH@AS$E@SÀApI@AS$E@SÀApJ@AS$E@SÀApK@AS$E@SÀApL@AS$E@SÀApM@AS$E@SÀApN@AS$E@SÀApO@AS$E@SÀApP@AS$E@SÀApQ@AS$E@SÀApR@AS$E@SÀApS@AS$E@SÀApT@AS$E@SÀApU@AS$E@SÀApV@AS$E@SÀApW@AS$E@SÀApX@AS$E@SÀApY@AS$E@SÀApZ@AS$E@SÀAp[@AS$E@SÀAp\@AS$E@SÀAp]@AS$E@SÀAp^@AS$E@SÀAp_@AS$E@SÀAp`@AS$E@SÀAp2@AS$E@SÀAp1@AS$E@+SÀ p“p²RRCptp0C@B@SÀAp»@AS$E@SÀApSPLIT ¼@AS$E@SÀAp½@AS$E@SÀAp¾@AS$E@SÀAp¿@AS$E@SÀApÀ@AS$E@SÀApÁ@AS$E@SÀApÂ@AS$E@SÀApÃ@AS$E@SÀApÄ@AS$E@SÀApÅ@AS$E@SÀApÆ@AS$E@SÀApÇ@AS$E@SÀApÈ@AS$E@SÀApÉ@AS$E@SÀApÊ@AS$E@SÀApË@AS$E@SÀApÌ@AS$E@SÀApÍ@AS$E@SÀApÎ@AS$E@SÀApÏ@AS$E@SÀApÐ@AS$E@SÀApÑ@AS$E@SÀApÒ@AS$E@SÀApÓ@AS$E@SÀApÔ@AS$E@SÀApÕ@AS$E@SÀApÖ@AS$E@SÀAp×@AS$E@SÀApØ@AS$E@SÀApÙ@AS$E@SÀApÚ@AS$E@SÀApÛ@AS$E@SÀApÜ@AS$E@SÀApÝ@AS$E@SÀApÞ@AS$E@SÀApß@AS$E@SÀApà@AS$E@SÀApá@AS$E@SÀApâ@AS$E@SÀApã@AS$E@SÀApä@AS$E@SÀApå@AS$E@SÀApæ@AS$E@SÀApç@AS$E@SÀApè@AS$E@SÀApé@AS$E@SÀApê@AS$E@SÀApë@AS$E@SÀApì@AS$E@SÀApí@AS$E@SÀApî@AS$E@SÀApï@AS$E@SÀApð@AS$E@SÀApñ@AS$E@SÀApò@AS$E@SÀApó@AS$E@SÀApô@AS$E@SPLIT SÀApõ@AS$E@SÀApö@AS$E@SÀAp÷@AS$E@SÀApø@AS$E@SÀApù@AS$E@SÀApú@AS$E@SÀApû@AS$E@SÀApü@AS$E@SÀApý@AS$E@SÀApþ@AS$E@SÀApÿ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@+SÀ p¤pRRCppkC@B@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp!@AS$E@SÀAp"@AS$E@SÀAp#@AS$E@SÀAp$@AS$E@SÀAp%@AS$E@SÀAp&@AS$E@SÀAp'@AS$E@SÀAp(@AS$E@SÀAp)@AS$E@SÀAp*@AS$E@SÀAp+@AS$E@SPLIT SÀAp,@AS$E@SÀAp-@AS$E@SÀAp.@AS$E@SÀAp/@AS$E@SÀAp0@AS$E@SÀAp3@AS$E@SÀCA@SPLIT SÀ RC tû:±“O€Hy ô ¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:ût±O“€Hy ô ¥SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥qÚSsÀ/ ¡ fee5cb9a196b40a4a37f4d070d7c04da@@@@@@@@@@@@Su  3Hey there!SÀ RR %é—¯2ÓL©*/ýRÅC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯—é%Ó2L©*/ýRÅSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥qÚSsÀ/ ¡ bc11c5d10908443a8f7ce1feaff341d3@@@@@@@@@@@@Su  3Hi there!SÀ RR 6++Ø£¿?FŸ¶®h:·þ­C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ø++6¿£F?Ÿ¶®h:·þ­SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥qÚSsÀ/ ¡ 8defb79ec88345b19dbf7ccb2b3b2f12@@@@@@@@@@@@Su  3Ho there!SÀ RR ŽËX çE©¾õŸ…’«+C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ËŽ XE穾õŸ…’«+SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥qéSsÀ/ ¡ 27e8c62818ea432fa74523f5003843ba@@@@@@@@@@@@Su  3Hey there!SÀ RR ÃqÝG¿ê «ñQ"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜qÃÝG¿ê «ñQ"SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU £x-opt-locked-untilƒ`f¥qéSsÀ/ ¡ 0e99e30e1ee943d7b0a34736a7f6428b@@@@@@@@@@@@Su  3Hi there!SÀ RR îC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜|vF‡ÂIjƒ;æ'>îSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥räSsÀ/ ¡ ab98f9e78b1c4320a775ec6404f8e6b8@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR Œ4®.øQA¤¿,—òK’C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®4Œø.AQ¤¿,—òK’SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ d5ce3e1a23de440bbf90ac455ff333ab@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR µ(>QÆPüF¶K‹öòÛŸMC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Q>(µPÆFü¶K‹öòÛŸMSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ f81bf218eda54688b27715a78fb4d712@@@@@@@@@@@@Su  3Hi there!SÀ RR Øè°ÛÝF¦tä|Üf`C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜èØÛ°Fݦtä|Üf`SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ b54c1d2df89f468aa2cb4a85459986e3@@@@@@@@@@@@Su  3Ho there!SÀ RR b|{ÀKµ”³U¸¨tC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜|b{KÀµ”³U¸¨tSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU £x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ 077eccc37c8245ee9ef3d240a2fe03d2@@@@@@@@@@@@Su  3Hey there!SÀ RR sºÉä"ÇHŽ~ (—± C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Éºs"äHÇŽ~ (—± SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU!£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ 8d20854bac354eae9ef5ebb0ba67738d@@@@@@@@@@@@Su  3Hi there!SÀ RR ÓÍH>¨E A’2T ÑÀÄuC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>HÍÓE¨A ’2T ÑÀÄuSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU"£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ c0d42cb9039d4bb5b6974ed3e6f159e8@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR [$ö&2€·I²££%2ÿbC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜&ö$[€2I·²££%2ÿbSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU#£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ eee81f81d84b44fe8f94226fd61abce1@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR ]Døò3µO¾ÇöY…C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜òøD]µ3O¾ÇöY…SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU$£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 0190e7cc87c84fc39258f3065dfa334e@@@@@@@@@@@@Su  3Hi there!SÀ RR  +©ë”Iƒâª³µ¶’©C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ë©+”Iƒâª³µ¶’©SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU%£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 4fe90924d06140088cc32539382c26a1@@@@@@@@@@@@Su  3Ho there!SÀ RR! ƒáó¢*Ç@™§zÏìß]áC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜óáƒ*¢@Ç™§zÏìß]áSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU&£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 725da4500abc4fc4bdb55a45e28ea243@@@@@@@@@@@@Su  3Hey there!SÀ RR" XœþŽkØM’kŒ™ÖÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þœXkŽMØ’kŒ™ÖÉSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU'£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 37f70567d87d4619b06fe0c5b2c60f05@@@@@@@@@@@@Su  3Hi there!SÀ RR# bŸ;¨’¦÷@xµ<¥JóDC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¨;Ÿb¦’@÷xµ<¥JóDSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU(£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 92b95937594749629c2439015fe9feae@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR$ ¼,pÅþÄ,F…J”TÆ«C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Åp,¼ÄþF,…J”TÆ«SrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU)£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ 6858aa0fe02a467dae4b53303daa726f@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR% -âÜ/Q B¡±c5VÑC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Üâ-Q/B ¡±c5VÑSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU*£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ a0a119a4bae743978a683208ab1abb9d@@@@@@@@@@@@Su  3Hi there!SÀ RR& "à@›K›ç®$i—ÚC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@à"›K›ç®$i—ÚSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU+£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ d0438307df1249e5914dcb3548ad57d2@@@@@@@@@@@@Su  3Ho there!SÀ RR' Œ®£½olJ€eùõY¡€yC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜½£®ŒoJl€eùõY¡€ySrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU,£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ 1cebd35124d5401fbcc716525d35402a@@@@@@@@@@@@Su  3Hey there!SÀ RR( í<5Ë•/M‘DEõ²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5<í•ËM/‘DEõ²SrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU-£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ fc4b825eb2124179a9e31289d7b7e319@@@@@@@@@@@@Su  3Hi there!SÀ RR) ›ü9Û.ßEªæƒ0Q¹|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜9ü›.ÛEߪæƒ0Q¹|SrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU.£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ 59a896dc725346f185540fd257a7de21@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR* æ (шyCº?¸–bÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜( æˆÑCyº?¸–bÛSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU/£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ e48c19ebc0e64907a19a4e2cc7103bc8@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR+ :º¶\nµ.NŸ²ÃU÷† sC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜\¶º:µnN.Ÿ²ÃU÷† sSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU0£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ 4d6fdca3655241ed8bad321f106ae603@@@@@@@@@@@@Su  3Hi there!SÀ RR, ("½NE¦òZ&dúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜½"(EN¦òZ&dúSrÁU£x-opt-enqueued-timeƒ`f¤†¾£x-opt-sequence-numberU1£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ ee88b32af2cd4594b612371f8229ecd6@@@@@@@@@@@@Su  3Ho there!SÀ RR- KÜ8Ÿ|ÿL¿±‰ÕWö;õC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ÿ8ÜK|Lÿ¿±‰ÕWö;õSrÁU£x-opt-enqueued-timeƒ`f¤†¾£x-opt-sequence-numberU2£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ dbe07d4e911043d1b1ec0f714807e2c2@@@@@@@@@@@@Su  3Hey there!SÀ RR. ¼0´Z¯þ¯I–ÚˆÑô‚ÚC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Z´0¼þ¯I¯–ÚˆÑô‚ÚSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU3£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ 00e8c68fbbd74a0eac974e5db84956f1@@@@@@@@@@@@Su  3Hi there!SÀ RR/  DU¡Ã+]F™ írƒÔ˜IC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¡UD +ÃF]™ írƒÔ˜ISrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU4£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ 565c685bb1ac4fa393d15f70c4b0bdd0@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR0 §“KSVÐBœò·7·ÑC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜SK“§ÐVBœò·7·ÑSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU5£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ 9dfe00f3a5584155bfb1369b4b48c32d@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR1 ¿Ö[yŸ§…K§„·®×£C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜y[Ö¿§ŸK…§„·®×£SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU6£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ 54d288f642a443c585be6f334405dc7d@@@@@@@@@@@@Su  3Hi there!SÀ RR2 —{ëÜöCÕOEoC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ë{—öÜCÕOEoSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU7£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ afb5ea722ae64f898d76817982399dc2@@@@@@@@@@@@Su  3Ho there!SÀ RR3 Ü߆·5¤FšyÛîû¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†ßÜ5·F¤šyÛîû¥SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU8£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ 4550a8e7ee71481cacd1a42bf4a1a31b@@@@@@@@@@@@Su  3Hey there!SÀ RR4 ›Ûu³4|@†ûèœñƒÿC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³uÛ›|4@†ûèœñƒÿSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU9£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ caeb9718b0f34baa85195a17e5709e03@@@@@@@@@@@@Su  3Hi there!SÀ RR5 Õšõ¬ÊµO­¤wë;aúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¬õšÕµÊO­¤wë;aúSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU:£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ 17805e985c8d47659f07f832fe0876c5@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR6 o]Í.ê¬>C„ÏÄa¾YßçC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜.Í]o¬êC>„ÏÄa¾YßçSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU;£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 5ce8c106c6304166a4f112530b3e7e56@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR7 ¹0ZÖ†ÉN²8,7µíWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÖZ0¹†Nɲ8,7µíWSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU<£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 39eb87ed46e149dd8f3902bb117adf70@@@@@@@@@@@@Su  3Hi there!SÀ RR8 "54˜ C•Õ­…d³ÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5"˜4C •Õ­…d³ÞSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU=£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ fed30d8abd124ea58ed507c27d7babd6@@@@@@@@@@@@Su  3Ho there!SÀ RR9 PNþhÕ'‚OªíÒ%ä&ËC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hþNP'ÕO‚ªíÒ%ä&ËSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU>£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 89826be41a544dc7aae85e40f6b144e2@@@@@@@@@@@@Su  3Hey there!SÀ RR: —‡Œ§Ås/F§A4"4æ)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜§Œ‡—sÅF/§A4"4æ)SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU?£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 21f0326ff8074ae79351a7e3aa702c00@@@@@@@@@@@@Su  3Hi there!SÀ RR; ôtléX[B¸JbêƒÔ¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ltôXéB[¸JbêƒÔ¸SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU@£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 3ca9be1f21d94c108058dc66c878af46@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR< ÅxžÓ¢´K®#uäm¶`!C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÓžxÅ´¢K®#uäm¶`!SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUA£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ 6b94c038d910458a92ac8c6e9d46b763@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR= ¢[áIE§B¼WȤ¾£œC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜á[¢EIB§¼WȤ¾£œSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUB£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ d0462d261cae48de9dd5acf019e1a0bd@@@@@@@@@@@@Su  3Hi there!SÀ RR> ·t•àÕ½ÈL³ªo±JûêC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜à•t·½ÕLȳªo±JûêSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUC£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ 9317317c9e9c46a2b9228b1687d0b7be@@@@@@@@@@@@Su  3Ho there!SÀ RR? ½³[Ög›@˜D–¾û¹(C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜[³½gÖ@›˜D–¾û¹(SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUD£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ b9dde05c34c148028785781afd80fe87@@@@@@@@@@@@Su  3Hey there!SÀ RR@ IT Ü|M¢\RjVz²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜TIÜ M|¢\RjVz²SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUE£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ 33eeb4c3b7cb446980cf4cf0c55e8e18@@@@@@@@@@@@Su  3Hi there!SÀ RRA uÔô±–ÄM©»êJÖu[C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ôÔu–±MÄ©»êJÖu[SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUF£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ e2a253a160cb4dcab7845201e7c95af6@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRB BóajÂE›L$ÝLKRC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jaóBÂE›L$ÝLKRSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUG£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ ea729f3ec5f94a4fa7ea34747050b429@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRC Ã6ã+<,G¾U³îçC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ã6Ã<+G,¾U³îçSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUH£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 1c44d362e8cf4c9c9afe14b4dbcd974c@@@@@@@@@@@@Su  3Hi there!SÀ RRD +…ÃAà­¨A¨ÁnùaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜AÃ…+­àA¨¨ÁnùaSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUI£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 4c434dd791ae425ab482d596f37fbd90@@@@@@@@@@@@Su  3Ho there!SÀ RRE ‚Xsq²I»@‚¹¡‹í (AC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜qsX‚I²@»‚¹¡‹í (ASrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUJ£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ ca602540424d4723a1617774afcc4a7e@@@@@@@@@@@@Su  3Hey there!SÀ RRF  J í¢VC¦¥¦ÃKš~{C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ J ¢íCV¦¥¦ÃKš~{SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUK£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ cb3189e3156646b98fc193e1fc31023d@@@@@@@@@@@@Su  3Hi there!SÀ RRG ’äÎG`_†Fºh5•æ{C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜GÎä’_`F†ºh5•æ{SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUL£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ d7dccfaabcb04f3689e8253e041bb962@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRH Ãتæ•9àLª×6àtº”\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æªØÃ9•Làª×6àtº”\SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUM£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 9c09407f7cd247b082afe5c48d9a65df@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRI Ø™|#!%WH—­^Eˆ•EC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#|™Ø%!HW—­^Eˆ•ESrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUN£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 56e55c70b5514fab941e15c10fed10d3@@@@@@@@@@@@Su  3Hi there!SÀ RRJ ã{GšˆRáK¢Í5+h³RC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜šG{ãRˆKá¢Í5+h³RSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUO£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 72dae1e18f7f4e778cf2cd5f4ed921fe@@@@@@@@@@@@Su  3Ho there!SÀ RRK é (œ¹®C›ë2H/”t€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜( 鹜C®›ë2H/”t€SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUP£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 48f5b34446504df69b4546998aba1357@@@@@@@@@@@@Su  3Hey there!SÀ RRL ij†pâõ¦L¶—¥¤UãFUC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜p†³ÄõâL¦¶—¥¤UãFUSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUQ£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 98838d8352fd4ca0971f06cb5fd5d100@@@@@@@@@@@@Su  3Hi there!SÀ RRM Ñæµè‡|@–J<&ZŸÔóC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜µæÑ‡è@|–J<&ZŸÔóSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUR£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 032b9a4cab0b4decac2e09c13c434b0b@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRN (¯ðÕ¥½I ÷@–,±˜bC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Õð¯(½¥I ÷@–,±˜bSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUS£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ aea00d8a183649318d4e7593a09c0630@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRO QÄÒý3C°"TeOWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÒÄQýC3°"TeOWSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUT£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 85136752c531452894badbacd55951d1@@@@@@@@@@@@Su  3Hi there!SÀ RRP @Á¢®>´K¶=d‚pýõC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¢Á@>®K´¶=d‚pýõSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUU£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 00e8f7baf7444a76a1d63c9d92bc2e09@@@@@@@@@@@@Su  3Ho there!SÀ RRQ  Ñ®+)YèG–aõÆ£ëÙ=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+®Ñ Y)Gè–aõÆ£ëÙ=SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUV£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 1e95f6d205da4774941a1e82dd5ce631@@@@@@@@@@@@Su  3Hey there!SÀ RRR )$Âà9/EŠã!<œßIC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜àÂ$)9E/Šã!<œßISrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUW£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 73a9f45c9a5a4a679067be681e988112@@@@@@@@@@@@Su  3Hi there!SÀ RRS ÎË–gúô I¨ÓBò‡³uC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜g–ËÎôúI ¨ÓBò‡³uSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUX£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 3765e7b7b9c04e8d8c884c902eb7afa5@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRT Ɇ~‰C°øY(˜ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†É~C‰°øY(˜ SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUY£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ d3b1503c5d89434fad5257637e779498@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRU ¹$j] Û%A‘&3|ßœaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜]j$¹Û A%‘&3|ßœaSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUZ£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ 2d61e4bb8473461d8ffa6a5ce7b1cc1a@@@@@@@@@@@@Su  3Hi there!SÀ RRV èq~2B‡AÙØÐ¿9C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜qè~B2‡AÙØÐ¿9SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU[£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ c019d37fd49546bbaaffaf556457c965@@@@@@@@@@@@Su  3Ho there!SÀ RRW ʂՆ÷&IFš 5§&ä+ÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†Õ‚Ê&÷FIš 5§&ä+ÄSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU\£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ d01d7767e0944635b6c3e67a031d9784@@@@@@@@@@@@Su  3Hey there!SÀ RRX RЍï-° F®±5BOlC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï¨ŠR°-F ®±5BOlSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU]£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ ae7740defb9a40a6b797d0b3dea1cac5@@@@@@@@@@@@Su  3Hi there!SÀ RRY UãÑJªõkF¹Ös’ÿ±"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜JÑãUõªFk¹Ös’ÿ±"SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU^£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ 4ee53754754a40b6ac3289c83ac9606f@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRZ ðØßXIJyA³0m!ì„Õ]C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Xߨð²ÄAy³0m!ì„Õ]SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU_£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ 6452879f7f3d4323a0bc0236f6923024@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR[  Ù˜ û@¡ì0Hbf-ìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ù  ˜@û¡ì0Hbf-ìSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU`£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ 66d67615bec547569676af375bac67b2@@@@@@@@@@@@Su  3Hi there!SÀ RR\ ö‘¶@ÇŠoE¶VÑä?…ô-C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@¶‘öŠÇEo¶VÑä?…ô-SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUa£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ a66507d0209644b78d8d4144912f42b9@@@@@@@@@@@@Su  3Ho there!SÀ RR] äc²§X°D‹r°(åöC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜§²cäXD°‹r°(åöSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUb£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ ee5c0da3254c4462a07222f747b2306d@@@@@@@@@@@@Su  3Hey there!SÀ RR^ 5÷»mBYCŠ~{u¾š C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜»÷5BmCYŠ~{u¾š SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUc£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ fa70e4d4964a47838b76f31c95b6f3b3@@@@@@@@@@@@Su  3Hi there!SÀ RR_ tKN{J7æL¬Œ´F›Ú·qC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{NKt7JL欌´F›Ú·qSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUd£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ d363d695ae3149e898af960854aaec1e@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR` ’öÄ(‘âC½WÒ-{M9C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Äö’‘(Câ½WÒ-{M9SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUe£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ b1a13f2e2b5b460fb6bba1477107d367@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRa ð%€S³ÃEŒÄÇÏÅü"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜S€%ð³EÃŒÄÇÏÅü"SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUf£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ a0d06e874b684b74b904e4b2f28453ca@@@@@@@@@@@@Su  3Hi there!SÀ RRb ô[ c×I»§Õ…}€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ [ô×cI»§Õ…}€SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUg£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ 34b1b8c94f5b4930b36fe2480e9528dc@@@@@@@@@@@@Su  3Ho there!SÀ RRc ó9KÛA†ÒD‹˜]Ø' .ˆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÛK9ó†ADÒ‹˜]Ø' .ˆSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUh£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ 1288d1e729c44df1b53b156fb2b9c3d9@@@@@@@@@@@@Su  3Hey there!SÀ RRd ~²½åëûšNj|éH‡ÄôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜å½²~ûëNšj|éH‡ÄôSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUi£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ 638bbd40094040a7a01c9f76f760a057@@@@@@@@@@@@Su  3Hi there!SÀ RRe 0nØý©î@£Q#&Š)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Øn0©ý@î£Q#&Š)SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUj£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ 2aaa8e0faefe464f9e0045f29c042ae4@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRf ECãÆ{²O™¤XC&‹-¼C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãCE{ÆO²™¤XC&‹-¼SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUk£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ dfde108ce1114e25bc9f0cc2d4af34d7@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRg qßþ³â6@¿tü ëëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³þßqâ@6¿tü ëëSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUl£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ cd31fe2243434244bc028688a799c34c@@@@@@@@@@@@Su  3Hi there!SÀ RRh M˜ƒîA®ögu¦ÄzÃC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Mƒ˜Aî®ögu¦ÄzÃSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUm£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ 1e98b4094c184fe8a6825d349c7690a8@@@@@@@@@@@@Su  3Ho there!SÀ RRi ç_è…êcH€•uä¹ 6C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜è_çê…Hc€•uä¹ 6SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUn£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ 991ec1e3d8264b6895b436ae53cd3cfc@@@@@@@@@@@@Su  3Hey there!SÀ RRj Õ±Û»SI±utr9:n|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Û±ÕS»I±utr9:n|SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUo£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ 3fde53ba4fbe40729aae86a23096e13c@@@@@@@@@@@@Su  3Hi there!SÀ RRk 6tùñ>´ÂM¦ýÞ@÷–ÅC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ñùt6´>M¦ýÞ@÷–ÅSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUp£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ 94b88707475d4c32927c2c294feff41c@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRl “Eœðï©G…•°›xÞÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜œE“ïðG©…•°›xÞÕSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUq£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ e3691688028e45c4beeb7556b46ad5ad@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRm éÒ‹ÄGšÇ³ŽézC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Òé‹GĚdzŽézSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUr£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ ab44d47ec51f47e191fc38b7943bfdb1@@@@@@@@@@@@Su  3Hi there!SÀ RRn CýÝJ†KEKŠs°]©IC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜JÝýCK†KEŠs°]©ISrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUs£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ 1eb50643bea9447d803c9029ff2a2663@@@@@@@@@@@@Su  3Ho there!SÀ RRo :{›Û˜N½]Zb`¬7˜C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Û›{:˜N½]Zb`¬7˜SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUt£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ adad5bb9849745879d5b7d5cb94bf8bf@@@@@@@@@@@@Su  3Hey there!SÀ RRp JÒ\ŽØF•ÙÔz % C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜\ÒJØŽF•ÙÔz % SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUu£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ c9f11a3a83c44c018fd9ecb074483ce5@@@@@@@@@@@@Su  3Hi there!SÀ RRq ÷Víº3MœÅÞVÊÇC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜íV÷ºM3œÅÞVÊÇSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUv£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ 8e487ff4cddc4d729f82ea5886895c84@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRr ž 4ÊMK§Èµ˜OHPC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4 žMÊK§Èµ˜OHPSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUw£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ b906f9ef18d24346baaabf4fdab05c9b@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRs R™üÖK[K–2á§ (¾C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ü™RKÖK[–2á§ (¾SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUx£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ b66149d7d9cb4d2e931b03af3e0e22ab@@@@@@@@@@@@Su  3Hi there!SÀ RRt KX”5nåIm’*¯FÌC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”XKn5Iåm’*¯FÌSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUy£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ f4d87ea7ddc7453b9f90f68b5c88075e@@@@@@@@@@@@Su  3Ho there!SÀ RRu t9¼å×ímJŒÇUZÿ8ÇaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜å¼9tí×JmŒÇUZÿ8ÇaSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUz£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ f7bc24d1f4864680af962f69fe0ea14b@@@@@@@@@@@@Su  3Hey there!SÀ RRv ³ý ﯡO•w_Ð Ø­C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï ý³¯O¡•w_Ð Ø­SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberU{£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ 746ca05f92064841ac581390101110de@@@@@@@@@@@@Su  3Hi there!SÀ RRw Š4ß¹–LµhöXÞ²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ß4йL–µhöXÞ²SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberU|£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ 4101f41a967c41f9a1c264ba55f8d083@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRx 3 _¼zpK¸þžª›ôŸC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜_ 3z¼Kp¸þžª›ôŸSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberU}£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ a79f92a70b7542a69501ecc866898b66@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRy @[~»šðL¦HŸ£¸ßC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~[@š»Lð¦HŸ£¸ßSrÁU£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberU~£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ 1353f699ea3e4b379522ad20b2bbde7c@@@@@@@@@@@@Su  3Hi there!SÀ RRz º.AC¹1:E¥L›-¤œ õC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜CA.º1¹E:¥L›-¤œ õSrÁU£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ 1d5c59e32cf44ba083e2f0389f28525c@@@@@@@@@@@@Su  3Ho there! SÀ RR{  ‰F½`ߦ€ªÀC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ F‰½`ߦ€ªÀSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number€£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ b9120148f5ec4563a8eabdab305830ae@@@@@@@@@@@@Su  3Hey there! SÀ RR| ]måº`ßµIÈoÖô¬1C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ºåm]ß`IµÈoÖô¬1SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ b41f3f84833d4f76bab2c322677b6804@@@@@@@@@@@@Su  3Hi there! SÀ RR} ÕQwåå>A‘)×yñpC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜wQÕååA>‘)×yñpSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‚£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ dd6dd88d608043cdaa5d9751f2cb5f5b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR~ 8ÓæÿÿD¯ïØ…¨5C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æÓ8ÿDÿ¯ïØ…¨5SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberƒ£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ fcef537e85df4e329a85f0c30a206238@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR  d^>‚›C® ÙÏâPÀC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^d ‚>C›® ÙÏâPÀSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number„£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ d0e88b9701504935b31ed088f85f065e@@@@@@@@@@@@Su  3Hi there! SÀ RR€ ½Ó/ÄÿcN——ã$£î3C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ä/Ó½ÿNc——ã$£î3SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number…£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ ef5bada9164346c1805abe859d5812db@@@@@@@@@@@@Su  3Ho there! SÀ RR ê¹ïGŠ Iœaë­SC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï¹êŠGI œaë­SSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number†£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ 16ef7dd8fe2f4c4985f937ce1fa38df7@@@@@@@@@@@@Su  3Hey there! SÀ RR‚ ܤÚÌ.€§J²¨-÷°ÊÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ìڤ܀.J§²¨-÷°ÊÝSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‡£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ bea19b42b06845dbb94c88bc9b135d4b@@@@@@@@@@@@Su  3Hi there! SÀ RRƒ ԃaKH–³8úíC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÔЇîaƒKH–³8úíSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberˆ£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ 3b950801e5024818a5eb580777d6c1dc@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR„ »•ÒjÂ(%G®á”çB.ÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jÒ•»(ÂG%®á”çB.ÔSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‰£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ c57b5f6e099b45c99a27bbb6299ceede@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR… ¬Áòr~N¨Þ—î}K©ÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜òÁ¬rN~¨Þ—î}K©ÄSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberŠ£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ 7a561baad99c4c9ea1c4d57addfdf690@@@@@@@@@@@@Su  3Hi there! SÀ RR† &‰Gù{ãK±a›C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜G‰&{ùKã±a›SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‹£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ 2287bc3e1c64455dadee056841d134be@@@@@@@@@@@@Su  3Ho there! SÀ RR‡ Ô,EÉÉC´0ÓàÌ:‰C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜,ÔÉECÉ´0ÓàÌ:‰SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberŒ£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ 5f71a1b51ae74a0eb1e6bb62781be95e@@@@@@@@@@@@Su  3Hey there! SÀ RRˆ Zˆâ›)SXN´ÑÊXgq£C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜›âˆZS)NX´ÑÊXgq£SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ 640c0f24b41544faab254a2cac3b0dcf@@@@@@@@@@@@Su  3Hi there! SÀ RR‰ ޲>Ÿ’B¿×ðÜp±MC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>²ŽŸB’¿×ðÜp±MSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberŽ£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ fc070119619c45d3b6d3cf2b18683525@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRŠ ‘"QÛŸ¼F„V‰&QÚ|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÛQ"‘ŸF¼„V‰&QÚ|SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ fa8b7f0704484f4aaeb56296fc234a69@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR‹ NSe^fõþD­‘@¾GC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^eSNõfDþ­‘@¾GSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ 25ef926f741f4358be2eb2e6b2fd9957@@@@@@@@@@@@Su  3Hi there! SÀ RRŒ èBû#°†J·?b¹¼GŽC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#ûBè°J†·?b¹¼GŽSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‘£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ 694757a4accf4cf485ccaa8f73e7899d@@@@@@@@@@@@Su  3Ho there! SÀ RR ";6°H¯ÅH®Œv´'ÎXC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°6;"¯HHÅ®Œv´'ÎXSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number’£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ 3702a9f3d7ce4f1cb4266b4999793680@@@@@@@@@@@@Su  3Hey there! SÀ RRŽ ßjœÁ8ÄG’ä©'óõ!õC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Áœjß8GÄ’ä©'óõ!õSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number“£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ ad6b74b84d5a41ebbb4edde0dbfcdce6@@@@@@@@@@@@Su  3Hi there! SÀ RR š=ñ+å=F  ÁN•ׯC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+ñ=š=åF  ÁN•ׯSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number”£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ 10ff794e715e4d55825c8d094de9a232@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR @¹dnBH¤ÝÆ&Ù‰ ÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¹@ndHB¤ÝÆ&Ù‰ ÕSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number•£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ 9f5d7269d1694e57a9e65005be2e70aa@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR‘ ºE¯ÑЉK“J|¶“RoC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯EºÐÑK‰“J|¶“RoSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number–£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ b83cad52fee745ad8c58459edec2bcec@@@@@@@@@@@@Su  3Hi there! SÀ RR’ #3ÌÏÓ9GœÉó©; C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÏÌ3#9ÓGœÉó©; SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number—£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ e84e67d0e1404313a162c641d1cb1fa5@@@@@@@@@@@@Su  3Ho there! SÀ RR“ XÌ‚=\uD‡þWÝ~5ÐõC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚ÌX\=Du‡þWÝ~5ÐõSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number˜£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ c8ce7210d00c439fab64d144b35a70fe@@@@@@@@@@@@Su  3Hey there! SÀ RR” Ðrâ*Âá®M¢\Æ*Å3ÂíC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*ârÐáÂM®¢\Æ*Å3ÂíSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number™£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ efe786e68fd94f2a9c568ee49c758b79@@@@@@@@@@@@Su  3Hi there! SÀ RR• |¿Xåy5ÉH†gËÂG?/C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åX¿|5yHɆgËÂG?/SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberš£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ a07a60ab18db40379271c0750e2a7180@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR– ´ËA­%ÓÔCÐ|²þP{C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜­AË´Ó%CÔÐ|²þP{SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number›£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ a381d6e23c794138ab9de04b3009bcd1@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR— øf2D¥q/AŒ()ëÓC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜D2føq¥A/Œ()ëÓSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberœ£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 083ab1b6e61e4f688e8da04cb3790fe8@@@@@@@@@@@@Su  3Hi there! SÀ RR˜ ·uÓWèÎG¸ù»¹¶ÝLC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Óu·èWGθù»¹¶ÝLSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 107d78c61b684b55a1234e05a8b2ca95@@@@@@@@@@@@Su  3Ho there! SÀ RR™ àÌæ‡A‰'/í²y›YC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æÌà‡A‰'/í²y›YSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberž£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 2f2f0e30508041a2a12928f656b27376@@@@@@@@@@@@Su  3Hey there! SÀ RRš ç÷Šamæ©IƒBÂ+ÁIì«C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜aŠ÷çæmI©ƒBÂ+ÁIì«SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberŸ£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 698661f4454e440daedadae817e48304@@@@@@@@@@@@Su  3Hi there! SÀ RR› õ˜¡wksL»meÉ…ê¼âC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜w¡˜õkLs»meÉ…ê¼âSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number £x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 1d53a067687d47769e292e906a9749ad@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRœ Æ·A @E¬ä_2ÇRC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜A·Æ E@¬ä_2ÇRSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¡£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ ff25046060c94be69cb602ada3c43896@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR LŸ²à/†9H„Qˆ‚W$(BC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜à²ŸL†/H9„Qˆ‚W$(BSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¢£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ ba7c3a9462a440d49383c812773cb5bd@@@@@@@@@@@@Su  3Hi there! SÀ RRž Ûýýv±å,I¨xà]IBõC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜výýÛå±I,¨xà]IBõSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number££x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ 658c86a3015b463ea2ce564b7315934d@@@@@@@@@@@@Su  3Ho there! SÀ RRŸ ÊŸQ‘Á&A‚s+ÞèC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜QŸÊÁ‘A&‚s+ÞèSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¤£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ 989f7f8f457d470187bf7eaf1dab460e@@@@@@@@@@@@Su  3Hey there! SÀ RR  L Û.¥Mª •sçÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Û L¥.Mª •sçÏSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¥£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ ef02fcbac2c04469ba12c64ad4688569@@@@@@@@@@@@Su  3Hi there! SÀ RR¡ æ>èAÏ@šÃàaxjC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Aè>æÏ@šÃàaxjSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¦£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ dd57e47205604331859d05dc7be47a11@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR¢ ¥ŒøeÜ/N‚ýSræ§4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜øŒ¥ÜeN/‚ýSræ§4SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number§£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ d3636221a69142ce910bdf159be32d3d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR£ |-ïy+ÇLŒØ¶õùäÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï-|+yLnjضõùäÏSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¨£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ 77386d51738641a4be046c110cfe634e@@@@@@@@@@@@Su  3Hi there! SÀ RR¤ ‰Qd¿Ê­Mž|nEÁÐ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¿dQ‰­ÊMž|nEÁÐ SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number©£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ d49a578213964e7baa74d8d41cac052f@@@@@@@@@@@@Su  3Ho there! SÀ RR¥ îÂãh8p–K»÷¢ C‡ß¯C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hãÂîp8K–»÷¢ C‡ß¯SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberª£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ 8e8e607bf4c04c948ff6679474cf7ff2@@@@@@@@@@@@Su  3Hey there! SÀ RR¦ *ÂÉ"¾aD¢’÷‘ºEi‘C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÉÂ*¾"Da¢’÷‘ºEi‘SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number«£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ 0cb119b874344909941c34719c75769d@@@@@@@@@@@@Su  3Hi there! SÀ RR§ Y»‰¸WMIœ[#Ò•C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¸‰»YWIMœ[#Ò•SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¬£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ c94644c17ee64812827cabf3e39a61d4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR¨ ÎÖä:ä"_I·ckgêÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:äÖÎ"äI_·ckgêÔSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number­£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ 2b291706aeb041969befce5f65b86259@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR© qYKxÆÇF”à'ùÈà8C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜KYqÆxFÇ”à'ùÈà8SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number®£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ ebcd8d1f76b9494298f2545f3f9a4818@@@@@@@@@@@@Su  3Hi there! SÀ RRª j*†^^³B®Nºñ‘æ#ÎC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^†*j^B³®Nºñ‘æ#ÎSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¯£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ 720d07c5c1f744f4a37640003da03265@@@@@@@@@@@@Su  3Ho there! SÀ RR« ܾÓ&&ÌDžóUfjS‰ùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ó¾Ü&&DÌžóUfjS‰ùSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number°£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ d4723a5885f64de49a7092e9c004650d@@@@@@@@@@@@Su  3Hey there! SÀ RR¬ 4Ç´º O´ô\•쩘C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ç4º´O ´ô\•쩘SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number±£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ 2787ca5d76bd4182a32bf577bf3c6f26@@@@@@@@@@@@Su  3Hi there! SÀ RR­ h3D÷vïF<ð·\Y8C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜÷D3hïvF<ð·\Y8SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number²£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ 6e4bf0134adc41b0a03b57b0f56f1547@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR® "N~ ŽF¢»"ÆôàC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ~N"ŽF¢»"ÆôàSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number³£x-opt-locked-untilƒ`f¥|zSsÀ/ ¡ 724b7a3641b54c2c9c0ae81c208ecac6@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR¯ ”ö/ÚëµîI²€Ék›„C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ú/ö”µëIî²€Ék›„SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number´£x-opt-locked-untilƒ`f¥|zSsÀ/ ¡ 026a13c3f2614eb1919b91db3b01bde1@@@@@@@@@@@@Su  3Hi there! SÀ RR° 2…ÍÃF¨L÷Ï#®á DC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÃÍ…2¨FL÷Ï#®á DSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberµ£x-opt-locked-untilƒ`f¥|zSsÀ/ ¡ 3297935e6cd14c40a2971e66e8164e5f@@@@@@@@@@@@Su  3Ho there! SÀ RR± žéRT% Jšs- "³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Réž%TJ šs- "³SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¶£x-opt-locked-untilƒ`f¥|zSsÀ/ ¡ 4be135e5db3644e2b74c4746af77698f@@@@@@@@@@@@Su  3Hey there! SÀ RR² Þî· É’“à·ÿrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5¹Š¶#MHtŽ>’“à·ÿrSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberº£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ 156a8b12d1ce424bbedd5df1c81d8b46@@@@@@@@@@@@Su  3Hi there! SÀ RR¶ HÉÐÈ($øFŠ‘Óî–*C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÈÐÉH$(FøŠ‘Óî–*SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number»£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ f2f9b7ba39cf4392a25e99d136dc727f@@@@@@@@@@@@Su  3Ho there! SÀ RR· Žòüæß³V@‚2j>yØ,LC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æüò޳ß@V‚2j>yØ,LSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¼£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ 83cc01d73fdf4ac5b063ba5302807a86@@@@@@@@@@@@Su  3Hey there! SÀ RR¸ ¹°¾ƒûñG‡™O¡U}|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾°¹ûƒGñ‡™O¡U}|SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number½£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ 223f83990ef4481d9beabc54695e8502@@@@@@@@@@@@Su  3Hi there! SÀ RR¹ pîk+—ޝH¤ÿe‡Ë(fC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+kîpŽ—H¯¤ÿe‡Ë(fSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¾£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ 35dc8b8c5b60474db747703d4668a79a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRº ó aŒrM³{\ßñäÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜a órŒM³{\ßñäÞSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¿£x-opt-locked-untilƒ`f¥}SsÀ/ ¡ c431a44d0eab43c98418cb4be7c059d0@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR» ´Ž‰5wC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜8ÛàßgGQ¯¢k‹[>5wSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberÜ£x-opt-locked-untilƒ`f¥~}SsÀ/ ¡ 8f06d767f672423ba41e0a0a15e37568@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRØ ÐvBh7dFH¹P9tx'C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hBvÐd7HF¹P9tx'SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberÝ£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ ec8876acd49f4614a3a99998195cb99b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RRÙ qQ&·ÁÌA—V±êï«eC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜&QqÁ·AÌ—V±êï«eSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberÞ£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ c05a4478472b44f19023ee9edd18c1aa@@@@@@@@@@@@Su  3Hi there! SÀ RRÚ ìX•ÝC„ÿg[WGJÈC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ì•XCÝ„ÿg[WGJÈSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberߣx-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ a4d6f4c395964b968a2485185e3e05dc@@@@@@@@@@@@Su  3Ho there! SÀ RRÛ m&€#h:õK…‘³Ix$uC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#€&m:hKõ…‘³Ix$uSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberà£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ 82b03c260e0f4edeaf9ae40ab03dd516@@@@@@@@@@@@Su  3Hey there! SÀ RRÜ @ûrÄ¥ÑEº…Ú›Tq*C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜rû@¥ÄEѺ…Ú›Tq*SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberá£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ 04ea404508714aa7b52b8efaa95bc00a@@@@@@@@@@@@Su  3Hi there! SÀ RRÝ YA kú$K¾ÕË]3C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜k AYúK$¾ÕË]3SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberâ£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ ffde1734f93d4c75b3590e0716508c9a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRÞ ŠOœ¤^c·C³Ýd…ôêG™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤œOŠc^C·³Ýd…ôêG™SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberã£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ 3ff7af3dcf3a492ea5033aab64364a2f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RRß @Í iLiA­Pûîß*ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ Í@LiAi­Pûîß*ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberä£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ 69a705e1b68948acb21211633cd118c1@@@@@@@@@@@@Su  3Hi there! SÀ RRà ¢;l˜êTF ƉõàhC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜l;¢ê˜FT ƉõàhSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberå£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ dbcb72ada6524654b7f3c1f77e76359e@@@@@@@@@@@@Su  3Ho there! SÀ RRá ÿ#îXÍ„L¶;.?—·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Xî#ÿÍL„¶;.?—·SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberæ£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ 2dd57e04cedc4803ae1d9f1050b112c6@@@@@@@@@@@@Su  3Hey there! SÀ RRâ —mv}ÌÕçD€'˜ÂjhùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜}vm—ÕÌDç€'˜ÂjhùSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberç£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ d57e665a1b764308a94ff259425fb7be@@@@@@@@@@@@Su  3Hi there! SÀ RRã ÕTC'Y%O{‚.IC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜CTÕY'O%{‚.ISrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberè£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ 04bf17b9d74c47fba115df742179ab36@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRä ¡z^x[©G»ÙDvüÃ×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^z¡[xG©»ÙDvüÃ×SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberé£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ c9ccc81ffdb94fc8aac261053214162e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RRå Õ±Yâø5è@  Û)äìvC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜âY±Õ5ø@è  Û)äìvSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberê£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ 766c71a41ac649a4834a180faa578670@@@@@@@@@@@@Su  3Hi there! SÀ RRæ vîyñÕã±NŽ×" Þ’ùåC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ñyîvãÕN±Ž×" Þ’ùåSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberë£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ e78849aa93e9402bb5954364fc97bd1a@@@@@@@@@@@@Su  3Ho there! SÀ RRç ż0Žï÷5Dˆ§6&йeC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ž0¼Å÷ïD5ˆ§6&йeSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberì£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ 1c86ba96e0064b92a9ac9d138c78bc64@@@@@@@@@@@@Su  3Hey there! SÀ RRè Aä_?BêŸK™(ö¹¸½DPC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜?_äAêBKŸ™(ö¹¸½DPSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberí£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ cd77e7b7b69a474299041a3d3a2207bb@@@@@@@@@@@@Su  3Hi there! SÀ RRé c§¹æRMˆæaMB†;`C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¹§cæMRˆæaMB†;`SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberî£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ 77c71356fc5f4a128a7aca008eab6124@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRê ïx›-°Až tÒ´‡ØLC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜›xï°-Až tÒ´‡ØLSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberï£x-opt-locked-untilƒ`f¥ôSsÀ/ ¡ 6c0850b4da2f4b02ba02c07eba55dc81@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RRë ^ÅM´…¿5G¼²öƒÕ:žEÿêv^Eš¨|">KH¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿE>(vêE^š¨|">KH¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥LSsÀ/ ¡ dea138aa54634b06860267b951ff6599@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ˜AåkiUN¨EÒ†í¥+KC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜kåA˜iNU¨EÒ†í¥+KSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥LSsÀ/ ¡ eb014cd8456240a1a7e3fe9cc2a7e64f@@@@@@@@@@@@Su  3Ho there! SÀ" Rp ÷>â[P‚L¶>ýäíC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜â>÷P[L‚¶>ýäíSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥LSsÀ/ ¡ ac8849ddf40e4e709282d14384d9db1d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp wМqQJŽ1“kžâhuC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜œÐwQqJŽ1“kžâhuSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥LSsÀ/ ¡ c40a9a4359fa4e6b9d924eb8c4d35ff9@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ÿŠ_»ôŽK¢°*)g™üC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜_Šÿô»KŽ¢°*)g™üSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥LSsÀ/ ¡ c87f99e59a1049b7884fcc8896b79598@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ˜ù‡¶Ù[F–šU|Ræû¯C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¶‡ù˜ÙF[–šU|Ræû¯SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 151464175be14d0f913333c80290c835@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp  ¹?v tKª· ¨Ø'C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜v?¹ Ktª· ¨Ø'SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 9b1e8380ef0945819259c394ba148c2a@@@@@@@@@@@@Su  3Hi there! SÀ" Rp  ÇßN·nM¾àìÍ¥¿C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜NßÇn·M¾àìÍ¥¿SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 961f656b9cf74b4286c97c28e6c154c5@@@@@@@@@@@@Su  3Ho there! SÀ" Rp   IïJ¦-í9RC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜I Jï¦-í9RSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 8459fc5229c649f7a664317b9ae4bc99@@@@@@@@@@@@Su  3Hey there! SÀ" Rp  •æi¬M\A“¿¯PmØ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¬iæ•MA\“¿¯PmØ SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 32adb445e6084c679ef20f2c7ee4da5e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp  ÉPJ1í(Nµœôu ?ÖC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜1JPÉíN(µœôu ?ÖSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ abea8e376646410c86fecc7f8745a914@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp —Kf&™F¹bOÔÈÍC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K—&fF™¹bOÔÈÍSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ 4b5b952fb58c4e65aaec3a7ddbdeea2c@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp žÙ}h|ßH‚L{ lÓ–C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h}Ùž|Hß‚L{ lÓ–SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ 92b692e0e3524b58a8abc53a06088f8a@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ÛÐB@ûÑF£Ìª*>šú4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜BÐÛû@Fѣ̪*>šú4SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ e5f5b3364f4840679660874202ce0320@@@@@@@@@@@@Su  3Ho there! SÀ" Rp Ïj$ÇÁH´R¬DHˆ³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jÏÇ$HÁ´R¬DHˆ³SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ cd93fefa73124756b6841cf3e193ebd4@@@@@@@@@@@@Su  3Hey there! SÀ" Rp æH"«OÀK¾Ÿ²§MðñC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜"HæO«KÀ¾Ÿ²§MðñSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ 0c6238724eae4cf5908523888ffe6264@@@@@@@@@@@@Su  3Hi there! SÀ" Rp Ô÷PœËã²CúoÁ«rtC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜œP÷ÔãËC²úoÁ«rtSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ 08ccb57caa0a475591595e89e4a66ba7@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ˜NñáÒ/ÇF³/È*E·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜áñN˜/ÒFdz/È*E·SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ f07d366fe1bf4fec9acf4b70d32d13aa@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp E' ë\&¯A¤¥vàk°AC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ë 'E&\A¯¤¥vàk°ASrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ b2ed3517511543f8826dec4d97254249@@@@@@@@@@@@Su  3Hi there! SÀ" Rp Þg«š‡N—ƒxÆ‹ì]éC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜gÞš«N‡—ƒxÆ‹ì]éSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ dc0083cb929344ae9dcc9c52c0f2df3a@@@@@@@@@@@@Su  3Ho there! SÀ" Rp Êììæñ"=N°UN%“ú×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æììÊ"ñN=°UN%“ú×SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ 2f6af03ee0394084be75c76ec1ee6b3d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp Ì– h2ÔI„ämDd?õ1C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ –Ì2hIÔ„ämDd?õ1SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ 627c75139b7e4f628446c0a405ee5f5c@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ö1¥¯ yKD…ÑÖBC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯¥1ö KyD…ÑÖBSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ df9ba16bb75d494382e8a533a662d7c8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp %1dÏ”ë@M³˜PU¨üüZC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ïd1%ë”M@³˜PU¨üüZSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ 5e9a0c738d774345a8872bd53eed9c51@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp gAÔåìŠäK¶œCA1!m-C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åÔAgŠìKä¶œCA1!m-SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ 15f84acd8fd84166ae7d226a4aca16a9@@@@@@@@@@@@Su  3Hi there! SÀ" Rp L˜˜ˆ4úL³dE]CQûC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ˆ˜˜L4Lú³dE]CQûSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number!£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ d5b5ae82c2b64e4f89bf0da59e375667@@@@@@@@@@@@Su  3Ho there! SÀ" Rp €‰t:¹f@ˆÀ Þe§ëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:t‰€¹@fˆÀ Þe§ëSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number"£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ 7f52ad7e42c54cc58db96bb72f23b187@@@@@@@@@@@@Su  3Hey there! SÀ" Rp £c.â%±K„.÷kv‰ >C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜â.c£%K±„.÷kv‰ >SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number#£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ 0615a6e6574e435a96e53a7f0dd93c51@@@@@@@@@@@@Su  3Hi there! SÀ" Rp |»Ð<´µ£F—È|‘`6‹ÐC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜<л|µ´F£—È|‘`6‹ÐSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number$£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ e3e1af49000c4e35b17129e6b8616646@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  û†eò=]M¨)Óº¶õC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜e†û=òM]¨)Óº¶õSrÁ\£x-opt-enqueued-timeƒ`f¤‡£x-opt-sequence-number%£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 650ea52bdd2249c39578d9709f6c9b73@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp! \M7¤õO¦±$†gû C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜M\¤7Oõ¦±$†gû SrÁ\£x-opt-enqueued-timeƒ`f¤‡£x-opt-sequence-number&£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ c327a03fd378488897b0197035e7d883@@@@@@@@@@@@Su  3Hi there! SÀ" Rp" ÂòÇWzH³ª³2U #%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÇòÂzWH³ª³2U #%SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number'£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 6b7f1d241bb347eaa96ea2059b1fa48d@@@@@@@@@@@@Su  3Ho there! SÀ" Rp# ¡ˆè¢°OœÔOgKDÌC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜èˆ¡¢O°œÔOgKDÌSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number(£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 018ce47e79c7431caecfecaf9cbf6a88@@@@@@@@@@@@Su  3Hey there! SÀ" Rp$ €í ½qE‘(Ò'¾1C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ í€q½E‘(Ò'¾1SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number)£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 22aa9820b5054e2e9de9247a9ed8de0e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp% SÑÿ¸`‡O¸“3]ðiÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿÑS`¸O‡¸“3]ðiÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number*£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 46c9365259714adeb8ebb862ab108062@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp& U‰KL{”Cˆ÷þýõ¡çWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K‰U{LC”ˆ÷þýõ¡çWSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number+£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ f343508c9e0f4bf08977b3ef3a232382@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp' È [}ÂÛŸCžØ@=CùÖÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜}[ ÈÛÂCŸžØ@=CùÖÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number,£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ 3a7b3d48c9e7440185139e486234c19a@@@@@@@@@@@@Su  3Hi there! SÀ" Rp( …d =K{&B”8ˆ,æ ÍC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜= d…{KB&”8ˆ,æ ÍSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number-£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ 106f2f4993e74d54bf59662c7086b5bb@@@@@@@@@@@@Su  3Ho there! SÀ" Rp) lö6ØŽ™H¥¥÷ŸºÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜6ölŽØH™¥¥÷ŸºÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number.£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ d5957aa44c174389b812be4c5852e290@@@@@@@@@@@@Su  3Hey there! SÀ" Rp* ~-.ó‚~\K’^æ¨Ù¾ÌC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ó.-~~‚K\’^æ¨Ù¾ÌSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number/£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ 87c2499d7c3c40bdbafaaed8cc763869@@@@@@@@@@@@Su  3Hi there! SÀ" Rp+ pƺã{oLˆ$Ôµ'µY´C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ºÆp{ãLoˆ$Ôµ'µY´SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number0£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ c826ccdcfe2945aeb0669569698deae1@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp, Pmxôd 5O¼4”{«“ÅrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ôxmP dO5¼4”{«“ÅrSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number1£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ a25dfb3bc65345bfbb110f89aca1b441@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp- DBOž‡—HŠB;CÛ&ÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜OBD‡žH—ŠB;CÛ&ÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number2£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ 483083f747904824b60d599536786ae1@@@@@@@@@@@@Su  3Hi there! SÀ" Rp. 3 ›…1äF²\ÌŠÓ4zC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜…› 3ä1F²\ÌŠÓ4zSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number3£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ d71dc11cff7c426db020b714b2a3616f@@@@@@@@@@@@Su  3Ho there! SÀ" Rp/ ëcIp–ÔA„yÞëPâ©C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Icë–pAÔ„yÞëPâ©SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number4£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ ba20998dbf164c31b6b353889c222f08@@@@@@@@@@@@Su  3Hey there! SÀ" Rp0 V‚ÜÕ3K@‚m¼uÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ü‚V3Õ@K‚m¼uÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number5£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ 35894c5eb4b84f108867b8243669cc18@@@@@@@@@@@@Su  3Hi there! SÀ" Rp1 m iÅæL€ñpÌÖnC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Åi mLæ€ñpÌÖnSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number6£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ 7a555fd372734b53a7b0faacbb6544af@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp2 t™ÚvN¦JK™Æ·ÏMC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ú™tvN¦JK™Æ·ÏMSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number7£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ 11737e5254f246b1bc8297abedc71e03@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp3 Ó.Ód-íE¾UˆÚH/1øC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ó.Ó-dEí¾UˆÚH/1øSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number8£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ 1c45c1db59f04560b6e373b5b3f48508@@@@@@@@@@@@Su  3Hi there! SÀ" Rp4 ¾I›½üq«N·à ˜æòí“C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜½›I¾qüN«·à ˜æòí“SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number9£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ a3eb3e3b59684f2ba88d337d9225a03a@@@@@@@@@@@@Su  3Ho there! SÀ" Rp5 $µÑ·Ÿ¸N€#ËäLQ`C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ñµ$Ÿ·N¸€#ËäLQ`SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number:£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ c313e4076d294fccb3117906cbccb8a6@@@@@@@@@@@@Su  3Hey there! SÀ" Rp6 †y„¼†4F°áÇa†z=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜„y††¼F4°áÇa†z=SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number;£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ 7b865139ae6548448cb832b4953674cb@@@@@@@@@@@@Su  3Hi there! SÀ" Rp7  â’j±rI¢^\¾ì¸[BC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜’â ±jIr¢^\¾ì¸[BSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number<£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ 0671cc17f07c4328a757560a6b858763@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp8 «Þj DO‚Ú…¦Kœ¿C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jÞ«D O‚Ú…¦Kœ¿SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number=£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 2c2434caad7d47edb11e852802e77742@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp9 ƒ=­¼ÛIŽZt`ÄuC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜­=ƒ¼IÛŽZt`ÄuSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number>£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ bf2dbf4e445f4b70a8fd21940a65e3a6@@@@@@@@@@@@Su  3Hi there! SÀ" Rp: B{°Ì¨B‰®ÔäíëˆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°{BÂÌB¨‰®ÔäíëˆSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number?£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 1af95c6d049240e7b66ef00714af278e@@@@@@@@@@@@Su  3Ho there! SÀ" Rp;  h†ú¯ÓÄB–üîæ¿§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ú†h Ó¯BÄ–üîæ¿§SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number@£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 1005ddc503f84f4aaf702adf6ca4008f@@@@@@@@@@@@Su  3Hey there! SÀ" Rp< Î2—{p~5J€}šðŽ›jC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{—2Î~pJ5€}šðŽ›jSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberA£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 9bb2253398f64adea274b0114dfdc9a8@@@@@@@@@@@@Su  3Hi there! SÀ" Rp= æ=§ƒVL£³í"]4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜=惧LV£³í"]4SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberB£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 602a8df4231a4ba5aa48625a66b8faa8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp> ÂlÎu½Ë¬A‡¯9c2ñîC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜uÎlÂ˽A¬‡¯9c2ñîSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberC£x-opt-locked-untilƒ`f¥„˜SsÀ/ ¡ 2d64836fbe984dee935428c18808bea6@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp? Qàe—†dpJ“4«_S‚¤ÁC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜eA2ÑÖDk»G>‚¤ÁSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberM£x-opt-locked-untilƒ`f¥„æSsÀ/ ¡ 92605924b77c4480b8d69f02601ef993@@@@@@@@@@@@Su  3Hi there! SÀ" RpI ñ‹Ü‰£5F…tîý^'[C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ü‹ñ£‰F5…tîý^'[SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberN£x-opt-locked-untilƒ`f¥„æSsÀ/ ¡ bbb047a607ad467fbd6e34f2462b869d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpJ T|dWÞþI»’0…RA§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Wd|TÞIþ»’0…RA§SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberO£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ ddc11f78ab6a409897b40d06d5e7262b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpK ^¹ ‡ªN‹M¬a#¿³úC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ¹^‡Nª‹M¬a#¿³úSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberP£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ 648de61a7b0d4dcea04b0ed877278e39@@@@@@@@@@@@Su  3Hi there! SÀ" RpL _ª Í­ÛÑC¯´ïZ¡ï;C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Í ª_Û­Cѯ´ïZ¡ï;SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberQ£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ f9adbd21c34946ee8a3984b2e32e211f@@@@@@@@@@@@Su  3Ho there! SÀ" RpM LY}=Ó*†M³(}³&Fá^C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜=}YL*ÓM†³(}³&Fá^SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberR£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ 8339b72a2ac6455abc3370f9c92162ce@@@@@@@@@@@@Su  3Hey there! SÀ" RpN .ÓWŽHÑvC­g ìç3,C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ŽWÓ.ÑHCv­g ìç3,SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberS£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ ce2f274feaec4f70b91d09eed3bddd19@@@@@@@@@@@@Su  3Hi there! SÀ" RpO š>NåÚÁC‚—ª[À¸›/C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜N>šÚåCÁ‚—ª[À¸›/SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberT£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ 653527ab84044d13a427e1baca67f3c0@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpP ¼å.MÏeF¾)•çr:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜M.å¼eÏF¾)•çr:SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ 519abdb61d7f420ba2f36e39bb3db0ef@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpQ Åx9|FRsG™Ï³xÓ¤C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜|9xÅRFGs™Ï³xÓ¤SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberV£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ fb5a0884a8c6441ea51718e0a661aaa0@@@@@@@@@@@@Su  3Hi there! SÀ" RpR r˜ÂÑH,°L¥ª–*xæiC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ñ˜r,HL°¥ª–*xæiSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberW£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ 07f8fb16fddd49c4b3c8f7c1ab22ade4@@@@@@@@@@@@Su  3Ho there! SÀ" RpS e³u­;*ºMŒƒæ9ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜­u³e*;MºŒƒæ9ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberX£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ 650f6d81885e4cdabb4b592e0646d34b@@@@@@@@@@@@Su  3Hey there! SÀ" RpT džI:?KŠï«ìÈâ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜I†Ç:K?Šï«ìÈâ SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberY£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ 75207c55e09f4beaa8c28a706ec232de@@@@@@@@@@@@Su  3Hi there! SÀ" RpU ôí® ìC­>'xbT C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜íô ®Cì­>'xbT SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberZ£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ c47b6a35cc134e658f12aa37d88df884@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpV –¼‚ªÈÐB’lß_Ê~C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚¼–ȪBÐ’lß_Ê~SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number[£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ ebafb73a5f7e4ac4a1d51b30d17838c1@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpW ñ3ÀùÖËM²Ä} ¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜À3ñÖùM˲Ä} ¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number\£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ dafd5e6d798445819eed719630728f49@@@@@@@@@@@@Su  3Hi there! SÀ" RpX mÜmYYäD…Ã9×à¾?C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜YmÜmYDä…Ã9×à¾?SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number]£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ 9a476888f07c435eada3ab1fbc28f785@@@@@@@@@@@@Su  3Ho there! SÀ" RpY 0S³h%iH¥0¶Y´´ç…C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h³S0i%H¥0¶Y´´ç…SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number^£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ fb7ebd9baa234a43a3e57fc21ed19bf6@@@@@@@@@@@@Su  3Hey there! SÀ" RpZ ²ÂÞ©q@ºh%@trC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜²©Þ@qºh%@trSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number_£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ c56111cdf1914729b9b4d1d40a91100e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp[ ØÊ>"møC°îíǯmbC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜">ÊØmCø°îíǯmbSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number`£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ 0482790c38bf4833b12b2964cefb8cd4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp\ H‚Îà0¾›H·â©”g j¡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜à΂H¾0H›·â©”g j¡SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbera£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ 2b4dbc3d4d0b4127a844cdb834072149@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp] ï@Ì=Ì»AŸˆv•}šAC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜=Ì@ïÌA»Ÿˆv•}šASrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberb£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ 91b6a4d551314d358d9f1a2fc9ead8cd@@@@@@@@@@@@Su  3Hi there! SÀ" Rp^ u a-¤:ñH¼‚yƒ±/7QC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜-a u:¤Hñ¼‚yƒ±/7QSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberc£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ 5bb798a0f56f407fb32f4aced9ab7b6b@@@@@@@@@@@@Su  3Ho there! SÀ" Rp_ @þA¾> H²âpʱÚ4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾Aþ@>H ²âpʱÚ4SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberd£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ 7e4da77629734338b421821736db8ccd@@@@@@@@@@@@Su  3Hey there! SÀ" Rp` ÿÝXIÌÐÅIŽe+™ÞùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜IXÝÿÐÌIÅŽe+™ÞùSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbere£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ ede20d5ad1e347599325619172beac8f@@@@@@@@@@@@Su  3Hi there! SÀ" Rpa Þ±l@‰è}M‹Ëòïkt@BC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@l±Þè‰M}‹Ëòïkt@BSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberf£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ a80a2c36a07d458e8bdfc5018418cc24@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpb Öÿ˜ÃíSO Í1H}C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜˜ÿÖíÃOS Í1H}SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberg£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ 4492376ecb1648efb9ee4b6893453099@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpc ¬Ìžú!ÔIµ©€“{˜²ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜žÌ¬!úIÔµ©€“{˜²ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberh£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ 3e1c68767862407e9a9e9d3870aa12f5@@@@@@@@@@@@Su  3Hi there! SÀ" Rpd Ã}4€îÀØE©D?Lš¶C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜€4}ÃÀîEØ©D?Lš¶SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberi£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ 68f57d9977eb4f8f8d65e0abea2fcaa6@@@@@@@@@@@@Su  3Ho there! SÀ" Rpe 7<—h¯»ÌH‹õ…äJëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h—<7»¯HÌ‹õ…äJëSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberj£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ c9aa539506a641d592f0f1692a6c4ac0@@@@@@@@@@@@Su  3Hey there! SÀ" Rpf MÙcÀƒþ§I¯Oò`˜Ø1C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÀcÙMþƒI§¯Oò`˜Ø1SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberk£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ d9c2ab8cf4f64518a275db31095e8c42@@@@@@@@@@@@Su  3Hi there! SÀ" Rpg û¬Ëÿ8:Lšïû—xC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ë¬û8ÿL:šïû—xSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberl£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ 5fe0bd2523664c5f87390a60a16e5080@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rph -”tCnÿNƒD õr-C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ct”-ÿnNƒD õr-SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberm£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ d577786be88e41c5bdb5ec6421544710@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpi  ¤¦ôþKG—[–…ß­ÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¦¤ þôGK—[–…ß­ÔSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbern£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ b893ca6baec74cafbf9d3889e8aa2509@@@@@@@@@@@@Su  3Hi there! SÀ" Rpj NCš8BüÙJ±?b±`yÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜8šCNüBJÙ±?b±`yÕSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbero£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ 426e348bd0b442b6aaf28349ec32488f@@@@@@@@@@@@Su  3Ho there! SÀ" Rpk YûÖwüÆêH¯pk¨›‰C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜wÖûYÆüHê¯pk¨›‰SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberp£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ aec5bbec59a64cabb871323b79fc912c@@@@@@@@@@@@Su  3Hey there! SÀ" Rpl ­a›cݸMˆ¹IÍ×lªC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜›a­ÝcM¸ˆ¹IÍ×lªSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberq£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ 6cf1d22a20cb44718704f632b663f760@@@@@@@@@@@@Su  3Hi there! SÀ" Rpm ÇB£>*7)K½ÌwlYC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>£BÇ7*K)½ÌwlYSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberr£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ 6d9988e933b34965bb6d4247fa5ac1c2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpn ¼0 ÄE|»Kž—¿è\¾0C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ä 0¼|EK»ž—¿è\¾0SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbers£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ cae36d3818a94ca0a12e5b9e4a9a1e73@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpo ä^•‹:ÙàN¨­Qà.ODÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‹•^äÙ:NਭQà.ODÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbert£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ a08aafd79c2745608b67419d0f9a842e@@@@@@@@@@@@Su  3Hi there! SÀ" Rpp ·èû ‘ñNm<uDêC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ûè·‘ Nñm<uDêSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberu£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ 6cc28418df78436faf166b756a90141c@@@@@@@@@@@@Su  3Ho there! SÀ" Rpq Ó¯¬sœ Mƒ›,¿9gÀ†C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¬¯ÓœsM ƒ›,¿9gÀ†SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberv£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ f1d50cdb4cdf46479dc40a37b95a1ad6@@@@@@@@@@@@Su  3Hey there! SÀ" Rpr …Ð?0EbkO¼âoNH©C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜0?Ð…bEOk¼âoNH©SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberw£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ edfea29f7c354106a353e2c20f55c4ca@@@@@@@@@@@@Su  3Hi there! SÀ" Rps ÏcÎ××1CƒdH²ÊÏÂC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜×ÎcÏ×C1ƒdH²ÊÏÂSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberx£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ 31d831e3d1814f03be9903e7dbe8f86c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpt þÄOh>‹ìIšÁ¼Ø@>åC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hOÄþ‹>IìšÁ¼Ø@>åSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbery£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 486b9a77939c46f4bcf89994c5bd520e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpu ”æ‹MF..M©ÆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”æM‹F..M©ÆSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberz£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 0969feee786c43aca37b2f0ec735d761@@@@@@@@@@@@Su  3Hi there! SÀ" Rpv ƒå:êú¤ E‰ÛŒË$qaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ê:僤úE ‰ÛŒË$qaSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number{£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 711e988fc2504fa5a52159c33f591804@@@@@@@@@@@@Su  3Ho there! SÀ" Rpw Ì*y‰•ŒUGˆî“SÖƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰y*ÌŒ•GUˆî“SÖƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number|£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ a693da10927c42478b528f385ccfd083@@@@@@@@@@@@Su  3Hey there! SÀ" Rpx Ñ„^!cCÄJºmG^ÃŽQ\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜!^„ÑCcJĺmG^ÃŽQ\SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number}£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 7af0c7c0d9ff48a1b7c95523cd35f4f0@@@@@@@@@@@@Su  3Hi there! SÀ" Rpy ÈkO1øK·o?Ž5vy‰C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜1OkÈKø·o?Ž5vy‰SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number~£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 680826af446243f89f9841b77509b6cb@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpz ƹ  5¦OŠzvC`6hC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ¹Æ5 O¦ŠzvC`6hSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ 57cf557907214318883c9d73dd09598b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp{ ¤ÈÚ߸§»IžôPQÍÔy(C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ßÚȤ§¸I»žôPQÍÔy(SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number€£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ 136ebcc72ced4412b4f84d2071498789@@@@@@@@@@@@Su  3Hi there! SÀ" Rp| ±žðU+FŠá†ÿ¯ÐCC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ðž±UF+Šá†ÿ¯ÐCSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ 6eaea7033c214f80a651e3b7defc4f83@@@@@@@@@@@@Su  3Ho there! SÀ" Rp} ÷8·ž>¬I¸ö¤¶§ÕgøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ž·8÷>I¬¸ö¤¶§ÕgøSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‚£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ b5cfe961723849318a07efdf536ec915@@@@@@@@@@@@Su  3Hey there! SÀ" Rp~ /p[W? K³ÄzÏ$^·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜[p/?WK ³ÄzÏ$^·SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberƒ£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ aed7595d2ce04c6e84c9f4b54154a1f7@@@@@@@@@@@@Su  3Hi there! SÀ" Rp #V˜„)O€8O2á÷C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜V#„˜O)€8O2á÷SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number„£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ adc378acd37b4865b4043cccb49afcbf@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp€ FÓ}„ULLƒü¬­79C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜„}ÓFULLƒü¬­79SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number…£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ bfa9c37793954385bf685eb3e62e8dd1@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ÛÛ4\õLº¤­9–öºC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4ÛÛ\Lõº¤­9–öºSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number†£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ 69932e0b86b745799a607d88d3af732f@@@@@@@@@@@@Su  3Hi there! SÀ" Rp‚ „âJ—•ÝA¹98ž~~²µC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Jâ„•—Aݹ98ž~~²µSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‡£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ 39413c18102743658efe4351725c536d@@@@@@@@@@@@Su  3Ho there! SÀ" Rpƒ õ!N[;´G˜´à3üå¶,C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜N!õ;[G´˜´à3üå¶,SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberˆ£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ 4211d7eac992432c8d659e8dab039161@@@@@@@@@@@@Su  3Hey there! SÀ" Rp„ Ã4[Ïá+L¤c —OåR³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜[4ÃáÏL+¤c —OåR³SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‰£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ e0ac40ff8b764ca28024d8b6f4b3a39f@@@@@@@@@@@@Su  3Hi there! SÀ" Rp… Á×ÍÂØ+E¿÷5&ë1zC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÂÍ×ÁØE+¿÷5&ë1zSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberŠ£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ 18d645d90b7e4527857c0106a25a009d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp† Ê0@KÃîþF©I TÓ€Q|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K@0ÊîÃFþ©I TÓ€Q|SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‹£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ 148c1ceb97b346d094f7ed6ff416a11a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp‡ ººÞð$©B…›m)`ä>“C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ðÞºº©$B…›m)`ä>“SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberŒ£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ 21e60487af14473cbd6ec54459cbbef4@@@@@@@@@@@@Su  3Hi there! SÀ" Rpˆ ØrcÂ}×Fˆ”`7r-ÖÇC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜crØ}ÂF׈”`7r-ÖÇSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ f23f39da000f46a0a8cb69abb87bc729@@@@@@@@@@@@Su  3Ho there! SÀ" Rp‰ ̽<Ù먩EºdòSÈZ˜LC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ù<½Ì¨ëE©ºdòSÈZ˜LSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberŽ£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ 06dbd3d95e8246b0a306e66b1ff07d25@@@@@@@@@@@@Su  3Hey there! SÀ" RpŠ '„—\¼D§GƒÞ#Z0fëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜\—„'D¼G§ƒÞ#Z0fëSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ 90bb8fe5e8664fa5b0c171ecf2385eed@@@@@@@@@@@@Su  3Hi there! SÀ" Rp‹ óØ&à?¿I‹pÀ˜vˆæC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜à&Øó?I¿‹pÀ˜vˆæSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ d01da4c17d374fad82a7c093bdb0188b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpŒ ª~ó‚Æ-”BŸl_PK‡¦~C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚ó~ª-ÆB”Ÿl_PK‡¦~SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‘£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ 912bbebe64334dd59e52ee9fef3310ab@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp œV”W§Ðà@”b¯8meRÆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜W”VœÐ§@à”b¯8meRÆSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number’£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ ef0f9d5850ff41ca850f1138a7c438be@@@@@@@@@@@@Su  3Hi there! SÀ" RpŽ æIxâÖP@œyUâÎÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜âxIæÖ@PœyUâÎÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number“£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ a85b88afa5584862a01e01675cc04c5e@@@@@@@@@@@@Su  3Ho there! SÀ" Rp l‹×]emC´î0ò’  HC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜×‹le]Cm´î0ò’  HSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number”£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ 3986c87884d04541bc63d8028dc3c13d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp b`(ÏMÊÜN™¨9d£?ÎC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ï(`bÊMNÜ™¨9d£?ÎSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number•£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ dcdf15688112471c88dc10f29aeb47b4@@@@@@@@@@@@Su  3Hi there! SÀ" Rp‘ ?–ðÕÙ+$OŒäD°ëxëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Õð–?+ÙO$ŒäD°ëxëSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number–£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ e028991f81dd4be2a8a72990e2c76bc2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp’ ñOaú™D„æt+|-q–C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úaOñ™D„æt+|-q–SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number—£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 30edcf484c174e88bb8ea2ae3dd2e08b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp“ –óþhVH'”±™zuTC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þó–hHV'”±™zuTSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number˜£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 50fd3fb4123e4dfd8b5e097a22d622c4@@@@@@@@@@@@Su  3Hi there! SÀ" Rp” »ð‡cá~B³Þ/¹‰"hìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‡ð»ácB~³Þ/¹‰"hìSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number™£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ a23bce9429f046399344be85403db60b@@@@@@@@@@@@Su  3Ho there! SÀ" Rp• MŸ¢ûv×›L¼ÑoUðšC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜û¢ŸM×vL›¼ÑoUðšSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberš£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 619549b376c3477a894023b18f3fd64e@@@@@@@@@@@@Su  3Hey there! SÀ" Rp– ðÅ»± ð½D¢ÿÙxy~.)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜±»Åðð D½¢ÿÙxy~.)SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number›£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 653c7dfa638c41eea352b9ce9511b159@@@@@@@@@@@@Su  3Hi there! SÀ" Rp— „¥{…¤H¦¼ßÒFÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{¥„…H¤¦¼ßÒFÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberœ£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 637c73f14bc0439c82068cea85f93d7a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp˜ Õ€9én-ûL™Œp¾²7šÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜é9€Õ-nLû™Œp¾²7šÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ c6b09cdbf84e4cdda2c12398bf2066c6@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp™ [xã>‚ÚbB®=øW鿳tC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>ãx[Ú‚Bb®=øW鿳tSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberž£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 31f48b62112e46719eca4ec904841e0b@@@@@@@@@@@@Su  3Hi there! SÀ" Rpš (æ7£rMC°Æ‚ –úC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜7æ(r£CM°Æ‚ –úSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberŸ£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 38045f42127c442c9d7291d059dca2b4@@@@@@@@@@@@Su  3Ho there! SÀ" Rp› pCßüQÖJH³ØãÄPáC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜üßCpÖQHJ³ØãÄPáSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number £x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 8893b6436fd74a5699a831de8c487dda@@@@@@@@@@@@Su  3Hey there! SÀ" Rpœ ¾BzfèN„ î[®ì=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜B¾fzNè„ î[®ì=SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¡£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 8bcea1a979f646f7aeba7c90cdbbc2c6@@@@@@@@@@@@Su  3Hi there! SÀ" Rp '"Á‚˜¼F˜[ß©,õaCC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Á"'˜‚F¼˜[ß©,õaCSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¢£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 1927b14318714a1b9fa7d10ca8a0b887@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpž R ÉßNˆjÓz‚C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜É RN߈jÓz‚SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number££x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 4b92b23ff9ec4d6f891e3f3c24474a6f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpŸ @«ñÿ0ïE˜×7•3Ù#"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿñ«@0Eï˜×7•3Ù#"SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¤£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 631ec385bb0e49f4a3c44c3519b33e56@@@@@@@@@@@@Su  3Hi there! SÀ" Rp  >*\ÃôgAK†›OåââgôKA†›Oåââ<SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¥£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 85a8b774051d44aabeb4569da3f7edd1@@@@@@@@@@@@Su  3Ho there! SÀ" Rp¡ Ý"n—ðzËC¢Ÿ›QϺÃQC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜—n"ÝzðCË¢Ÿ›QϺÃQSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¦£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 2259ae44561b44efb84d622f9043d438@@@@@@@@@@@@Su  3Hey there! SÀ" Rp¢ Ê}ôjåD‡*ôHLRHC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jô}ÊDå‡*ôHLRHSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number§£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 9ce5d4c86fdf4393b91a62cc07825c0c@@@@@@@@@@@@Su  3Hi there! SÀ" Rp£ Í/ˆÐ°ßHœa¼ Õ€LC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ðˆ/Íß°Hœa¼ Õ€LSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¨£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 30784821025d421b99c8e97b8a679553@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¤ ±zd¾‰ŒJ¦Lõ„Xo]°C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾dz±‰JŒ¦Lõ„Xo]°SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number©£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ 67b68a0da97b4f5d90e1b26ce46c6c5d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¥ ‚ƒqýæIF‹Ç[NV4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ýqƒ‚æFI‹Ç[NV4SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberª£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ f5f0d0d0c18a4b5892b2af14a4453e1f@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¦ VP0âfquCƒ†-Ù(0C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜â0PVqfCuƒ†-Ù(0SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number«£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ f69f253ce17e45a4a4ff31c07d1dba0e@@@@@@@@@@@@Su  3Ho there! SÀ" Rp§ Yíc4ÖÐrB½!•Yüo¢VC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4cíYÐÖBr½!•Yüo¢VSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¬£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ 2b7666a039744898a6e4bba808e8b734@@@@@@@@@@@@Su  3Hey there! SÀ" Rp¨ ØpýüŒF§ŸVÍpÒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜üýpØFŒ§ŸVÍpÒSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number­£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ 0ef38c1f0dc24359be8732f10f5d0d9b@@@@@@@@@@@@Su  3Hi there! SÀ" Rp© P%x]&b`Mž;°Q]×»[C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜]x%Pb&M`ž;°Q]×»[SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number®£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ 26e31930d6b145c9b50ef24070ae2c2b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpª ñ/ÊX¿Ü¬HŒáiŸÇ–C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜XÊ/ñÜ¿H¬ŒáiŸÇ–SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¯£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ 32baf8efe91e4bc29ee5624c417a156d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp« ¨€:^^î¼F… ƒâ`ÙðC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^:€¨î^F¼… ƒâ`ÙðSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number°£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ d94a25f8dee4474f99f116154a2cd125@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¬ ZA[¿’'J‹®1µeðû>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¿[AZ’J'‹®1µeðû>SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number±£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ 0abb27c1131c416e83def98954d97c79@@@@@@@@@@@@Su  3Ho there! SÀ" Rp­ ˆx>ý,½C¦´ ¨Öì°úC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ý>xˆ,C½¦´ ¨Öì°úSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number²£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ 8c441228f5fe4005bf5a843d90b76c2a@@@@@@@@@@@@Su  3Hey there! SÀ" Rp® “E ¤ G3Fi‘ÀíDå‡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤ E“G F3i‘ÀíDå‡SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number³£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ c66eaf951cf84a6b80bc83133e8b925d@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¯ ð¦D3&:eNš0øI1Z‚C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜3D¦ð:&Neš0øI1Z‚SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number´£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ 9cd09b92ecb642fb834e0f1520f542d1@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp° ðY¦ZrsNœ¢<¤ýoùÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¦YðrZNsœ¢<¤ýoùÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberµ£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ 19afa46b9c9a4ff48e3b6188c2369751@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp±  óåüÇÌF©~xÿ²uLC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åó ÇüFÌ©~xÿ²uLSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¶£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ 4c7f79e936c74e319912e925bdc4ac2e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp² v[A2÷J‘]!kª†ÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜A[v2J÷‘]!kª†ÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number·£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ f4ab574d1bac428a8bba691a49bb5c90@@@@@@@@@@@@Su  3Ho there! SÀ" Rp³ Ê0@`þ™.Dš.tÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜`@0Ê™þD.š.tÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¸£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ d67fb17a7a6b435a830d8c7cdd7e371b@@@@@@@@@@@@Su  3Hey there! SÀ" Rp´ 8MòˆH± ‘>å)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜M8ˆòH± ‘>å)SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¹£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ 5189e604ff2b4fe8bd691a6edbcdf631@@@@@@@@@@@@Su  3Hi there! SÀ" Rpµ A\5 à¹G²Ì‹RrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5\Aà G¹²Ì‹RrSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberº£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ 787c735ed44b47ba93b65cf28f052ccd@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¶ Œtx8ÞýB¤Šs™ñ¶ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜8xtŒýÞB¤Šs™ñ¶ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number»£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ 53645a6c3065425e9cf7e282f9fc9634@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp·  Éÿ±O¡ ºUr1ˆ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿÉ O±¡ ºUr1ˆ SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¼£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ 25aa4e15f8d24a5d92498d2f4ec513c3@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¸ ¡šã¥LJ¶÷+ÿó¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãš¡L¥J¶÷+ÿó¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number½£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ acfa03ecfeec464cb3c39e2106c6a0fb@@@@@@@@@@@@Su  3Ho there! SÀ" Rp¹ » Æ„žgL£ |È‘©dC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Æ »ž„Lg£ |È‘©dSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¾£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ 7fc686d892a549ac99138901391ab851@@@@@@@@@@@@Su  3Hey there! SÀ" Rpº Ù'‘K0xÜJŒ÷”g°k{C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K‘'Ùx0JÜŒ÷”g°k{SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¿£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ 2211601696ee43b7ba46d44ef2791ab6@@@@@@@@@@@@Su  3Hi there! SÀ" Rp» Ë£!IÔºC­E3 úk²·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜!£ËÔICº­E3 úk²·SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÀ£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ c24f9c84dfac45dfbfa7d75f497d517a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¼ ×ç¾PEDÂ=‘‘ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾ç×PDEÂ=‘‘ SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÁ£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 6e0a51c71312468bbbd6a5a8ed86d62e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp½ åüCAáCˆÒ yxlC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ACüåCáˆÒ yxlSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 112333264d3a4102b19a6b1ca6fbcd3b@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¾ UÒº‰ÛC­¡÷AWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰ºÒUÛC­¡÷AWSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberãx-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 8173360d7e594832aa4cb1fb7c20dedc@@@@@@@@@@@@Su  3Ho there! SÀ" Rp¿ Sé߈o£OŠ@Œ¹BÕ¨|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ˆßéSoO£Š@Œ¹BÕ¨|SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÄ£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 114d1167ce3f420c9e2f26174d2db230@@@@@@@@@@@@Su  3Hey there! SÀ" RpÀ š³~üI+B›¿rìaÒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ü~³šIB+›¿rìaÒSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÅ£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 434eddca7b8342b9b54bb9bc41283095@@@@@@@@@@@@Su  3Hi there! SÀ" RpÁ uëÎvðE¨B˦r†;C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÎëuvEð¨B˦r†;SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÆ£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 37941aefbb0d4e289d610d722f6471e8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ÛPzúãi@¬éž‡ºÙ9ŒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úzPÛã@i¬éž‡ºÙ9ŒSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÇ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ 7ff35f4f34f04777861116499a408cdb@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpà" ©*¤†GŽÉKlŸ¨C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜© "¤*G†ŽÉKlŸ¨SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÈ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ 3b19c8f8e747458fa1ec3f697d842945@@@@@@@@@@@@Su  3Hi there! SÀ" RpÄ ºØjÅ;o€M‡ødãÝ—C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Åjغo;M€‡ødãÝ—SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÉ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ e2bfc1f634214a029f8aba5ac6645153@@@@@@@@@@@@Su  3Ho there! SÀ" RpÅ ¯ì ·cSO²Zá¥>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ì¯c·OS²Zá¥>SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÊ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ e908ef6c4376446f82a6446e81701321@@@@@@@@@@@@Su  3Hey there! SÀ" RpÆ  .ƒöˆÂO–ÿIvý+©C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ƒ. ˆöO–ÿIvý+©SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberË£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ c05fde47fa2747f0a56882cabf9e384a@@@@@@@@@@@@Su  3Hi there! SÀ" RpÇ èšj*suC¹øtÂ÷ª½UC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*jšèsCu¹øtÂ÷ª½USrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÌ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ e43145ae5de74b029c05e4089b085e3d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÈ "TÖÛ-ïnM=šÁÓ”C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÛÖT"ï-Mn=šÁÓ”SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÍ£x-opt-locked-untilƒ`f¥ŒxSsÀ/ ¡ 8e58134ca46047d49dfaefe4b46c3a82@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÉ )·»G°~äK¢¬v±O|gC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜G»·)~°K䢬v±O|gSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberΣx-opt-locked-untilƒ`f¥ŒxSsÀ/ ¡ cf4b2bad521341e783e03118778c946e@@@@@@@@@@@@Su  3Hi there! SÀ" RpÊ çÖ¬í{N’SóºIã% C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¬ÖçíN{’SóºIã% SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÏ£x-opt-locked-untilƒ`f¥ŒxSsÀ/ ¡ a5ddaee4d0de4fb582258e6cccc829af@@@@@@@@@@@@Su  3Ho there! SÀ" RpË Š+) B´·©ëÖóC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+Š )B´·©ëÖóSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberУx-opt-locked-untilƒ`f¥ŒxSsÀ/ ¡ 86901e68368543c59ae709c82877ec2f@@@@@@@@@@@@Su  3Hey there! SÀ" RpÌ ÌÞ"¿<¶õG‘d7*YÒÎ.C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¿"Þ̶DŽVýÿ8ÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:Îë—KD>ŽVýÿ8ÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number×£x-opt-locked-untilƒ`f¥ŒÆSsÀ/ ¡ 5faa1af76e394104bd5da79b0ef870cf@@@@@@@@@@@@Su  3Hi there! SÀ" RpÓ kTå Ï2F¥Ó|ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ åTkÏF2¥Ó|ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberØ£x-opt-locked-untilƒ`f¥ŒÆSsÀ/ ¡ d0ee55e08dc74998969f3714a68927dd@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÔ e^_þí%èDƒlûä¿9tC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þ_^e%íDèƒlûä¿9tSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÙ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ f714c31c7aba4896ad2349d8438c50dc@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÕ {¸ºäg|E·}¬åV&WÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜º¸{gäE|·}¬åV&WÞSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÚ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ d6c759f332d3400c82188804f8e5342e@@@@@@@@@@@@Su  3Hi there! SÀ" RpÖ ä«°y ÛµK¾¹TPQ.C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜y°«äÛ Kµ¾¹TPQ.SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÛ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 0ba4ac26561948ebbfdb2563704374c1@@@@@@@@@@@@Su  3Ho there! SÀ" Rp× lÕ2qþºÊD³E"G3¹LC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜q2ÕlºþDʳE"G3¹LSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÜ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 75e0d1c552cd4d6da23f92c3d712b94b@@@@@@@@@@@@Su  3Hey there! SÀ" RpØ 2Ord—øE‹ i‡ñLKÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜rO2—dEø‹ i‡ñLKÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÝ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 91bbd851652d42088ff7c7eb4f32879a@@@@@@@@@@@@Su  3Hi there! SÀ" RpÙ ¯5‡€JB O±Í‘Ñt›fC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜€‡5¯BJO ±Í‘Ñt›fSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÞ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 9aee763ce29040f19a222a9c0f19892a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÚ  $YÙì}Aš¹î÷ϪC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Y$ ìÙA}š¹î÷ϪSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberߣx-opt-locked-untilƒ`f¥rSsÀ/ ¡ 36e8111bd0554634a345071a49be9236@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÛ T²÷Þ]L«TgÊ{à=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜÷²TÞL]«TgÊ{à=SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberà£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ 6451dcc418404ed28a2bb7c57ecf350d@@@@@@@@@@@@Su  3Hi there! SÀ" RpÜ ‡DÉ‚¶‚eL¡`:ÁAÑ8•C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚ÉD‡‚¶Le¡`:ÁAÑ8•SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberá£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ a83ca419440a4a26bb2629e3c47a1817@@@@@@@@@@@@Su  3Ho there! SÀ" RpÝ ò&êRͺIŸÒ?%xC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Rê&òÍIºŸÒ?%xSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberâ£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ 91d0d9bb627143ec984eda4c6a1cd97f@@@@@@@@@@@@Su  3Hey there! SÀ" RpÞ › Ddpƒ5MÔR˜­:£yC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜dD ›ƒpM5ÔR˜­:£ySrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberã£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ 9543e09285ee40a6b069f5f238d570ff@@@@@@@@@@@@Su  3Hi there! SÀ" Rpß „¿ÒL[Oš%ˆCêøq}C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ò¿„[LOš%ˆCêøq}SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberä£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ b386990d8448445f908b6667c77866cf@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpà r›Íñߨ¦Aä¿—þ¶äØC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ñÍ›r¨ßA¦ä¿—þ¶äØSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberå£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ dbf16ba9d2c048ba8d1e5213e970da06@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpá Þêæó­3K³Ft˜“=»uC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜óæêÞ­K3³Ft˜“=»uSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberæ£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ c2f7b8b42387451f974c4fdbccaa321b@@@@@@@@@@@@Su  3Hi there! SÀ" Rpâ z|ôÑîNˆu‘g™üÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ô|zÑNîˆu‘g™üÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberç£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ f74767b1407d42aba1b34c1409fec9ae@@@@@@@@@@@@Su  3Ho there! SÀ" Rpã 6m¬Ì ut@˜ê<"DcP:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ì¬m6u @t˜ê<"DcP:SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberè£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ 33181aa960a54a7fb91fb08dd2d9fe8e@@@@@@@@@@@@Su  3Hey there! SÀ" Rpä ~†&Gz7QDˆ ^¡Ôš2%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜G&†~7zDQˆ ^¡Ôš2%SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberé£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ 5ee5b1c27443453a89d34566478ec4e9@@@@@@@@@@@@Su  3Hi there! SÀ" Rpå x¤ÓçèøaEƒ¦—Øe…þC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜çÓ¤xøèEaƒ¦—Øe…þSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberê£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ d85b52a03640426881390f396a8c08d9@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpæ ýÀû È OŸ³|±¼6¸DC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ûÀýÈO Ÿ³|±¼6¸DSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberë£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ 3872c42ee15244d3b7277a0905311822@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpç  É»´T/I»µQ÷¨¯<-C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜»É T´I/»µQ÷¨¯<-SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberì£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ 4701cf5d70ed4dfc96b48266bf413ae0@@@@@@@@@@@@Su  3Hi there! SÀ" Rpè Ö¶ü $¢YO“e¹BŠ$'C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ü¶Ö¢$OY“e¹BŠ$'SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberí£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ f535c210ac0649d89437308ce6666dc1@@@@@@@@@@@@Su  3Ho there! SÀ" Rpé ^¿ÓåUl@Ÿ\æ>Î*pC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ó¿^Uå@lŸ\æ>Î*pSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberî£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ aacebdcbbbe04974907d8ad9724db662@@@@@@@@@@@@Su  3Hey there! SÀ" Rpê äÙV›¨HAˆÔ‰‚óa,C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜VÙ䨛AHˆÔ‰‚óa,SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberï£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ 267a5075eb894056b586b3bb043912cb@@@@@@@@@@@@Su  3Hi there! SÀ" Rpë ÔUìÊ¥«A“!™zåC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ìUÔ¥ÊA«“!™zåSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberð£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ 043bad9c3fb4408d8273254b008bf440@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpì 7–gE~Æ[@–`¨ú…u‰%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Eg–7Æ~@[–`¨ú…u‰%SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberñ£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ e5f6c3a3befa4bd1b8c09657f96d24c1@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpí (õg‚Ù!F”çFÕùæÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜gõ(Ù‚F!”çFÕùæÕSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberò£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ a16979b0c7974d1e8722e7a2ac7327ba@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpî ðÕ ³ê©F¯·…s 2<þC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³ ÕðêF©¯·…s 2<þSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberó£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ 4ddc94209d2a48cd9d6fd9536b651a33@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpï ªõ!•ÂéA»¤Ë›Ç¦’C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜!õªÂ•A黤˛Ǧ’SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberô£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ 42e45d2ab986484b901217ddac1b5a9f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpð P&hŽÙC’È Î¬Ð(C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h&PŽCÙ’È Î¬Ð(SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberõ£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ 978d42eb59bf4033812830d4a39b6f22@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpñ ãj–¥¾nC†W3ý¹tûxC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜–jã¾¥Cn†W3ý¹tûxSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberö£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ 82fba79dd5bf4b249dd5dc9d79462dae@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpò G§¼£ìDF‡6݃¸{›@C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼§Gì£FD‡6݃¸{›@SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number÷£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 396da32c3a8947b79c8567daccf381c7@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpó ÓµDRË,F@Ž|I ïÇ.C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜RDµÓ,Ë@FŽ|I ïÇ.SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberø£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 9b01f868100645c4902e8fd5a0a6ca06@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpô ™g5g'ÓBª7±ˆ9œ«}C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5g™'gBÓª7±ˆ9œ«}SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberù£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 137699977b1741eaa90c11444a53b3ed@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpõ aŸã:>GDžJ«ƒ¬àùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:ãŸaG>DžJ«ƒ¬àùSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberú£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 4d82454b1c48436a9e262c89fea04ba7@@@@@@@@@@@@Su  3Hey there! SÀ" Rpö Q2À·mãL¦v_%Ýè=™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜À2Qm·Lã¦v_%Ýè=™SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberû£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 6dfa3af2e01740db83a1ea39a145a4f6@@@@@@@@@@@@Su  3Hi there! SÀ" Rp÷ ô·ÄÇFnC̯¸ÑÇúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ä·ôFÇCn̯¸ÑÇúSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberü£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 599c4a5aa7b24994ba89e2c9b08da0c7@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpø Ò÷ò*ŒŒE«;Ëñx05=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ò÷ÒŒ*EŒ«;Ëñx05=SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberý£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ c098c3ec9c12492f849ba7ee7aab3fb3@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpù ZÎ>ÆBž<‰ÀF{µ>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>ÎZÆBž<‰ÀF{µ>SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberþ£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ 4fd8bd1220c54d7e9230ac8d8d4d8aa2@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpú á€*÷¶K/)8öC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜€á÷*K¶/)8öSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberÿ£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ ea04628be1704c61964bb18d726ea2b7@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpû kVíVþE•âOüŒõOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜íVkVEþ•âOüŒõOSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ a608d9eab4ce48339bf3c4dbe8294aa7@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpü  dî†;)N™7 CJ¯!ßC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜îd ;†N)™7 CJ¯!ßSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ 0d0cb6fe5b2a4b44bd52a74f4c5833ec@@@@@@@@@@@@Su  3Hi there! SÀ" Rpý }i·(tèFŒK;£ZLðôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜·i}t(FèŒK;£ZLðôSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ 5627c91b596148138186f4e9f3f4a135@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpþ 4üÝš;M„OøËŸ+ AC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜šÝü4;M„OøËŸ+ ASrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ 3268fe13af0948a8ba53ecf593426e39@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpÿ #Ià%YïH»ä†u4ÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜àI#Y%Hï»ä†u4ÝSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ e452d477fc4b476083f49abab999aab4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp a° KE™ lQçÅÒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ °aKE™ lQçÅÒSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ d0c98453c3ca40b1bec6f8a2922d68c9@@@@@@@@@@@@Su  3Ho there! SÀ" Rp ?¥ãÅ[A³,WÛ˜lC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ã¥?[ÅA³,WÛ˜lSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ 2fb1ea3796a8484c8769efbd9a2848de@@@@@@@@@@@@Su  3Hey there! SÀ" Rp Íšö±q¥‹Mœ_ƒÄƒÅªÖC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜±öšÍ¥qM‹œ_ƒÄƒÅªÖSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ 35149ed8b0c448b09d6cb3e415451b65@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ¨设ÿ@D­»—`”@­C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®è¨ÿ¾D@­»—`”@­SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ 6465f8ad488a495490021a556063e111@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp füI€”ÅL˜©6vâ†j¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Iüf”€LŘ©6vâ†j¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ 38822eadef534447824d52f1df266d1a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp r«hЯAžÒݳÿU*jC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h«rÐA¯žÒݳÿU*jSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ e0d684eca51a4087a9977b81825a52e8@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp "ìr¯@#N‚Ý›Â>¿ÍÎC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜rì"@¯N#‚Ý›Â>¿ÍÎSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ 1ac84f73229f4680aab93e18fc6d877f@@@@@@@@@@@@Su  3Ho there! SÀ" Rp Ò?.Nª¥¿‚p±C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼¦î?ÒN.ª¥¿‚p±SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ abb1dfa8e0314b96a085f771719abd72@@@@@@@@@@@@Su  3Hey there! SÀ" Rp +µ nßÁªN¸‰_é!?“œC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜n µ+ÁßNª¸‰_é!?“œSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ 3e70a12d3ef142ab843869dd22b5ad2d@@@@@@@@@@@@Su  3Hi there! SÀ" Rp  wÓ‹4Í N¦|ö:NC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‹ÓwÍ4N ¦|ö:NSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥GSsÀ/ ¡ 1a55ccdb37324ee8957398fbb4394784@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  Lçá`Á[.M‡ùI°9·>‰C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜`áçL[ÁM.‡ùI°9·>‰SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ eba5cdc452c14ce7962baf283535de67@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp  ~íW4áøEž‡šö¦Ù¡?C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Wí~á4Eøž‡šö¦Ù¡?SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 59175d6c221d4f5d9d60933201ec32c8@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp  ä¥;?^­DŠ’kuR_z\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜?;¥ä­^DŠ’kuR_z\SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 462a7808b1524491818a1cba727e5456@@@@@@@@@@@@Su  3Ho there! SÀ" Rp  å´Ñ`ްG°4ž@–Ú,C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ñ´åŽ`G°°4ž@–Ú,SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ b94470eda6c5455fb3acf71935ece29f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ㈑¸hIYS¥ ™òC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ˆã¸‘IhYS¥ ™òSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ cc31aeb4f2a544eeaeac2223b749fb74@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ÚnjfyÚTJ‚EŽ@s›ÓC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜fjnÚÚyJT‚EŽ@s›ÓSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 81d8460421774164ac95238b29713c0f@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ø÷;ôAC­Á襧{8C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜;÷øôCA­Á襧{8SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 5e64d56e674e44159f7a686e90afd438@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp 7‡Å?c·@º&ƒjº©ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Å‡7c?@·º&ƒjº©ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 0de8b8399e54456e97d5ff34e85c9d6e@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ÍzŒã½síF“-kIgr¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãŒzÍs½Fí“-kIgr¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 3185b0909c7b48c8849274be34c5bce9@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp [žuÔʺ‹BÏÝqí˜öÒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ôuž[ºÊB‹ÏÝqí˜öÒSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 0ed32855a83a4222a8689c1d85ff3a70@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ‘>,qxpHœˆV‰Ô+rC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜q,>‘pxHœˆV‰Ô+rSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ e1342725429b4f68b7242e41992f8954@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp  ÌÙIJ¿OH„ÑrÍ1þ©cC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÄÙÌ ¿²HO„ÑrÍ1þ©cSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 1921dbda02e441c096cbf41052ba5a99@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp j§1S,8dF¯2ÊSÀLP\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜S1§j8,Fd¯2ÊSÀLP\SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 3c4bed9995274187a5cac72c01774f0c@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp haTRiO³1=-F åC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜RTahOi³1=-F åSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 1e842fd3a601416aa677407f2f974403@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ª¦QÂéªsOŠë-œPôRFC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÂQ¦ªªéOsŠë-œPôRFSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 21a9ea597e384b7c93b9f194f3db5f6d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ZذšK_F­2ÝLBñ[C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°ØZKšF_­2ÝLBñ[SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ d55c6d181f1141759cb8ffe7cce1f0b0@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ¾’ÖhvßI®lUúÈã.C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hÖ’¾ßvI®lUúÈã.SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 5ba349c406f54bb19766daa158be46e4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp 8a)W³lÓA‚¾ù—§ÃÖøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜W)a8l³AÓ‚¾ù—§ÃÖøSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 70994474eaf34965be6d5ebfbf76d0c6@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ÑGôØžI´@Ù§ïC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜GÑØôIž´@Ù§ïSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number!£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 5f44931293c6433ba52e8d2fa7c501ca@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ~@½*òNI™*ÈÝ©ØìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*½@~NòI™*ÈÝ©ØìSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number"£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 176372ef59364c6394de20773fd28dc0@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ÆD®ýòšO©»nH-«eC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®DÆòýOš©»nH-«eSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number#£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 9a5ea7aa841c4889b34e36753f8ee47b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp qŽ~ lï@C ™ñÐ>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~Žql @ïC ™ñÐ>SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number$£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 83d206e1ffca49aeb6f0a585299f7e33@@@@@@@@@@@@Su  3Hey there! SÀ" Rp  §ýÕ)Ö>Ošéÿí½XkC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜)Õý§ÖO>šéÿí½XkSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number%£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 17f58b0657d74afa9e0ba8aac57f1419@@@@@@@@@@@@Su  3Hi there! SÀ" Rp! DnÁ;¿»OŸ(ª?¯ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÁnD¿;O»Ÿ(ª?¯ SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number&£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 1d988772ad7541eab0703b8904b6c065@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp" ÝH×awCbÌ»CóëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜HÝa×CwbÌ»CóëSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number'£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 70645150b3d64225a467d522b9a39638@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp# GÅ,„ùâOºÂ1ô>tÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜,ÅGù„OâºÂ1ô>tÔSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number(£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ ad1d09a6e57d41c887995628e39b6691@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp$ í}«·ôðT@”eƒ'üèC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜·«}íðô@T”eƒ'üèSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number)£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 1124737e583c479782e34c4879a2fcb6@@@@@@@@@@@@Su  3Ho there! SÀ" Rp% «·v*PÔmO–‚¬/A…C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*v·«ÔPOm–‚¬/A…SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number*£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 851c50b4e7994a7a8109939eaf8fc76d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp&  Ä/®ºCŽ>ŽØ!á/C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/Ä ®CºŽ>ŽØ!á/SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number+£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 04c81170b4da452a93abafefc697d332@@@@@@@@@@@@Su  3Hi there! SÀ" Rp' ᧃNNŽ"çßøŽÌOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ƒ§áNNŽ"çßøŽÌOSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number,£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 3414f7da4ef14f55908ea08a8ff3020d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp( ßÊ5Ï›_Kœ—G Ñ:EøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ï5Êß›K_œ—G Ñ:EøSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number-£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ f239c1f839f94a259496d0decb0dcb43@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp) Ú ôÃÅNœV^íïÊC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ô ÚÃNÅœV^íïÊSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number.£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ 9e950d61416c450796b3bde3e73d6ffe@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp* V™S/à¿ÑF€L•‘=ÖÈC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/S™V¿àFÑ€L•‘=ÖÈSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number/£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ fb6f3d8d5aa742a493ba84d2d21c2d03@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp+  •ƒ¾3ŒO´»P ­ùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾ƒ• Œ3O´»P ­ùSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number0£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ e6674f6f8536481f926d22b5fc7c1696@@@@@@@@@@@@Su  3Hey there! SÀ" Rp, šÕzµT«ˆEˆ0}LÖOÈC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜µzÕš«TEˆˆ0}LÖOÈSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number1£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ 53f32bc22ce34755858100a362eaf3af@@@@@@@@@@@@Su  3Hi there! SÀ" Rp- C§J¤ôÉJK‹˜#œ 9çYC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤J§CÉôKJ‹˜#œ 9çYSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number2£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ f91075b702414b8e900dcf432e0aedd3@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp. Íá ±(UM¤È|vS1¦C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ áÍ(±MU¤È|vS1¦SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number3£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ c262a834095c4db883162c3bf2aa9302@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp/ ñxxw·G®$“\³åC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜xñwxG·®$“\³åSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number4£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ baa1950bbd56477b9a7cb701fa86f17e@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp0 ÛjÆã|”ÒL£:˜rL(XC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãÆjÛ”|LÒ£:˜rL(XSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number5£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ 6513a3af59af475497b4d0c7a02f85df@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp1 ¬òg5L§¾ ¸ÿyTC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜gò¬5L§¾ ¸ÿyTSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number6£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ 31f8fefb308f426b8890f5eeb1542602@@@@@@@@@@@@Su  3Hey there! SÀ" Rp2  X¯ï L½êÑà¹üÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯X ïL ½êÑà¹üÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number7£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ 680a03dc4285440ab798a07f8eff0c49@@@@@@@@@@@@Su  3Hi there! SÀ" Rp3 è¹,Jv6JQÜ´Å–4ÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜,¹èvJJ6QÜ´Å–4ÞSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number8£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ 07bf5edfedbd468cbf4295c23a554d6c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp4 M„Cõ­êÇ@‘“LÂù–³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜õC„Mê­@Ç‘“LÂù–³SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number9£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ 9196724ef71042dba4f5f52efd6a83e7@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp5 ¥‰aÕõ –F±€NƒeôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Õa‰¥ õF–±€NƒeôSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number:£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ ad87afaec73841c49e00f5577163852c@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp6 Ÿý®ÇK¨D”XZõ9™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®ýŸKÇD¨”XZõ9™SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number;£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ 0a2909d7c3f6443093a3796960501cf6@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp7 >°MT™tI€Ä¤ÇëÀWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜TM°>t™I€Ä¤ÇëÀWSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number<£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ 2bab5dcabc3841d780a05d687d156f36@@@@@@@@@@@@Su  3Hey there! SÀ" Rp8 R‰/º»E¼‡*™ deC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜º/‰R»E¼‡*™ deSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number=£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ ec0923c15f884fb9a063c39bc7896af5@@@@@@@@@@@@Su  3Hi there! SÀ" Rp9 ú(å¾2Ï`F«4¢ã`t™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾å(úÏ2F`«4¢ã`t™SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number>£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ 0a9cca7276e94b328bea8995a8e91e5f@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp: )ÈÉà4 ¯§èe†$L¾3KE,ÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜e觯†L$¾3KE,ÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberC£x-opt-locked-untilƒ`f¥ÍSsÀ/ ¡ 5f0e095098134f48a974395913b841bb@@@@@@@@@@@@Su  3Hi there! SÀ" Rp? B}o3gVÏE‰HõW¾ZávC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜äü Æ1J÷‚û6Œi²>vSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberS£x-opt-locked-untilƒ`f¥‘ÇSsÀ/ ¡ 023d483c72bd4ac9923b97747e129ddd@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpO  k‡.D§M¼£ê|YÂrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‡k D.M§¼£ê|YÂrSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberT£x-opt-locked-untilƒ`f¥‘ÇSsÀ/ ¡ 697bf6094d06411ca4977a8aa032f6f2@@@@@@@@@@@@Su  3Hey there! SÀ" RpP Ÿxxþ| ŠJ„¤&øt _4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þxxŸ |JŠ„¤&øt _4SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥‘ÇSsÀ/ ¡ 31b1a8546d7844f098b6c57c68e51ce1@@@@@@@@@@@@Su  3Hi there! SÀ" RpQ —h@’üÔšNž`ï’?lC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜’@h—ÔüNšž`ï’?lSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberV£x-opt-locked-untilƒ`f¥‘ÇSsÀ/ ¡ 4022a64c4ab84aba95ff6d7f3c3969a8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpR ù®&nBûH­Þ^¢=g¼ëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜n&®ùBHû­Þ^¢=g¼ëSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberW£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ da8d8098270e416d933d44f2d82622c8@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpS 'ˆyýøBK‹ö!âOµ8JC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜yˆ'øýKB‹ö!âOµ8JSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberX£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ e0e59df5eab24a1b8553b42fb89edeed@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpT ÞÕFßÔC– cTtq&C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÕÞßFCÔ– cTtq&SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberY£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ a56c133cc8e94784a4bb045968a22469@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpU ,5¯‚3‘³J—é©Ne¨ŠC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚¯5,‘3J³—é©Ne¨ŠSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberZ£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ 2ab51e0ea1274e199e12fe8a19dcf9a4@@@@@@@@@@@@Su  3Hey there! SÀ" RpV |¦˜×Í3D¢ðk¡ÕbêÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜˜¦|Í×D3¢ðk¡ÕbêÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number[£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ f7da4884b4f14b1793711fa2b997805d@@@@@@@@@@@@Su  3Hi there! SÀ" RpW ðMM›¸²ØO’ø” fn0+C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜›MMð²¸OØ’ø” fn0+SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number\£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ ad1ed6c9c2534584a21fa614e1e55f66@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpX ÄÉPò SI¨ëÌséY]C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜PÉÄ òIS¨ëÌséY]SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number]£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ c6eecf4b353645ca81d79f9a3a991e2e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpY ûf–*8*8G˜ˆÁB ãT¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*–fû*8G8˜ˆÁB ãT¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number^£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ 21d241852eb144c69a7dbfee6ef91ee9@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpZ ^Úϯ™hMìG §ÓáC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯ÏÚ^™MhìG §ÓáSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number_£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ 6dd03069fa82494ba90acf9ec6be0db2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp[ ÑùÁ8išøG½x[sù› [C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜8ÁùÑšiGø½x[sù› [SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number`£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ b565e556ffc149babe1eedd0693a601e@@@@@@@@@@@@Su  3Hey there! SÀ" Rp\ OË??{gAª!Õ*ÚéÂúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜??ËO{Agª!Õ*ÚéÂúSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numbera£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ 3c874884cb1c49af9107671daf5b613e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp] Tüö{ŽEªtåë§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{öüTŽEªtåë§SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberb£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ d8e3742d4ce7418992c2ce81fb9d0ab4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp^ 7&:PÐAfF¾•N«íx—C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜P:&7AÐFf¾•N«íx—SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberc£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ e2186f1259ff4e75902dc619cff6b887@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp_ ¡Z"ÝŸ ©@±Ô¯% Šx÷C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ý"Z¡ Ÿ@©±Ô¯% Šx÷SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberd£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ 92ffbb7f715e4e85aedc200d241c881d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp` '¤<­WG‘rêóŸÆ²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜<¤'­GW‘rêóŸÆ²SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numbere£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ 0aad1b6d001846e3af01fa070f1de177@@@@@@@@@@@@Su  3Ho there! SÀ" Rpa ;YVøÙ‹K¸? *°5C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜øVY;ÙK‹¸? *°5SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberf£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ ed67a0288c804e8086c059ab8e62baf7@@@@@@@@@@@@Su  3Hey there! SÀ" Rpb ‹Kγ5O´Èd$ÇjMêC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÎK‹³O5´Èd$ÇjMêSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberg£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ e4b868c6576b44508429299b360432da@@@@@@@@@@@@Su  3Hi there! SÀ" Rpc \áWSCªï^{nSC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜á\WCSªï^{nSSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberh£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ 105030a7b49b4a7b8b431866ab26dbe1@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpd Æû ¨‹D˜–\öÌÕx_C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ûƨ D‹˜–\öÌÕx_SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberi£x-opt-locked-untilƒ`f¥’uSsÀ/ ¡ f1b4511895774d5799ccbd0caf9ab485@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpe ¨®ƒÌ)ÇI‰UUß´__C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ìƒ®¨Ç)I‰UUß´__SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberj£x-opt-locked-untilƒ`f¥’uSsÀ/ ¡ 85869c9156e340a890c57ff4316af570@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpf 9‚_~°Òê¾ðÐûB»^ éä„_C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ð¾ê>ûÐB»^ éä„_SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number|£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ 89659b61df2a47cbbd087714a8cee3c8@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpx #x~@O– 5}Y<ŸùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~x#@O– 5}Y<ŸùSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number}£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ e491a2cc42754accb4c23bfb477f4294@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpy ïèwˆ¿KL£pÕý79¤C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜wè￈LK£pÕý79¤SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number~£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ 072df25e914d4959830145d62ef3df9e@@@@@@@@@@@@Su  3Hey there! SÀ" Rpz UÛ-ï­q@­~´T™=¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï-ÛU­@q­~´T™=¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ 55e1a7de4742450a98718d2baded449e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp{ ¦¬BiYcB‹Úv¹÷ÑÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜B¬¦YiBc‹Úv¹÷ÑÕSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number€£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ fab93f675a5b4bb981527b54d2dda891@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp| üú†« N•4µ¸‘ ¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úü«†N •4µ¸‘ ¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ 4a0b8e2a2d054b3ebb4faa122637d0ae@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp} ÆâŒŠ¯åñMƒÜBƒÛB§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ŠŒâÆå¯MñƒÜBƒÛB§SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number‚£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ 2be88db13a074a61a4d001635dd389c6@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp~ ïÝÄìȽLH•*›ýÌ«ÕÐC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ìÄÝï½ÈHL•*›ýÌ«ÕÐSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberƒ£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ ddf5b88367a741ea8b34de072ff9285e@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp dbì@©¯»E¶wËVò¢ÏgC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@ìbd¯©E»¶wËVò¢ÏgSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number„£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ a9a263676ca147a59b2ce05e49604bab@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp€ Þ>šquJ´òç ï±C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>ÞqšJu´òç ï±SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number…£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ 7f976a1e527948e1811fad26b1e8fa48@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp [ô®ÇC È¡uÙoVC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®ô[ÇC È¡uÙoVSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number†£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ 17488fef89a94cc6bddc87a47fd4105c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp‚ ¥;PÞ}ŽL¶µîOOé9C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÞP;¥Ž}L¶µîOOé9SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number‡£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ 425502cd944049e28ae2b656e3644043@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpƒ ÍÄ QAF¼ÐÙ+·0¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ÄÍQFA¼ÐÙ+·0¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberˆ£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ 9d6a19c0d22d4a3fae447086670c459d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp„ ïl*‘HK„3B³ 7¸ìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*lï‘KH„3B³ 7¸ìSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number‰£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ f1163b7ddadb41d5894d93701e144efb@@@@@@@@@@@@Su  3Ho there! SÀ" Rp… sèN ýðK¾ZN,3ÞÆôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ NèsðýK¾ZN,3ÞÆôSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberŠ£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ 5392bd0956e040a9abb47c921913598d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp† ù,ªÀF¤ŒCRN×ÊC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ª,ùÀF¤ŒCRN×ÊSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number‹£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ 6834000aa763487492852ccef6c15260@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp‡ Ò °þ vM‚%ùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þ° Ò Mv‚%ùSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberŒ£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ d280da296ba6488eb20aec4c1708f636@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpˆ  ß 6·K¿&¥¸Qã½C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ß 6K·¿&¥¸Qã½SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ d0d6ded463034c19beaf00d763f033f7@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp‰ þP6ìÄýêC†,8ToóÿC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ì6PþýÄCê†,8ToóÿSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberŽ£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ 98dfea8d416d474fb39d5cc4690c341f@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpŠ Jµ^}í°­J¸F4<£)C½C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜}^µJ°íJ­¸F4<£)C½SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ 3159c9cc01b6417b88f84d885ae2ca37@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp‹ Õ‹¨_*,G’ä²>ûÿlC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¨‹Õ*_G,’ä²>ûÿlSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ ae5c4827585c4dab8321f14d86d2870f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpŒ E¹Î¤¿Å~M°[ÕâKÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤Î¹EÅ¿M~°[ÕâKÝSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number‘£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ 0691f33e4d684b32b1bf6b458d866ce4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ?éí¡¿–uM«Ú%»Ûîï­C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¡íé?–¿Mu«Ú%»Ûîï­SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number’£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ 4ffbbb94fa7442ff9103357e25a1642a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpŽ Ñ6ÍYoX @Ë[ûv*ãC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜YÍ6ÑXo@ Ë[ûv*ãSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number“£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ e904b86305f44a8b934a2158fe1a2033@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp Èþ³ cG¬êºGàËŽ*C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³þÈ Gc¬êºGàËŽ*SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number”£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ 2f10faaac80741c3854f4212b8e99d64@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ûsø¿õ¡A¤¡V ÕO‡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¿øsûõA¡¤¡V ÕO‡SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number•£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ e6565b5388f4423ead605b198eb20379@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp‘ Ôâg¬DñF— ¢¬–Q±ÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜gâÔD¬Fñ— ¢¬–Q±ÝSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number–£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ f447feed0fca424691464d80751259ac@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp’ × Μ(5§@Œqëëw][C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜œÎ ×5(@§Œqëëw][SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number—£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ aab4ecacb12940daba5a78d1feea585d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp“  b뵂J™C'@F+ÈC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜b µëJ‚™C'@F+ÈSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number˜£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ e7b5dc7c9837457fbdde44655bb60265@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp” m,T¶báæLª‚‚æ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¶T,mábL檂‚æ SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number™£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ b22ce84951094021b525d4dcb00fe719@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp• [}CUÖÑ5@ŠÎÔÀŸiOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜UC}[ÑÖ@5ŠÎÔÀŸiOSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberš£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ 3b59dfbe6a1a47849e926d283783c7f5@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp– Ö âHn(ŒE›\Ø4ShŽÁC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Hâ Ö(nEŒ›\Ø4ShŽÁSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number›£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ a1867a1aa7c64f6aae6eaae5db528c75@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp— Ƶ°ìe{zC˜Õ5u#ž C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ì°µÆ{eCz˜Õ5u#ž SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberœ£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ e22ca95313814b37895dcbd258b040a8@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp˜  àÔRÊ'AL’*ÁŠËßC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜RÔà 'ÊLA’*ÁŠËßSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ d3d1b161845d4e81b03bd9d035659265@@@@@@@@@@@@Su  3Hi there! SÀ" Rp™ 7aú/C^mB¿¾jBP #C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/úa7^CBm¿¾jBP #SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberž£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ 489f071dd43d4c88abe7bb1d483c1c72@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpš  Ñ#ãÊNM¡S(ÝÃOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ã#Ñ NÊM¡S(ÝÃOSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberŸ£x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 29c3defe62ca496bb190a49b6f949313@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp› rgbܭѬK·†õf“³6"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÜbgrÑ­K¬·†õf“³6"SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number £x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 5a8201d5940c4635b2511ffd9d3a0b52@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpœ „•|”¦>ÒM°©!w4-ïÆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”|•„>¦MÒ°©!w4-ïÆSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¡£x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 2892990673a7488995664a715f9941b2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp hT0wB£ú • Îh”C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h0TBw£ú • Îh”SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¢£x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 663fc790cdf3401fbc4db9de7d632e4f@@@@@@@@@@@@Su  3Hey there! SÀ" Rpž c‰}‘]êI¢\«(þÇ÷EC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‘}‰cê]I¢\«(þÇ÷ESrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number££x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 9f8188cc13bf492cb1427936a269ed25@@@@@@@@@@@@Su  3Hi there! SÀ" RpŸ ÁÞ&î„£yM‚Õ7J³kª¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜î&ÞÁ£„My‚Õ7J³kª¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¤£x-opt-locked-untilƒ`f¥” SsÀ/ ¡ b2969854a2674fa39be214c2bb2b68ec@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  (¡å«rZG¢¢Rå>BÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜«å¡(rGZ¢¢Rå>BÔSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¥£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ f7bbfd9e554d4a3f9bdea6db6889289d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¡ ^dÅ,A”ÀG™í> Š;ôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜,Åd^”AGÀ™í> Š;ôSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¦£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ d5d5f1e59ddb4b3d94012d743d2589fe@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¢ dñèfݬK±ìP‡"³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜fèñdÝK¬±ìP‡"³SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number§£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ 66337d8b097948d4bf96a0be4558bcbd@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp£ ~˜öVõ*F›•jÍi½[„C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Vö˜~*õF›•jÍi½[„SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¨£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ d92af4e591034c8eb953dd0034e69144@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¤ ^Ú :ˆ—]G‘ï¢]š‰×ÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜: Ú^—ˆG]‘ï¢]š‰×ÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number©£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ 94fcbcf24c5743b39a9eb1c90a495de3@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¥ ›W\‚q»N­×XpéòçC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜\W›q‚N»­×XpéòçSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberª£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ d6707e7d644a43cdafe5bb1b3e680953@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¦ þ‡©è1E«–*ms g'C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‡þè©E1«–*ms g'SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number«£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ 01f24d5e6dc1459b8a3d2cdcf6e630f6@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp§ ÿ]Jk–eB—“Ïû¥1€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜kJ]ÿe–B—“Ïû¥1€SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¬£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ 8b6ad48a368f496a8ce8d9129ea8c8e4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¨  Xo°iãwB„®H½eC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°oX ãiBw„®H½eSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number­£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ 70b9ab13d65a470c801aba222320497a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp© ÍS~©SÔC¸ׂJx•fC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~SÍS©CÔ¸ׂJx•fSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number®£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ c61aa096e0d945a886167d3ece46ec67@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpª Åx?!ïD·ç.,ìB C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜xÅ!?Dï·ç.,ìB SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¯£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ fffdf33f9f62410ea09ed3226aea14dd@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp« b‰ð!'xF¤þpsÐŒ§ØC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ð‰b'!Fx¤þpsÐŒ§ØSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number°£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ f44d0beb61204ea2a6ed35f7e244d423@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¬ S#l&ÜB•Á- ïûôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#S&lBÜ•Á- ïûôSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number±£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ 3cb74b14fbbc442ea33b1170f5436141@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp­ ’ eRãmO¢<ô|š#ÔìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Re ’ãOm¢<ô|š#ÔìSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number²£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ 1b428482f3da45ec8e99a4a9bcac7f83@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp® kžXÖcqF•+ m C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÖXžkcFq•+ m SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number³£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ dd43e092b495423f913cbe5f6aa71659@@@@@@@@@@@@Su  3Ho there! SÀ" Rp¯ *²éñüG¥=:œC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜²*ñéGü¥=:œSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number´£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ 5db7c237020e44cb9b4a46f3f2844aff@@@@@@@@@@@@Su  3Hey there! SÀ" Rp° °œ+L)úJ´k5@X“ÇîC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜L+œ°ú)J´k5@X“ÇîSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberµ£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ 565d6d4e5af541f19104157697826ff8@@@@@@@@@@@@Su  3Hi there! SÀ" Rp± Ô+]ur)gF¸i©Môv5C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜u]+Ô)rFg¸i©Môv5SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¶£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ a5d1952ca7d4441c98b9e689960c3343@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp² ’¬¼=¢ŠtM¿tU«¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜=¼¬’Š¢Mt¿tU«¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number·£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ ba3c49feadf240938fe3a966a2fc811a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp³ cÙ€¢°ECºÆŒÈÀøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¢€Ùc°CEºÆŒÈÀøSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¸£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ 1e80fe3b126c47e7a6a5e9feddfb2a84@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp´ gÅë âs@¹_|4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ëÅgâ@s¹_|4SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¹£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ 65a7e870b5fe46f89f7a9dd1467dd4ce@@@@@@@@@@@@Su  3Ho there! SÀ" Rpµ hÊ%+Éû°O‰áÍ~ò®ivC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+%ÊhûÉO°‰áÍ~ò®ivSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberº£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ 12b1d88797cc4e3aa9761ec4adc8f6a2@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¶ ’}j”¸ÜG¯eëáýãøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜j}’¸”GܯeëáýãøSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number»£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ e628453574074820b0d7e2659790d664@@@@@@@@@@@@Su  3Hi there! SÀ" Rp· ”<FÎB²òXœ8%jC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜F<”BβòXœ8%jSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¼£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ c6917bc1bfcc42f8be9656f8d5e5e4ac@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¸ ºÂë¦ô—”Dƒ>õE½C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¦ëº—ôD”ƒ>õE½SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number½£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 3c58df00f7d042f1a8f957842ed1cc6e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¹ ÁÝq‡i¥B³ŽÅèA„ünC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜qÝÁi‡B¥³ŽÅèA„ünSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¾£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 7709e4bf90e64855bec1186a5be2088c@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpº jemé‚IC°Çi¼ÞóÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜émejI‚C°Çi¼ÞóÔSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¿£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 8db6e73131a741c38a2b5470423d151a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp» s]ZY–êmBs6âøc ®C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜YZ]sê–Bms6âøc ®SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÀ£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 9aeba14b22004fed81b39b77c7848b79@@@@@@@@@@@@Su  3Hey there! SÀ" Rp¼ Â¥ÇÂßG’€‘ª^fC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ç¥ÂÂGß’€‘ª^fSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÁ£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ a2b7a5a8fc5a48b5ac7847148b24877c@@@@@@@@@@@@Su  3Hi there! SÀ" Rp½ ƒ|>€ñ%A¡ñ檥@ˆ†C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜€>|ƒñA%¡ñ檥@ˆ†SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 2715af4992484b9dbc49074b3a1f5a4b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¾ W¿•‡ÁÛMJ”pÌ¥g`”C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‡•¿WÛÁJM”pÌ¥g`”SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberãx-opt-locked-untilƒ`f¥•SsÀ/ ¡ 717768a46be1427abe65804f4f2bc271@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¿ 72< ×dI¨E®"x•àC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜<27× Id¨E®"x•àSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÄ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 4be9cfda917144f3b1a5e7d1345af706@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÀ ÀƒÔ”YhJ·SçÑ$ÖãËC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”ÔƒÀhYJ·SçÑ$ÖãËSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÅ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 340ceb2d61f64511ad6fc668bbc4447a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÁ ´?ÐñzèùFºð¡V†¶ÀC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ñÐ?´èzFùºð¡V†¶ÀSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÆ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ ef4e44c7b43247c2af2df6e3aa3274ac@@@@@@@@@@@@Su  3Hey there! SÀ" Rp µèÖd»žL–¼×]]TOÿC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Öèµ»dLž–¼×]]TOÿSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÇ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 89b8ca99735c4cfca9c72e21c5bfc3b3@@@@@@@@@@@@Su  3Hi there! SÀ" Rpà¥Çpú?ÂðD¤Â·ËwOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úpÇ¥Â?Dð¤Â·ËwOSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÈ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 5934c26da4bf49c8a0bd1cadb4966d1e@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÄ &xìË#ÒËN¼.Ž®ðñC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ëìx&Ò#N˼.Ž®ðñSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÉ£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ 0d6dd29ed44849c0abc95c36ad386ed3@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÅ ÁPÝãï‰ÝEžª;2BÝÖC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãÝPÁ‰ïEÝžª;2BÝÖSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÊ£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ aa29211d04184741919e17beb65edd8f@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÆ ¦ð;Ú*D¨~lá2…‘‹C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜;ð¦ÚD*¨~lá2…‘‹SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberË£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ 2091c06408b64375aa26a99db0b3eed9@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÇ ¦T7j•¯L²ƒÀu˜òC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜7T¦•jL¯²ƒÀu˜òSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÌ£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ 96ef14d8ca1042d682230dbaa239724d@@@@@@@@@@@@Su  3Hey there! SÀ" RpÈ `§k@ÄL¾?#÷¥'ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜§`@kLľ?#÷¥'ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÍ£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ 8a60c2329c5d403a8430fc3185869dab@@@@@@@@@@@@Su  3Hi there! SÀ" RpÉ íâ;}:¥H˜IeZÚbBRC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜;âí:}H¥˜IeZÚbBRSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberΣx-opt-locked-untilƒ`f¥•4SsÀ/ ¡ d076ad6eac4540479bc510601eb87990@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÊ [¶š<Û¤I0;è©>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜š¶[ÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÏ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ 83a7f2ec54b742c2804e9a99935ae489@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpË ¦u޼€åÒI…z;þ¶Ã½òC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼Žu¦å€IÒ…z;þ¶Ã½òSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberУx-opt-locked-untilƒ`f¥•cSsÀ/ ¡ f22da8c9c87b4cb786e9bfa085d1e634@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÌ ìÕO^kBûO”’Wø‘HÖC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^OÕìBkOû”’Wø‘HÖSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÑ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ 00a939d662454514bb807f09039a8b7a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÍ 8³Êåú3@šÜˆl­å‡lC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åʳ83ú@šÜˆl­å‡lSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÒ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ bf3ccc1b9a6740378c2fb0a284e77f62@@@@@@@@@@@@Su  3Hey there! SÀ" RpΠÁ›™Þq“ K¢cÅx˜ÆdC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Þ™›Á“qK ¢cÅx˜ÆdSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÓ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ 8dbfb9fd75f04487bd7f572007aa3fd0@@@@@@@@@@@@Su  3Hi there! SÀ" RpÏ ðë€~Û>±J’øèDóZmoC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~€ëð>ÛJ±’øèDóZmoSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÔ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ c6704fde073b4bd8a360f9a6ff4768f2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpРª|Š1\A²I¸(þ »:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜1Š|ªA\I²¸(þ »:SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÕ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ e3bb9e63b0674176b3a6a2edf1e1ed2d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÑ ‚Æ ÏÛ¼‹E¦šaÄè¡¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ï Æ‚¼ÛE‹¦šaÄè¡¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÖ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ d754ba81e82a4fb593a5bedaab6e72b0@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÒ ÚˆëwæÇÂO’,÷šÁ½ –C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜wëˆÚÇæOÂ’,÷šÁ½ –SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number×£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ 7660d3d55d014f6fa3ea7a190d5b489a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÓ χ)~–WEžp) ª$mC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~)‡Ï–EWžp) ª$mSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberØ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ f97c3b4e480e47d9ba18d20fe8e4bab4@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÔ +7ƒ‰'ëBåûm±C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰ƒ7+ë'Båûm±SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÙ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ b93d78b09ff34782aef9eda564603c27@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÕ ½†9({DB ù²Å´¢›±C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜9†½{(BD ù²Å´¢›±SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÚ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ a706f26ab0d846dd9f15918430a99732@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÖ ÙÇ»NO GˆsóÅß"]ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜N»ÇÙOG ˆsóÅß"]ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÛ£x-opt-locked-untilƒ`f¥•ÁSsÀ/ ¡ 5e65abf215424d4cb0c91a5aadf17a5a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp× ½jIɲA„G¤ )eNC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÉIj½A²G„¤ )eNSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÜ£x-opt-locked-untilƒ`f¥•ÁSsÀ/ ¡ 0b30d2807ca24b8486d4ba3beed87654@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpØ „eÛá™1äC·¼ÈV´-ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÃÌ!¸æDªU>ÈV´-ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberæ£x-opt-locked-untilƒ`f¥–SsÀ/ ¡ 0e7f712f8ac244b8b97bb47f0e7c5b8d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpâ تN­(¹êM‘Y9ÿ$cŽC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜­NªØ¹(Mê‘Y9ÿ$cŽSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberç£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 20eaa9a4855d405d9b5e9b26d60f1d00@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpã ŽoèTøe E¼vôIC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜TèoŽeøE ¼vôISrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberè£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 6abee82d88384c10b1071778712c68b5@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpä ÙÍ…ÁNJCˆý»ÿ‡XhC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Á…ÍÙNCJˆý»ÿ‡XhSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberé£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 7c9cd21953394e3d89d6584cea623a02@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpå ©“ÈDÚ %G¢óUµÀ´œJC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜DÈ“© ÚG%¢óUµÀ´œJSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberê£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 1b443f5fa4ef4648a158b2036670073a@@@@@@@@@@@@Su  3Hey there! SÀ" Rpæ ÁK127F@¾1o,²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜21KÁ7@F¾1o,²SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberë£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 4c49b0073da84f25a0244ca670efe72e@@@@@@@@@@@@Su  3Hi there! SÀ" Rpç òB{ÐÕÓJ¡b•Ë WÂC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ð{BòÕJÓ¡b•Ë WÂSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberì£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 40fcbdb23f8d450d93891dc4ec3ec637@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpè çkû× t‘KŽã`b%¬×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜×ûkçt K‘Žã`b%¬×SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberí£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ 036046deb9774666aeaabf16eafa6ef5@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpé ›…çbyÑ[Nœô‡’( ÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜bç…›ÑyN[œô‡’( ÞSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberî£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ 99669e48e3a54f659fac27949a1f6769@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpê S•mS‚›F‘ ÀáºÍfÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜m•S‚SF›‘ ÀáºÍfÝSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberï£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ f2e8fbce0be3470586512a790d1a6830@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpë j[Åq4KEÄvœÒ‡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Å[jqK4EÄvœÒ‡SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberð£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ da0ae1dd5dad4914aa11ef99de7abb2f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpì )Ú¯µ©oLŒ<޹º¸è^C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜µ¯Ú)o©LŒ<޹º¸è^SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberñ£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ ae54458ff97a4c22b30f3230e2aa870a@@@@@@@@@@@@Su  3Hi there! SÀ" Rpí Œé¤æ°ÿAŠ»< U"3¨C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤éŒ°æAÿŠ»< U"3¨SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberò£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ 2184a1504b6d490aa6a6e4b274e46d27@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpî Ad„Þ_ÿ’Iª}–ÁÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Þ„dAÿ_I’ª}–ÁÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberó£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ 9b91f6aacf70450bb36bf07cc9588dac@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpï oEO°`Eàfô¦µ“(C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜OEo°E`àfô¦µ“(SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberô£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ 9c42ff2a7d334c8e9a168e131369a297@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpð å Ú3d~C·?PD™Á­¹C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜3Ú å~dC·?PD™Á­¹SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberõ£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ e756b252dd8b45b89ac4614e6a7f8b91@@@@@@@@@@@@Su  3Ho there! SÀ" Rpñ ç&F´œ·B‘cÇGši8)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜´F&çœB·‘cÇGši8)SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberö£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ 5d9e4fed9c8841f9ac856355206ae1e8@@@@@@@@@@@@Su  3Hey there! SÀ" Rpò zíèÕãEûF¡zâ÷ætC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÕèízEãFû¡zâ÷ætSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number÷£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ a707996655e846078df696374be3200f@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpó ¦ÁÛ±WI®}×IL:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜±ÛÁ¦IW®}×IL:SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberø£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ b423e35ac3e64217809b26daa95471d4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpô üyÜú„¬Lˆ=s‡‚kaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Üyü„úL¬ˆ=s‡‚kaSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberù£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ bc9490b246924d1f9425da265d8cf0d9@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpõ ^]æ/nòFH†lI×Lä+C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/æ]^ònHF†lI×Lä+SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberú£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ 839c628a652e4810b07dd78a23f80964@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpö ã pƒlÏÇF¼jÞ-ŸlÕJC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ƒp ãÏlFǼjÞ-ŸlÕJSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberû£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ be39ea4945f3400589bd77a7820a40d0@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp÷ ¿A’¾ëzG¾¤[á%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾’A¿zëG¾¤[á%SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberü£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ 9ff1907d07af4966aa8f44bff9e6014e@@@@@@@@@@@@Su  3Hey there! SÀ" Rpø a:Ž—.%M··ãËjä×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜—Ž:a.M%··ãËjä×SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberý£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ 4b7741a1fd574b4bbb714c32cbb0b501@@@@@@@@@@@@Su  3Hi there! SÀ" Rpù ƒ®šúë*A‹üsð•„C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜š®ƒëúA*‹üsð•„SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberþ£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ fdd88cd95d1b439ba28c642f268469e1@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpú #6¶ÙÍ#ïB®wX¼Í×iûC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ù¶6##ÍBï®wX¼Í×iûSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÿ£x-opt-locked-untilƒ`f¥–êSsÀ/ ¡ 7939b9854c6b46919e7cea62f3dc98d5@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpû À¼' ¬M¥KCC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Á¤Ôü¯Já›ÊÇA>KCSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—SsÀ/ ¡ 296e6ba15ac74c51941e52378388e9ae@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ë‰³+œKš4(H㱸]C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰ë+³Kœš4(H㱸]SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ ba8a8f356f3d4240997deeaa42f7e5be@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ¢“Œ[@ôòE²‰g‚êwÁC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜[Œ“¢ô@Eò²‰g‚êwÁSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ 025c69be6e5544de948f78c53cbf3cf0@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp rÂ³ÏØi_A¼²“DÚ€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ï³ÂriØA_¼²“DÚ€SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ c15045efa07a483da00dc3355fc59711@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  gÆäžÏMª°I3å*EC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜äÆgÏžMª°I3å*ESrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ 4fae76a81a7f4e6e8e6263f480e15e32@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp  5§@$V2åAh„lÃïC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜$@§52VAåh„lÃïSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ 3050ba68f4154b349e21e5ea2a85e4e1@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp  í þåÉ $Hºš„±ëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åþ í ÉH$ºš„±ëSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ 3f51b158dd46453a9ce879f0c4846d70@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  Š Ñ—µ±7A“ˆ‘n°éC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜—Ñ Š±µA7“ˆ‘n°éSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ c87d6b35f70949119c29833590b3ab1d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp  Ð Ù*„ÃëM¶ÏR軨w\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*Ù ÐÄMë¶ÏR軨w\SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ ea25bd71c6ca43e0bcab9fc1b228a496@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp H`.R#MK¶á ½ †C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜.`H#RKM¶á ½ †SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ 843abd4414894823b6a59ce0f62fa429@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp T=dÛÎñšM k¾ Z‚C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ûd=TñÎMš k¾ Z‚SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ 4c6e578d4e024e13916b9ad06a7b8f08@@@@@@@@@@@@Su  3Hey there! SÀ" Rp ñ;å‹E‚.D¥Øª&?z³ùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‹å;ñ‚ED.¥Øª&?z³ùSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ 516987c6da1c443faacb27738c5bffbb@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ¿ëXv*`I«Àiâ‹C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Xë¿*vI`«Àiâ‹SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—wSsÀ/ ¡ 4906a1a0e0974c549ae3cf780faf1b1b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp Vó¼šÓ®Mµ9¼ì " AC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼óVÓšM®µ9¼ì " ASrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ 37695c45fc5d49b4b7d195177fcc1bdc@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp Kþ.î£1 C§¸[T[ÆAC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜î.þK1£C §¸[T[ÆASrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ 9df38ed59faf414db7a0f6de45fa2e11@@@@@@@@@@@@Su  3Hi there! SÀ" Rp 9d@üÖýsH¹â˜3a:\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ü@d9ýÖHs¹â˜3a:\SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ 363af49c66b9414b9cb96e8b89803739@@@@@@@@@@@@Su  3Ho there! SÀ" Rp =6—¾šM¥H´+á¿”Ö°C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾—6=MšH¥´+á¿”Ö°SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ e4c6c8e3fb0746118db4bd81e70906d4@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp kéZúª,Lªh]rEøwC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úZékªL,ªh]rEøwSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ e4a22423d9224cf896bdc486fa9b5040@@@@@@@@@@@@Su  3Hi there! SÀ" Rp Ýb¹”¡ƒgF¬¶Š¯ GhC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”¹b݃¡Fg¬¶Š¯ GhSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ f08b79866799457eaa738721399cebd8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp €v¶¦ «kB—HÜ—­J¾ÓC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¦¶v€« Bk—HÜ—­J¾ÓSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ 1e2f202dbfb64da6a0088d5bf5f0bd58@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp L‹@ðjlIªÐåB¢ÙG–C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@‹LjðIlªÐåB¢ÙG–SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ 4cff2d4bd2a14eb298b508d2385ad7c1@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp Á€UÁ D¿Çv†^„C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÁU€Á D ¿Çv†^„SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ 940b1f78cda142688a5a2fd72e9b127e@@@@@@@@@@@@Su  3Ho there! SÀ" Rp -ÈøFó|ØJ®+t¾GNð²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜FøÈ-|óJØ®+t¾GNð²SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ 4a67be7715c54f239900332b50cdfe20@@@@@@@@@@@@Su  3Hey there! SÀ" Rp Åã8»pÆÕK’N¿OY¾q&C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜»8ãÅÆpKÕ’N¿OY¾q&SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number!£x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ f978f04bbedd4084abff5ad32a100274@@@@@@@@@@@@Su  3Hi there! SÀ" Rp mMvÿˆ E«^6U±c€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿvMmˆE «^6U±c€SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number"£x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ 29d1b6a7bb834fedaa915fd55d24af8a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ´îçÖ=¥H«ñ(,·mÇC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Öçî´=H¥«ñ(,·mÇSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number#£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ d13db326d34b484ab2664c0489e3c914@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ݼCæ ÂïFŸ­SâC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æC¼Ý FSâSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number$£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ dab10483ede14f559a7eeafa74c85b31@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp  b…ø xÊG¤Æ ¬jbZ—C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ø…bx GÊ¤Æ ¬jbZ—SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number%£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ 5dbc97d20ca547529fa9f5da693045ee@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp! ÉnÔ&KŠÍ«†&™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÔnÉ&KŠÍ«†&™SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number&£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ aa97846421cc4651afbc15938d25ec5a@@@@@@@@@@@@Su  3Hey there! SÀ" Rp" HS,·ÍJ\CŠVû:§f£C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜·,SHJÍC\ŠVû:§f£SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number'£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ 7219e23c0084475c97a46ee16f46315c@@@@@@@@@@@@Su  3Hi there! SÀ" Rp# #7©BÖ«KŸEÍ”/=¦€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜B©7#«ÖKŸEÍ”/=¦€SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number(£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ b430e046f4a3469faea051b0f2f22bd2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp$ å3ã§¾¢ÏLšaáë®FèC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜§ã3墾LÏšaáë®FèSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number)£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ b6044c08f57543a7af6b2ca816965d50@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp% Ó&`;ý,Ncx7¢3¨bC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜;`&ÓýN,cx7¢3¨bSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number*£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ f6918a4ddfa7424f82f8b1d6afe7a055@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp& ¤ iT½F› gæ‹¢*™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ¤TiF½› gæ‹¢*™SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number+£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ 19a3d6ca8449490b8be0869c6955340c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp' švž‰( ®J°÷Ù/Žï’HC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰žvš (J®°÷Ù/Žï’HSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number,£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ 7b37addaedca4fb1a09a6a0a5889e90d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp( ËV/…PwK»$FnïóÍþC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/VËP…Kw»$FnïóÍþSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number-£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ 2310b3fafda44ddcb1a47bfa6898b494@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp) dÑ3 c0OƒGHî¿Ù›C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜3Ñdc O0ƒGHî¿Ù›SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number.£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ 3318dcc6b8834bdbb40c11554dbed234@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp* Ôû-J£+óC˜JÑð"ÇÑÎC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜J-ûÔ+£Có˜JÑð"ÇÑÎSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number/£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 802821aa99d7498f8f4f187cb759a364@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp+ ôb2ÖO„¤ýÖ;RC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ö2bôO„¤ýÖ;RSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number0£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 6ca927451abb44cc8822685055c201b4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp, _=ÄŒæG„ÐA(ƒÕh}C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ŒÄ=_Gæ„ÐA(ƒÕh}SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number1£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 7ec928f8c10546bb8cfa9992d7e83362@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp- " 8¸¸„H©Ý'šÛÛøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¸8 "¸H„©Ý'šÛÛøSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number2£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 52a52c6f490e457286a72f6e4719c7be@@@@@@@@@@@@Su  3Hey there! SÀ" Rp. Ì$†¤kO¦Tçï8îTC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†$̤Ok¦Tçï8îTSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number3£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 065d3d7251d14af6a1bd63cae9a2a9cd@@@@@@@@@@@@Su  3Hi there! SÀ" Rp/ }Õ†v­ G¶Âѱªu*C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†Õ}­vG ¶Âѱªu*SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number4£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 4b38cc7cde2240ee82edd2cd2c6f5873@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp0 QàÔ-Ì E¥”…Ye×"ÍC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÔàQÌ-E ¥”…Ye×"ÍSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number5£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ cc9cf3fb011349f691cbecc179c61e62@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp1 fº¶®™ ÚMŽ­É7à>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®¶ºf ™MÚŽ­É7à>SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number6£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ f9738fc9cea84de29e05b65e33f0ce0e@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp2 û45bö’Kµ<´Û3¬MC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜b54ûöK’µ<´Û3¬MSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number7£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ f48d7d1af4dd4ca1a58e3a985c559a61@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp3 PT½Yp F T´Wfvò"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜½TPpYF  T´Wfvò"SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number8£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ e1a668f7a2c449a39a25b1a652cd2a15@@@@@@@@@@@@Su  3Hey there! SÀ" Rp4 UÜ$g«H•ø@µ;LÃC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜$ÜUgH«•ø@µ;LÃSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number9£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ 3ff7a743767a4b0785efd6526d47781e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp5 CéͳŠvH—z¤° Ô C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³ÍéCŠHv—z¤° Ô SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number:£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ 51687a302a174f2bbfdeb10e7b7e638c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp6 ‡\ OZÙÇKˆéÔö½#C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜O \‡ÙZKLjéÔö½#SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number;£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ f6d5174486e049c3a7b264605ef968ff@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp7 òAݺçÞWM–6a[Ó·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ºÝAòÞçMW–6a[Ó·SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number<£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ 6b40baace0f94efa894f541a933dfe26@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp8 Í蔡,?1O¾7'*(í–=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¡”èÍ?,O1¾7'*(í–=SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number=£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ bb702b08e67b4bcfade3b263201027fa@@@@@@@@@@@@Su  3Ho there! SÀ" Rp9 ÆYþæŽêG²bã±›6C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þYÆŽæGê²bã±›6SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number>£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ dc89f50d66f54b9fb9988b4140cccf46@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp: $ ÍࢴÉN›ðá/ŒñC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜àÍ $´¢NÉ›ðá/ŒñSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number?£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ ff83c301f382406caeb724d4603000d7@@@@@@@@@@@@Su  3Hi there! SÀ" Rp; ª9b @‚üO´FjÄÊC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜9ªb@ ‚üO´FjÄÊSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number@£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ 752ab8972a02454d92599d9f2004f856@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp< ¢´Š5ùN}F”ŒI{dôªC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5Š´¢NùF}”ŒI{dôªSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberA£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ 84079d948d5b4943b3c76e7112a4dafe@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp= ˆÐì!xkA—Æ o G•jC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ìЈx!Ak—Æ o G•jSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberB£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ 294a1aaf54fc4606a0aaf11388fea829@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp> ¯ èGHŒŠc¼gÙ©%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ¯GèHŒŠc¼gÙ©%SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberC£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ bcc1885e95d94aa5a6c9832cf5f52bf5@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp? {NøtßDMMŠq¡S­(¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜tøN{DßMMŠq¡S­(¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberD£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ 70a2c063066240e687ab1b70946a29f9@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp@ §ÇÆTúJ¾ØJŠ©Ù\4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÆÇ§TJú¾ØJŠ©Ù\4SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberE£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ bf23b22751c04a1ea5e4fb36b23c923d@@@@@@@@@@@@Su  3Hi there! SÀ" RpA nf»ž ÚN¹*}µù³ÕËC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜»fn žNÚ¹*}µù³ÕËSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberF£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ 67540e32ecb24534add77ff3dd696c4d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpB 8~Ø "L©Ø––—«`C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~˜¼ï ØL"©Ø––—«`SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberG£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ cf78c769f8fe487abc6b574a68341011@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpC ã€KGu±M®VMvj/Ê”C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K€ãuGM±®VMvj/Ê”SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberH£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ e5e184ddb0964263af8cb147b4fb1a77@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpD DÚÇG>ÓG¸Ó ‡û¢C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜GÇÚDÓ>G¸Ó ‡û¢SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberI£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ 3f44e6c3574844d8a5efec71b6c04058@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpE ’ÖŸXø‰~N¹fÌ"žc·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜XŸÖ’‰øN~¹fÌ"žc·SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberJ£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ 7792f92416434251930cc2a6abcbc3cd@@@@@@@@@@@@Su  3Hey there! SÀ" RpF ›GÄÍ¢=DAfýgƒOñbC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÍÄG›=¢ADfýgƒOñbSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberK£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ fdd5a392544e435aba4946949483631a@@@@@@@@@@@@Su  3Hi there! SÀ" RpG  ̓8£F» \­%ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ƒÍ £8F» \­%ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberL£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ 6e4f475d32d14033aacdce52e481363e@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpH *Xÿ45ÈE½r¼³Ý±Ó/C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4ÿX*5EȽr¼³Ý±Ó/SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberM£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ 4e71fe51f49144dab61191f2ef616aed@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpI 6!J1è ÞHŠF®ì:[¾óC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜1J!6 èHÞŠF®ì:[¾óSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberN£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ 571a258f5b3a4c42b06875d62d6c7dd9@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpJ ½/hFÁCláà²@™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Fh/½CÁláà²@™SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberO£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ 8857349005454867bc35c88999293897@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpK ’¸¡¡9ÿ9FšÍdôeÂÌC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¡¡¸’ÿ9F9šÍdôeÂÌSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberP£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ e77554f574804ade827c981e376fd626@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpL FÞ‹ ÏêQK®ì˜^ŒqC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ‹ÞFêÏKQ®ì˜^ŒqSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberQ£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ e221474ab17944819156118c9240c886@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpM óÛ6ä;I»LD=U¨C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ûóä6I;»LD=U¨SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberR£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ 4bafe90a74df43449cbe90e53ef2f528@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpN %«Nâ:DŠ*Nàƒ"ZÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜N«%âD:Š*Nàƒ"ZÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberS£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ 1e6f05f776cb4081b0b2859b9c3b809b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpO ªHA©*J´~ÞÚ&ÅÍôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜AHª*©J´~ÞÚ&ÅÍôSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberT£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ 559c699f1e32462c983ec7bbe545e6fb@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpP =Q‘¾ñø!A¼_#‚ãúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾‘Q=øñA!¼_#‚ãúSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ e20ea8ef4a494b579cfdc70793f3ad07@@@@@@@@@@@@Su  3Ho there! SÀ" RpQ 饋ÛèC»=„÷Ó™%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‹¥éÛCè»=„÷Ó™%SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberV£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ 289b6f708d314d238fffc53a37d02430@@@@@@@@@@@@Su  3Hey there! SÀ" RpR V/ âÛ­5@¯ÏæÍ3P C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜â /V­Û@5¯ÏæÍ3P SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberW£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ 11f706bd4cd940dabb5cb9a63fa79872@@@@@@@@@@@@Su  3Hi there! SÀ" RpS èŒBH`ï±JŒ´& &0NC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜HBŒèï`J±Œ´& &0NSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberX£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ 9bd6e1c922f544d89e2f02a0e9129e01@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpT ÚE4§hCH¾¹v¹—ö¡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4EÚh§HC¾¹v¹—ö¡SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberY£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ 6d0a94b98db146e7b53259fa0e8f00da@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpU äÀÚc¸E’|X{yÙSC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÚÀä¸cE’|X{yÙSSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberZ£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ b6ae5f3e921d4c068d4b96707a1c649d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpV ‡yНtwI“>+«Ôv¨PC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Šy‡t¯Iw“>+«Ôv¨PSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number[£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ 80e40c354bda4222a1af6851755f435a@@@@@@@@@@@@Su  3Ho there! SÀ" RpW  Kî¿N`J§É12¯C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜îK N¿J`§É12¯SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number\£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ 90b4436516504614a2e5de9703844d88@@@@@@@@@@@@Su  3Hey there! SÀ" RpX ßøÉ&ÉÁ-E±Þ¢ÂmY%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜&ÉøßÁÉE-±Þ¢ÂmY%SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number]£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ f7851009b76c445ebaa803f5459497a6@@@@@@@@@@@@Su  3Hi there! SÀ" RpY /˜Ës%„O ÂE†m¹Ÿ:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜s˘/„%O ÂE†m¹Ÿ:SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number^£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ e80aaefcfd2848d5932c195817e0949a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpZ c}°ôÖûlC»ù¹ÔqçE½C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ô°}cûÖCl»ù¹ÔqçE½SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number_£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ be1bac5782ad48ad991e4003774da3ed@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp[ ÞŒª.+L°uø ÄèÅC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ªŒÞ+.L°uø ÄèÅSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number`£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ 11d3b9cd6ebb46cfaa372792d014e6e5@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp\ Ïåû…NFwDÛG´Øx^VC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜…ûåÏFNDwÛG´Øx^VSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbera£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ b732a9c958534034ba3e1cfd6baee508@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp] ä|‹R¸&ŒO¦]urR ÙóC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜R‹|ä&¸OŒ¦]urR ÙóSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberb£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ 39a2fc2984eb4648a0dbbfd4424a11fb@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp^ VŒû 1±Dƒ2{Íx›$þC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ûŒV±1Dƒ2{Íx›$þSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberc£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ 6eb94357de7c4ad5a12f340cec66b731@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp_ øéø· L„vÞ§#~s§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜øéø·L „vÞ§#~s§SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberd£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ dc50143a2b4d4ab2ba8aa04472949111@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp` fÁÎãËÊA»ßQÒu­TC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÎÁfËãAÊ»ßQÒu­TSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbere£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ 37a41ed7489648be9b2ec0e642bcb6ce@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpa Óĸ…?­LF…žq2ûrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜…¸ÄÓ­?FL…žq2ûrSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberf£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ 67af5e20b7fa4ca1a74be482dfe111e3@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpb ¯6‹ÖJ•B;6ßÍïÍC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Â6¯‹JÖ•B;6ßÍïÍSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberg£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ bba22fa4bc914121b4c2e4c281df7e1f@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpc ÚìPô3A˜X]O@´­IC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜PìÚôA3˜X]O@´­ISrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberh£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ 43604d9b30e04f2d9dc0550a5020fac2@@@@@@@@@@@@Su  3Hey there! SÀ" Rpd È4ÖãH£…`‚‘}8×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ö4ÈãH£…`‚‘}8×SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberi£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ d4a132622b1d4e748042f0d222c9a6c4@@@@@@@@@@@@Su  3Hi there! SÀ" Rpe y„¾°;ÄPG²•#¦$DªC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°¾„yÄ;GP²•#¦$DªSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberj£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ cec9838bfc7e4c0db6d7d86fd6e4a0be@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpf 4À-hœJšï¿­®ðC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜-À4hJœšï¿­®ðSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberk£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 2d3ed5b1bcb84d5fa3aeff493da5ea9e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpg oã³Ä¿ä A‡ 5ÇW°þC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ä³ãoä¿A ‡ 5ÇW°þSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberl£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ d9912f6e611843408af4dd98985f0ddf@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rph Ë~Á LPN¿¬••šVC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Á~ËL NP¿¬••šVSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberm£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 41c23139f9a34b1590272682d4ac6458@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpi ÔÅ3©>TM¶A ‹³’aÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜3ÅÔ>©MT¶A ‹³’aÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbern£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 8f42f70baab542e1be0fb11a1eed0f27@@@@@@@@@@@@Su  3Hey there! SÀ" Rpj ÿ¶z:…äCŠºkHú{\²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:z¶ÿä…CŠºkHú{\²SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbero£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ cb75c39d7b6f48ffb84c656005dd6657@@@@@@@@@@@@Su  3Hi there! SÀ" Rpk sÛ+´ÌjX@€ÑÄe ²¸dC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜´+ÛsjÌ@X€ÑÄe ²¸dSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberp£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ d12cb86055024a9a9d3d60d74ed168ec@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpl îsf¼ôgÉIª„ #µ³CC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼fsîgôIɪ„ #µ³CSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberq£x-opt-locked-untilƒ`f¥š6SsÀ/ ¡ de05cacfb919483587287c6fd1a4d088@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpm Ú¢qìZ8»Fˆ•²)ì+RC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ìq¢Ú8ZF»ˆ•²)ì+RSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberr£x-opt-locked-untilƒ`f¥š6SsÀ/ ¡ e2d310ea25dc40d3bb46e0df8a2b1743@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpn ÈíÅN1@·4)ÎÔèZÚC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÅíÈN@1·4)ÎÔèZÚSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbers£x-opt-locked-untilƒ`f¥š6SsÀ/ ¡ ba0cc2432a8844ffb1ddf4add4cb7ebc@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpo üq#ôTOC`R[pC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ô#qüOTC`R[pSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbert£x-opt-locked-untilƒ`f¥š6SsÀ/ ¡ c6a275f2d301422b91c6c9b69c7aa30a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpp  -˜µ< ÕK»ôéºq¹C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜µ˜- ñ¨ùùÃK¼L÷¸qÍ_C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¨ñ>ùùKüL÷¸qÍ_SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbery£x-opt-locked-untilƒ`f¥šUSsÀ/ ¡ d7d09308bb034f599657facf6ff90653@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpu !ók¶JìúD ‚3F·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¶kó!ìJDú ‚3F·SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberz£x-opt-locked-untilƒ`f¥šUSsÀ/ ¡ ab5b9784c88b4777b30f14db37502ac9@@@@@@@@@@@@Su  3Hey there! SÀ" Rpv ÀÌØ:@lTK¤bõh}æ÷:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:ØÌÀl@KT¤bõh}æ÷:SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number{£x-opt-locked-untilƒ`f¥šUSsÀ/ ¡ e6ef7f83d3c146859921e598ae3413f5@@@@@@@@@@@@Su  3Hi there! SÀ" Rpw ÊY«Æ¿M¦}Ƈ[ûçC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜YÊÆ«M¿¦}Ƈ[ûçSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number|£x-opt-locked-untilƒ`f¥šUSsÀ/ ¡ 60a04385295d4bb7bd81dc1862ebfbe4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpx 9•.Ö\X*J‘Œ‰mhà‹ôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ö.•9X\J*‘Œ‰mhà‹ôSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number}£x-opt-locked-untilƒ`f¥š„SsÀ/ ¡ 5fa302ca01be4f6c841ad7ee4c7cee05@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpy Ê>4Ì„BÛG³F6†q¨üC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ì4>ÊB„GÛ³F6†q¨üSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number~£x-opt-locked-untilƒ`f¥š„SsÀ/ ¡ 103d6d7beae640c79e941947ccbd992a@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpz cº„V«eEJ½ž Hi mate, how are you?7f9040a8b71e0d606cb7639a88392428afbc11df-8000066400000000000000000000001431454613650200350060ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP[S@À2à/0@pMSSBCBSPLAIW ANONYMOUSb520eY77naa9a0bcad796d3e988_G0@p804c8afe8006e24c0efc49c810e4af933c6f84fa-3000066400000000000000000000000161454613650200352220ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusSSSSSSSSSPLIT 8078ee04af4a375e874b781b70bf7ddae57aaadc-16000066400000000000000000000003461454613650200354530ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc4ab500@1'eaaS 0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT S@`RpˆRRÿ@@@827d55ddb6725d10e7052658fa0f252befb84221-6000066400000000000000000000005201454613650200347140ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(Žžµa ¿è vzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@832f94db043db858f8751d37e050013a6601c3ac-5000066400000000000000000000004301454613650200346240ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusXTERNA?SPLIT LITPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT y‚ ØC ="utf-8"?> Hi mate, how are you?SPLIT 83ee8330b4c477648527f1e5f3a82ca4a61958d3-7000066400000000000000000000001411454613650200346560ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLN ANONYMOUSEXTPLIT SD£ P Welcome!849496ad918e5d5f723b6b44f10c6babfecfad46-17000066400000000000000000000005201454613650200353760ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb560e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqï½ڼ﬽Ó½qï½W﬽Ó½qï˽;��ހdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@85256c3f3b23b3c105334c7e7d27741f39dd66c1-3000066400000000000000000000054321454613650200346430ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#ccExplorer@@@@@@@@@StÁ8¡d3e986_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njopt-sequence-number–£x-opt-locked-untixml versߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b€¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3002-0e0D413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WWIN-U7RVPH3B1¡UserName¡ AdminisratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpd@@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡teervice Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@A˜SpÀ @@pH@CSrÁ\£x-opt-nqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MahineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC ="utf-8"> Hi mate, how are you?SPLIT z SÀ CR ”äYÃ?–?A�ƒÕðÔž‰6÷C@B@@`@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nlH£x-opt-sequence-number™£x-opt-Kockd-untilƒ[£ná‡sÀH ¡$f5b39d65-785d-4f40-8106-52c089dab354@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdminisratorSu P Hi mate, how are you?SPLIT 8c9bfd710bf6ac32f46b7134c9f9fa4685493359-7000066400000000000000000000000771454613650200350400ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À5à/³"CBSPLAIN A"S"uUf8da38f2e5b57189032b25602615c528ecefc5af9-10000066400000000000000000000000771454613650200350710ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À5à/³"""CBSPLAIN A"S" A"8db5e80187c6829f2f8ecd1a6951f9a39cd9dafb-15000066400000000000000000000005201454613650200354140ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(qa€Þ½ vzÿÿQrˆ@Þ¿½H VfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@8dbe1511b3ab64ac003bf39baef5e91790583d47-12000066400000000000000000000005201454613650200352040ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿ï½ñ½¿ñ½¿ï¿ï½ÿ€½¿ïexeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@8e72a52fa2a4d251ae48829efa785581894a3f47-11000066400000000000000000000005201454613650200350170ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?YS@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G7@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJa ¿½ vzLXqz Iv@ïý HYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@8f454e53b0281b0e8645d04621f34145fb0b7bce-13000066400000000000000000000003461454613650200347700ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpáˆRRÿ@@@8f474aa6e2a2f281a9f53c7520bbd334c3a4f87f-7000066400000000000000000000001441454613650200351420ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(p½¿ï½¿ï€½¿ï½¿ï½¿ï½¿ï€½¿ï½¿ï½¿ï½¿ïUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@8fe172ef3b216ef5c547e73adfc41ac35d58368f-12000066400000000000000000000003461454613650200353200ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@901ecbffb7a50146cd71e3adcccf616b9143d5d0-7000066400000000000000000000001441454613650200353430ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿ï½¿ï€½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUBrXfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€W@@@91573da7dd285af2a818dbcbd1e5f2ceb4b86603-6000066400000000000000000000013171454613650200353030ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJa ¿½ vzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT yS@@À CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡SeKrvice Bus Explorer@@@@@@@@@StÁ8¡ MachineName@WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how ar919c3ade398b4a684047268170276f8079f2ea57-6000066400000000000000000000001441454613650200345320ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ïÝ?ï%Ue11½¿ïrU­ïr½¿ïÝ?ï%ソïUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@929477edd80bb1e3ace09d98191f137896aaa152-13000066400000000000000000000001441454613650200350730ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT AMQPÿ¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUB@@@@C€{XfLCB@P(À ¡/@@@C€test@@@@@@@c@@@93724abec088be92f0b6db90921d7c302f3a450b-9000066400000000000000000000001441454613650200350520ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(p߽¿ï½¿ïÿÿ¿ï½¿ï½¿ï½¿ï½¿¿ï¿¿ï½¿ïCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@93873efa2fbb2ae17d2e279e3bb568ec5bed6c22-3000066400000000000000000000000771454613650200353710ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³MSSBCBSPLAIN ANONYMOUS"utf-8"?95b2e2cd7dea80e5a87f5c6d4346134f463aae64-2000066400000000000000000000002731454613650200351470ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ@p" encoding="utf-8"?> Hi mate, how are you? Hi mate, how are you?9b236a16c29e74faa9da7470897e939a984855b4-8000066400000000000000000000001441454613650200347060ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(p߽ソ¿ï½¿ïÿÿ¿ï½¿ï½¿ï½¿ï½¿¿ï¿¿ï½¿ïCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@9b4c5e40d4cc089ed681fb7a92fe356a3d0826a2-5000066400000000000000000000001441454613650200351450ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(p½¿ï½¿ï}½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@9be3e6c02a0afea1df3f00662260a5168a5a270b-12000066400000000000000000000001121454613650200351520ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusSSSSPLIT SÀ`RpUSSSSSSSSEXTERNALSPLIT SÀW¡(pqaaÿ9d5511dfc7849119909e5bef8c9d33d3bf6267ac-10000066400000000000000000000001441454613650200351670ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿ï½¿ï€½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUBrXfdwCB@P`S(À ¡/test`@@@`@@@@@@`@C€W@@9e3ec299a3b245e360e15a69d330bd001e5e419a-3000066400000000000000000000013111454613650200347600ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀpqaJaBRgAvzLXqzRrrUIYv¡IujDpHYjxeUBrVfdwCB8PS(À ¡/test@@@@@@@@@@@@@C€PLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nñ£SsÀH a$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?9fc1c5a97e4fe053036f96d1c2dfa8526e91e422-5000066400000000000000000000005201454613650200350710ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT deSÀpqaJaBRgAvzLXqzRrrU0Yv¡IujoptYjxeUBrVfdwCB8PS(À ¡/test@@@@@@@@@@@@@C€@@@9ff847839e882b5c6e5a14f67a5b285a105d88d7-6000066400000000000000000000001171454613650200347630ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/@@%½ïH¿ï½¿ïUBrVfdwB@PS(À¡/test@@@@@@@@@@@€@a0039a80683147c40723f790105c3377dcc4bed0-2000066400000000000000000000001441454613650200345360ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ï½¿ï%Ue11½¿ïrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@a06921b8662756d63c3e3198b71f7b8246829073-7000066400000000000000000000001441454613650200343650ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ï½¿ï XhØ¿½Jð¿½ïǽD xeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@a0983d3345ec52f41319e4d6cc1f2c44bb58b032-12000066400000000000000000000005201454613650200350370ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e114eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿ï½ï½@ソï¿ï½¿ï½¿ïexeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@a0aaa948009194fe38bab7a8b6d62a748aa46b57-6000066400000000000000000000000321454613650200351310ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusSDÐ P Welcome!a0d147e90e2a09a7c8255bad40f66fc079f5d30b-5000066400000000000000000000017371454613650200351410ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@pR©€@@@@@SPLIT SPLIT -@HvaSPLI zSG0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@J@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Busa1410ae6a6a4790af6bb498e366aaf8c69a0a394-9000066400000000000000000000001441454613650200351400ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusd#SÀW¡(pqa½Ûñ½¿ï%ñ½¿ñ½¿ï¿½Jð¿½ïǽDp¿ñ½¿ñ½¿ï%UewCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@a19fd8a703813e631f2b5659920346f3f6205691-8000066400000000000000000000001431454613650200344330ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP[S@À2à/H@pMSSBCBSPLAIW ANONYMOUSb520eY77naa9a0bcad796d3e988_G0@pa333d9c6e58fc54a7d1ee8d54915d69536c74e3d-16000066400000000000000000000005201454613650200351710ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc4ab500@1'eaaS 0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT S@`RpˆRRÿ@@@SPLIT ddSÀW¡VfdaÿÿÿQˆ@Þ¿½HVfdwCB@PS(Àa¡/test@@@@@@@@@@@@€C€@@@a3438afff19a7f0a9813a97425c85014f18b94e9-12000066400000000000000000000003461454613650200350220ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT S@`RpˆRRÿ@@@a3644247dc5da0d061e96dcd7e982d81af6a5074-9000066400000000000000000000005201454613650200350650ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?YS@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G7@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJa ¿½ vzLXqz Iv@ïý HYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@a365cc82e174ce3e10cce87d2ab8b3fafc228cb0-3000066400000000000000000000053321454613650200354230ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#ccExplorer@@@@@@@@@StÁ8¡d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ApÀ @@pH@CSrÁ\£x-opt-enueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untixml versߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af58832b€¡Service BusExplorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR gÂw{¤@©*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enueuedtimeƒ[£nj²£x-opt-sequence-number—£x-opt-lockeduntilƒ[£nßñSsH ¡$bde3e002-0e0D413-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WWN-U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡teervice Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC ="utf-8"?> Hi mate, how are you?SPLIT z SÀ CR ”äYÃ?–?AƒÕðÔž‰6÷C@B@@`@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nlH£x-opt-sequence-number™£x-opt-Kocked-untilƒ[£ná‡SsÀH ¡$f5b39d65-785d-4f40-8106-52c089dab354@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineNama5da9f4c33b993a28ee3a09e260fb176a1e0314e-8000066400000000000000000000001441454613650200351310ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusd#SÀW¡(pqa½Ûñ½¿ï%½Ûñ½¿ï%¿½Jð¿½ïǽDp¿ñ½¿ñ½¿ï%UewCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@a5ffda6f161513fea54e626a1d46dcd6b61f1443-18000066400000000000000000000005201454613650200352710ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb560e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqï½ڼ﬽Ó½qï½W﬽Ó½qï˽;ï½�ހdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@a6463b1a7a952214b9d81ae55d28123d1de2754e-7000066400000000000000000000001441454613650200347110ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqaÝ¿ïÄ¿ï%UeXhØ¿½JðǽïǽDpHYjxeUBrVfdCB@PS(À ¡/test@@@@@@@@@@@@@C€w@@@a7108a5b637dc32039d510b732a8009698f0e002-9000066400000000000000000000001441454613650200344620ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusd#SÀW¡(pqa½Ûñ½¿ï%½Ûñ½¿ï%¿½Jð¿½ïǽDp¿ñº¿ñ½½Ûñ½¿wCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@a7393b52ec29d473956e7d78737c6228617311ef-13000066400000000000000000000005201454613650200346100ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb560e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqï½ڼ﬽�qï½W��ï˽;��ހdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@a7ceb957384bc97ce7f7155dc5476c15a3264498-8000066400000000000000000000005201454613650200347550ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?@S@À2à/³MSSBCBSPLAIN ANOMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(Žžµa ¿è vzLXqz¿½]UIYv@ñ¿½HYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@a83f05d2b67b825cc65b1931e133be24c3d134c0-14000066400000000000000000000005201454613650200350310ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿½¿ñ½¿¿ï½¿ï¿ï½¿ï½¿ïexeUBrVfäØCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@a85ec378941dfed8a6fc239f08be5384f30f0dde-12000066400000000000000000000000771454613650200354060ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?AS@À2à/³ääYLäN "êMMOYS"ääaaa763ca3953b7851af36ef32785cc57f9b3e3f9-9000066400000000000000000000005201454613650200351640ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaaÿ½ vzLXqzQrr@Þ¿½HYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@ab0940bbf4b27436b4607118440521a6438b7c46-6000066400000000000000000000005201454613650200344550ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJa ¿½ vzLXqzQrrUIYv@�HYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@ab1db149631ed1028a17f005a40f412fed88d7a8-7000066400000000000000000000000771454613650200350450ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³mS  SPLAIN ANON  U"  Ufabddeb3073c30741690fc8a10617437820be81a6-1000066400000000000000000000000061454613650200346700ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusySÀCad35b52442c07087145b31008c88e966e6ef85da-1000066400000000000000000000035351454613650200346500ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR ”äYÃ?–?AƒÕðÔž‰6÷C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nlH£x-opt-sequence-number™£x-opt-locked-untilƒ[£ná‡SsÀH ¡$f5b39d65-785d-4f40-8106-52c089dab354@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ Macing="utf-8hineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you? Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-numberc182763a9423808ca2a369eae0ae610f21e68bb5-20000066400000000000000000000005201454613650200350410ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb560e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqï½ڼ﬽Ó½qï½W﬽Ó½qï˽;ï½ï½ÞÂdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@c2e1aed1357f395eef8796872574abbf06e92d83-13000066400000000000000000000003461454613650200351750ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT áSÀ`RpˆRRÿ@@@c5815c2591c0a83d9635ae65d10c49426e0b1c56-2000066400000000000000000000016541454613650200346370ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@@@@SPLIT cked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡-8"?> Hi mate, how are you?SPLIT C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c93d1aae6f5892939c65d73f43b2e87a3dd143e3-7000066400000000000000000000005201454613650200351000ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(Žžµa ¿è vzLXqzRrrUIYvaIujDpHYjèUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@c9da71996e0b7341b701e74eb4cbf30380eaf47a-14000066400000000000000000000003461454613650200352200ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpáˆRRÿ@@@cd3c8ad174364cc4eaa7e32231d4134931f286a9-11000066400000000000000000000001441454613650200350440ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿ï½ß¿ï½¿ï½¿ï½¿ïÿÿÿ€½¿ï½¿ï½¿BrXfdwCB@P`S(À ¡/test`@@@`@@@@@@`@C@@@@@@`@@@cd5b970e69ba005bd3b22773d2a1ac031ff5ed62-14000066400000000000000000000005201454613650200352510ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e114eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT  SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(p *½¿ï/½¿ñ½¿ï½ ソソ ¿ï½¿ï½¿ïexeUB VfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@cd7227f6bc9cdb1de9e0d880cd00ddaaed1612de-7000066400000000000000000000001441454613650200355660ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusd#SÀW¡(pqa½Ûñ½¿ï%UeXhØ¿½Jð¿½ïǽDp¿ñ½¿ñ½¿ï%UewCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@cfb1c02ccb4245911ea3ee9cd298a6e2e8bb3656-3000066400000000000000000000000201454613650200352620ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPAMQPd05cc5d1dce30e10bce5aa12e17f32d012dc0e4b-1000066400000000000000000010056511454613650200353670ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT GSÀ: ¡$3d9065c2239c48f88056bcfdd3334d81_G41@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ‚SÀu¡(zjrRNLRzGpzDszPvweGxRQcoxpAQxuFkaowCKoRcCAP@@S)À0¡'integration-receive-5577006791947779410@@@@@@@@@€@@@SPLIT #SÀ CpˆRRCCpèC@B@SPLIT ‡SÀz¡(cTyTJHeKKokJNwUaqKCBRxMSdypnuVQlXTxlLUfRRB@PS(À4 ¡'integration-receive-5577006791947779410@@@@@@@@@@@@@C€@@@SPLIT SÀ AR@AS$E@SÀ AR@AS$E@SÀ AC@AS$E@SÀ AR@AS$E@SÀ AR!@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR @AS$E@SÀ AR @AS$E@SÀ AR @AS$E@SÀ AR @AS$E@SÀ AR @AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SPLIT SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR @AS$E@SÀ AR"@AS$E@SÀ AR#@AS$E@SÀ AR$@AS$E@SÀ AR%@AS$E@SÀ AR&@AS$E@SÀ AR'@AS$E@SÀ AR(@AS$E@SÀ AR)@AS$E@SÀ AR*@AS$E@SÀ AR+@AS$E@SPLIT SÀ AR,@AS$E@SÀ AR.@AS$E@SÀ AR/@AS$E@SÀ AR-@AS$E@SÀ AR;@AS$E@SÀ AR0@AS$E@SÀ AR1@AS$E@SÀ AR2@AS$E@SÀ AR3@AS$E@SÀ AR4@AS$E@SÀ AR5@AS$E@SÀ AR6@AS$E@SÀ AR7@AS$E@SÀ AR8@AS$E@SÀ AR9@AS$E@SÀ AR:@AS$E@SÀ ARX@AS$E@SÀ ARY@AS$E@SÀ ARZ@AS$E@SÀ AR[@AS$E@SÀ AR\@AS$E@SÀ AR]@AS$E@SÀ AR^@AS$E@SÀ AR_@AS$E@SÀ AR`@AS$E@SÀ ARa@AS$E@SÀ ARb@AS$E@SÀ ARc@AS$E@SÀ ARd@AS$E@SÀ ARe@AS$E@SÀ ARf@AS$E@SÀ ARg@AS$E@SÀ ARh@AS$E@SÀ AR<@AS$E@SÀ AR=@AS$E@SÀ AR>@AS$E@SÀ AR?@AS$E@SÀ AR@@AS$E@SÀ ARA@AS$E@SÀ ARB@AS$E@SÀ ARC@AS$E@SÀ ARD@AS$E@SÀ ARE@AS$E@SÀ ARF@AS$E@SÀ ARG@AS$E@SÀ ARH@AS$E@SÀ ARI@AS$E@SÀ ARJ@AS$E@SÀ ARK@AS$E@SÀ ARL@AS$E@SÀ ARM@AS$E@SÀ ARN@AS$E@SÀ ARO@AS$E@SÀ ARP@AS$E@SÀ ARQ@AS$E@SÀ ARR@AS$E@%SÀ RypsRRCRypÓC@B@SÀ ARS@AS$E@SÀ ART@AS$E@SÀ ARU@AS$E@SÀ ARV@AS$E@SÀ ARW@AS$E@SÀ ARi@AS$E@SSPLIT À ARj@AS$E@SÀ ARk@AS$E@SÀ ARl@AS$E@SÀ ARm@AS$E@SÀ ARn@AS$E@SÀ ARo@AS$E@SÀ ARp@AS$E@SÀ ARq@AS$E@SÀ ARr@AS$E@SÀ ARs@AS$E@SÀ ARt@AS$E@SÀ ARu@AS$E@SÀ ARv@AS$E@SÀ ARw@AS$E@SÀ ARx@AS$E@SPLIT SÀ AR|@AS$E@SÀ AR{@AS$E@SÀ ARy@AS$E@SÀ ARz@AS$E@SÀ ARÝ@AS$E@SÀ ARÞ@AS$E@SÀ ARß@AS$E@SÀ ARÓ@AS$E@SÀ ARÔ@AS$E@SÀ ARÕ@AS$E@SÀ ARÖ@AS$E@SÀ AR×@AS$E@SÀ ARØ@AS$E@SÀ ARÙ@AS$E@SÀ ARÚ@AS$E@SÀ ARÛ@AS$E@SÀ ARÜ@AS$E@SÀ AR»@AS$E@SÀ AR¼@AS$E@SÀ AR½@AS$E@SÀ AR¾@AS$E@SÀ AR¿@AS$E@SÀ ARÀ@AS$E@SÀ ARÁ@AS$E@SÀ ARÂ@AS$E@SÀ ARÃ@AS$E@SÀ ARÄ@AS$E@SÀ ARÅ@AS$E@SÀ ARÆ@AS$E@SÀ ARÇ@AS$E@SÀ ARÈ@AS$E@SÀ ARÉ@AS$E@SÀ ARÊ@AS$E@SÀ ARË@AS$E@SÀ ARÌ@AS$E@SÀ ARÍ@AS$E@SÀ ARÎ@AS$E@SÀ ARÏ@AS$E@SÀ ARÐ@AS$E@SÀ ARÑ@AS$E@SÀ ARÒ@AS$E@SÀ AR}@AS$E@SÀ AR~@AS$E@SÀ AR@AS$E@SÀ AR€@AS$E@SÀ AR@AS$E@SÀ AR‚@AS$E@SÀ ARƒ@AS$E@SÀ AR„@AS$E@SÀ AR…@AS$E@SÀ AR†@AS$E@SÀ AR‡@AS$E@SÀ ARˆ@AS$E@SÀ AR‰@AS$E@SÀ ARŠ@AS$E@SÀ AR‹@AS$E@SÀ ARŒ@AS$E@SÀ AR@AS$E@SÀ ARŽ@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR‘@AS$E@SÀ AR’@AS$E@SÀ AR“@AS$E@SPLIT SÀ AR”@AS$E@SÀ AR•@AS$E@SÀ AR–@AS$E@SÀ AR—@AS$E@SÀ AR˜@AS$E@SÀ AR™@AS$E@SÀ ARš@AS$E@SÀ AR›@AS$E@SÀ ARœ@AS$E@SÀ AR@AS$E@SÀ ARž@AS$E@SÀ ARŸ@AS$E@SÀ AR @AS$E@SÀ AR¡@AS$E@SÀ AR¢@AS$E@+SÀ p p0RRCp pC@B@SÀ AR£@AS$E@SÀ AR¤@AS$E@SÀ AR¥@AS$E@SÀ AR¦@AS$E@SÀ AR§@AS$E@SÀ AR¨@AS$E@SÀ AR©@AS$E@SÀ ARª@AS$E@SÀ AR«@AS$E@SÀ AR¬@AS$E@SÀ AR­@AS$E@SÀ AR®@AS$E@SÀ AR¯@AS$E@SÀ AR°@AS$E@SÀ AR±@AS$E@SÀ AR²@AS$E@SÀ AR³@AS$E@SÀ AR´@AS$E@SÀ ARµ@AS$E@SÀ AR¶@AS$E@SÀ AR·@AS$E@SÀ AR¸@AS$E@SÀ AR¹@AS$E@SÀ ARº@AS$E@SÀ ARà@AS$E@SÀ ARá@AS$E@SÀ ARâ@AS$E@SÀ ARã@AS$E@SÀ ARä@AS$E@SÀ ARå@AS$E@SÀ ARæ@AS$E@SÀ ARç@AS$E@SÀ ARè@AS$E@SÀ ARé@AS$E@SÀ ARê@AS$E@SÀ ARë@AS$E@SÀ ARì@AS$E@SÀ ARí@AS$E@SÀ ARî@AS$E@SÀ ARï@AS$E@SÀ ARð@AS$E@SÀ ARñ@AS$E@SÀ ARò@AS$E@SÀ ARó@AS$E@SÀ ARô@AS$E@SÀ ARõ@AS$E@SÀ ARö@AS$E@SPLIT SÀ AR÷@AS$E@SÀ ARø@AS$E@SÀ ARù@AS$E@SÀ ARú@AS$E@SÀ ARû@AS$E@SÀ ARü@AS$E@SÀ ARý@AS$E@SÀ ARþ@AS$E@SÀ ARÿ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SPLIT SÀAp!@AS$E@SÀAp"@AS$E@SÀAp @AS$E@SÀAp#@AS$E@SÀApx@AS$E@SÀApy@AS$E@SÀApz@AS$E@SÀAp{@AS$E@SÀApo@AS$E@SÀApp@AS$E@SÀApq@AS$E@SÀApr@AS$E@+SÀ p´pRRCp±pcC@B@SÀAps@AS$E@SÀApt@AS$E@SÀApu@AS$E@SÀApv@AS$E@SÀApw@AS$E@SÀAp$@AS$E@SÀAp%@AS$E@SÀAp&@AS$E@SÀAp'@AS$E@SÀAp(@AS$E@SÀAp)@AS$E@SÀAp*@AS$E@SÀAp+@AS$E@SÀAp,@AS$E@SÀAp-@AS$E@SÀAp.@AS$E@SÀAp/@AS$E@SÀAp0@AS$E@SÀAp1@AS$E@SÀAp2@AS$E@SÀAp3@AS$E@SÀAp4@AS$E@SÀAp5@AS$E@SÀAp6@AS$E@SÀAp7@AS$E@SÀAp8@AS$E@SÀAp9@AS$E@SÀAp:@AS$E@SÀAp;@AS$E@SÀAp<@AS$E@SÀAp=@AS$E@SÀAp>@AS$E@SÀAp?@AS$E@SÀAp@@AS$E@SÀApA@AS$E@SÀApB@AS$E@SÀApC@AS$E@SÀApD@AS$E@SÀApE@AS$E@SÀApF@AS$E@SÀApG@AS$E@SÀApH@AS$E@SÀApI@AS$E@SPLIT SÀApJ@AS$E@SÀApK@AS$E@SÀApL@AS$E@SÀApM@AS$E@SÀApN@AS$E@SÀApO@AS$E@SÀApP@AS$E@SÀApQ@AS$E@SÀApR@AS$E@SÀApS@AS$E@SÀApT@AS$E@SÀApU@AS$E@SÀApV@AS$E@SÀApW@AS$E@SÀApX@AS$E@SÀApY@AS$E@SÀApZ@AS$E@SÀAp[@AS$E@SÀAp\@AS$E@SÀAp]@AS$E@SÀAp^@AS$E@SÀAp_@AS$E@SÀAp`@AS$E@SÀApa@AS$E@SÀApb@AS$E@SÀApc@AS$E@SÀApd@AS$E@SÀApe@AS$E@SÀApf@AS$E@SÀApg@AS$E@SÀAph@AS$E@SÀApi@AS$E@SÀApj@AS$E@SÀApk@AS$E@SÀApl@AS$E@SÀApm@AS$E@SÀApn@AS$E@SÀApÜ@AS$E@SÀApÝ@AS$E@SÀApÞ@AS$E@SÀApß@AS$E@SÀApÃ@AS$E@SÀApÄ@AS$E@SÀApÅ@AS$E@SÀApÆ@AS$E@SÀApÇ@AS$E@SÀApÈ@AS$E@SÀApÉ@AS$E@SÀApÊ@AS$E@SÀApË@AS$E@SÀApÌ@AS$E@SÀApÍ@AS$E@SÀApÎ@AS$E@SÀApÏ@AS$E@SÀApÐ@AS$E@SÀApÑ@AS$E@SÀApÒ@AS$E@+SPLIT SÀ ppp¨RRCpppC@B@SÀApÓ@AS$E@SÀApÔ@AS$E@SÀApÕ@AS$E@SÀApÖ@AS$E@SÀAp×@AS$E@SÀApØ@AS$E@SÀApÙ@AS$E@SÀApÚ@AS$E@SÀApÛ@AS$E@SÀAp|@AS$E@SÀAp°@AS$E@SÀAp}@AS$E@SÀAp±@AS$E@SÀAp~@AS$E@SÀAp²@AS$E@SÀAp³@AS$E@SÀAp@AS$E@SÀAp´@AS$E@SÀAp€@AS$E@SÀApµ@AS$E@SÀAp¶@AS$E@SÀAp·@AS$E@SÀAp¸@AS$E@SÀAp¹@AS$E@SÀApº@AS$E@SÀAp»@AS$E@SÀAp¼@AS$E@SÀAp½@AS$E@SÀAp¾@AS$E@SÀAp¿@AS$E@SÀApÀ@AS$E@SÀApÁ@AS$E@SÀApÂ@AS$E@SÀAp@AS$E@SÀAp‚@AS$E@SÀApƒ@AS$E@SÀAp„@AS$E@SÀAp…@AS$E@SÀAp†@AS$E@SÀAp‡@AS$E@SÀApˆ@AS$E@SÀAp‰@AS$E@SÀApŠ@AS$E@SÀAp‹@AS$E@SÀApŒ@AS$E@SÀAp@AS$E@SÀApŽ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp‘@AS$E@SÀAp’@AS$E@SÀAp“@AS$E@SÀAp”@AS$E@SÀAp•@AS$E@SÀAp–@AS$E@SPLIT SÀAp—@AS$E@SÀAp˜@AS$E@SÀAp™@AS$E@SÀApš@AS$E@SÀAp›@AS$E@SÀApœ@AS$E@SÀAp@AS$E@SÀApž@AS$E@SÀApŸ@AS$E@SÀAp @AS$E@SÀAp¡@AS$E@SÀAp¢@AS$E@SÀAp£@AS$E@SÀAp¤@AS$E@SÀAp¥@AS$E@SÀAp¦@AS$E@SÀAp§@AS$E@SÀAp¨@AS$E@SÀAp©@AS$E@SÀApª@AS$E@SÀAp«@AS$E@SÀAp¬@AS$E@SÀAp­@AS$E@SÀAp®@AS$E@SÀAp¯@AS$E@SPLIT SÀAp|@AS$E@SÀAp}@AS$E@SÀApa@AS$E@SÀApb@AS$E@SÀApc@AS$E@SÀApd@AS$E@SÀApe@AS$E@SÀApf@AS$E@SÀApg@AS$E@SÀAph@AS$E@SÀApi@AS$E@SÀApj@AS$E@SÀApk@AS$E@SÀApl@AS$E@SÀApm@AS$E@SÀApn@AS$E@SÀApo@AS$E@SÀApp@AS$E@SÀApq@AS$E@SÀApr@AS$E@+SÀ ppmRRCp pÑC@B@SÀAps@AS$E@SÀApt@AS$E@SÀApu@AS$E@SÀApv@AS$E@SÀApw@AS$E@SÀApx@AS$E@SÀApy@AS$E@SÀApz@AS$E@SÀAp{@AS$E@SÀAp~@AS$E@SÀAp@AS$E@SÀAp€@AS$E@SÀAp@AS$E@SÀAp‚@AS$E@SÀApƒ@AS$E@SÀAp„@AS$E@SÀAp…@AS$E@SÀAp†@AS$E@SÀAp®@AS$E@SÀAp‡@AS$E@SÀApˆ@AS$E@SÀAp‰@AS$E@SÀApŠ@AS$E@SÀAp‹@AS$E@SÀApŒ@AS$E@SÀAp@AS$E@SÀApŽ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp‘@AS$E@SÀAp’@AS$E@SÀAp“@AS$E@SÀAp”@AS$E@SÀAp•@AS$E@SÀAp–@AS$E@SPLIT SÀAp—@AS$E@SÀAp¯@AS$E@SÀAp˜@AS$E@SÀAp™@AS$E@SÀApš@AS$E@SÀAp›@AS$E@SÀApœ@AS$E@SÀAp@AS$E@SÀApž@AS$E@SÀApŸ@AS$E@SÀAp @AS$E@SÀAp¡@AS$E@SÀAp¢@AS$E@SÀAp£@AS$E@SÀAp¤@AS$E@SÀAp¥@AS$E@SÀAp¦@AS$E@SÀAp§@AS$E@SÀAp¨@AS$E@SÀAp©@AS$E@SÀApª@AS$E@SÀAp«@AS$E@SÀAp¬@AS$E@SÀAp­@AS$E@SÀAp°@AS$E@SÀAp±@AS$E@SÀAp²@AS$E@SÀAp³@AS$E@SÀAp´@AS$E@SÀApµ@AS$E@SÀAp¶@AS$E@SÀAp·@AS$E@SÀAp¸@AS$E@SÀAp¹@AS$E@SÀApº@AS$E@SÀApà@AS$E@SÀApá@AS$E@SÀApâ@AS$E@SÀApã@AS$E@SÀApä@AS$E@SÀApå@AS$E@SÀApæ@AS$E@SÀApç@AS$E@SÀApè@AS$E@SÀApé@AS$E@SÀApê@AS$E@SÀApë@AS$E@SÀApì@AS$E@SÀApí@AS$E@SÀApî@AS$E@SÀApï@AS$E@SÀApð@AS$E@SÀApñ@AS$E@SÀApò@AS$E@SÀApó@AS$E@SÀApô@AS$E@SÀApõ@AS$E@SPLIT SÀApö@AS$E@SÀAp÷@AS$E@SÀApø@AS$E@SÀApù@AS$E@SÀApú@AS$E@SÀApû@AS$E@SÀApü@AS$E@SÀApý@AS$E@+SÀ pMp“RRCp1pC@B@SÀApþ@AS$E@SÀApÿ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp!@AS$E@SÀAp"@AS$E@SÀAp#@AS$E@SÀAp$@AS$E@SÀAp%@AS$E@SÀAp&@AS$E@SÀAp'@AS$E@SÀAp(@AS$E@SÀAp)@AS$E@SÀAp*@AS$E@SÀAp+@AS$E@SÀAp,@AS$E@SPLIT SÀAp-@AS$E@SÀAp.@AS$E@SÀAp/@AS$E@SÀAp0@AS$E@SÀAp1@AS$E@SÀAp2@AS$E@SÀAp3@AS$E@SÀAp4@AS$E@SÀAp5@AS$E@SÀAp6@AS$E@SÀAp7@AS$E@SÀAp8@AS$E@SÀAp9@AS$E@SÀAp:@AS$E@SÀAp;@AS$E@SÀAp<@AS$E@SÀAp=@AS$E@SÀAp>@AS$E@SÀAp?@AS$E@SÀAp@@AS$E@SÀApA@AS$E@SÀApB@AS$E@SÀApC@AS$E@SÀApD@AS$E@SÀApE@AS$E@SÀApF@AS$E@SÀApG@AS$E@SÀApH@AS$E@SÀApI@AS$E@SÀApJ@AS$E@SÀApK@AS$E@SÀApL@AS$E@SÀApM@AS$E@SÀApN@AS$E@SÀApO@AS$E@SÀApP@AS$E@SÀApQ@AS$E@SÀApR@AS$E@SÀApS@AS$E@SÀApT@AS$E@SÀApU@AS$E@SÀApV@AS$E@SÀApW@AS$E@SÀApX@AS$E@SÀApY@AS$E@SÀApZ@AS$E@SÀAp[@AS$E@SÀAp\@AS$E@SÀAp]@AS$E@SÀAp^@AS$E@SÀAp_@AS$E@SÀAp`@AS$E@SÀAp2@AS$E@SÀAp1@AS$E@+SÀ p“p²RRCptp0C@B@SÀAp»@AS$E@SÀApSPLIT ¼@AS$E@SÀAp½@AS$E@SÀAp¾@AS$E@SÀAp¿@AS$E@SÀApÀ@AS$E@SÀApÁ@AS$E@SÀApÂ@AS$E@SÀApÃ@AS$E@SÀApÄ@AS$E@SÀApÅ@AS$E@SÀApÆ@AS$E@SÀApÇ@AS$E@SÀApÈ@AS$E@SÀApÉ@AS$E@SÀApÊ@AS$E@SÀApË@AS$E@SÀApÌ@AS$E@SÀApÍ@AS$E@SÀApÎ@AS$E@SÀApÏ@AS$E@SÀApÐ@AS$E@SÀApÑ@AS$E@SÀApÒ@AS$E@SÀApÓ@AS$E@SÀApÔ@AS$E@SÀApÕ@AS$E@SÀApÖ@AS$E@SÀAp×@AS$E@SÀApØ@AS$E@SÀApÙ@AS$E@SÀApÚ@AS$E@SÀApÛ@AS$E@SÀApÜ@AS$E@SÀApÝ@AS$E@SÀApÞ@AS$E@SÀApß@AS$E@SÀApà@AS$E@SÀApá@AS$E@SÀApâ@AS$E@SÀApã@AS$E@SÀApä@AS$E@SÀApå@AS$E@SÀApæ@AS$E@SÀApç@AS$E@SÀApè@AS$E@SÀApé@AS$E@SÀApê@AS$E@SÀApë@AS$E@SÀApì@AS$E@SÀApí@AS$E@SÀApî@AS$E@SÀApï@AS$E@SÀApð@AS$E@SÀApñ@AS$E@SÀApò@AS$E@SÀApó@AS$E@SÀApô@AS$E@SPLIT SÀApõ@AS$E@SÀApö@AS$E@SÀAp÷@AS$E@SÀApø@AS$E@SÀApù@AS$E@SÀApú@AS$E@SÀApû@AS$E@SÀApü@AS$E@SÀApý@AS$E@SÀApþ@AS$E@SÀApÿ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@+SÀ p¤pRRCppkC@B@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp!@AS$E@SÀAp"@AS$E@SÀAp#@AS$E@SÀAp$@AS$E@SÀAp%@AS$E@SÀAp&@AS$E@SÀAp'@AS$E@SÀAp(@AS$E@SÀAp)@AS$E@SÀAp*@AS$E@SÀAp+@AS$E@SPLIT SÀAp,@AS$E@SÀAp-@AS$E@SÀAp.@AS$E@SÀAp/@AS$E@SÀAp0@AS$E@SÀAp3@AS$E@SÀCA@SPLIT SÀ RC tû:±“O€Hy ô ¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:ût±O“€Hy ô ¥SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥qÚSsÀ/ ¡ fee5cb9a196b40a4a37f4d070d7c04da@@@@@@@@@@@@Su  3Hey there!SÀ RR %é—¯2ÓL©*/ýRÅC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯—é%Ó2L©*/ýRÅSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥qÚSsÀ/ ¡ bc11c5d10908443a8f7ce1feaff341d3@@@@@@@@@@@@Su  3Hi there!SÀ RR 6++Ø£¿?FŸ¶®h:·þ­C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ø++6¿£F?Ÿ¶®h:·þ­SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥qÚSsÀ/ ¡ 8defb79ec88345b19dbf7ccb2b3b2f12@@@@@@@@@@@@Su  3Ho there!SÀ RR ŽËX çE©¾õŸ…’«+C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ËŽ XE穾õŸ…’«+SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥qéSsÀ/ ¡ 27e8c62818ea432fa74523f5003843ba@@@@@@@@@@@@Su  3Hey there!SÀ RR ÃqÝG¿ê «ñQ"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜qÃÝG¿ê «ñQ"SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU £x-opt-locked-untilƒ`f¥qéSsÀ/ ¡ 0e99e30e1ee943d7b0a34736a7f6428b@@@@@@@@@@@@Su  3Hi there!SÀ RR îC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜|vF‡ÂIjƒ;æ'>îSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥räSsÀ/ ¡ ab98f9e78b1c4320a775ec6404f8e6b8@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR Œ4®.øQA¤¿,—òK’C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®4Œø.AQ¤¿,—òK’SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ d5ce3e1a23de440bbf90ac455ff333ab@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR µ(>QÆPüF¶K‹öòÛŸMC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Q>(µPÆFü¶K‹öòÛŸMSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ f81bf218eda54688b27715a78fb4d712@@@@@@@@@@@@Su  3Hi there!SÀ RR Øè°ÛÝF¦tä|Üf`C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜èØÛ°Fݦtä|Üf`SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ b54c1d2df89f468aa2cb4a85459986e3@@@@@@@@@@@@Su  3Ho there!SÀ RR b|{ÀKµ”³U¸¨tC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜|b{KÀµ”³U¸¨tSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU £x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ 077eccc37c8245ee9ef3d240a2fe03d2@@@@@@@@@@@@Su  3Hey there!SÀ RR sºÉä"ÇHŽ~ (—± C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Éºs"äHÇŽ~ (—± SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU!£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ 8d20854bac354eae9ef5ebb0ba67738d@@@@@@@@@@@@Su  3Hi there!SÀ RR ÓÍH>¨E A’2T ÑÀÄuC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>HÍÓE¨A ’2T ÑÀÄuSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU"£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ c0d42cb9039d4bb5b6974ed3e6f159e8@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR [$ö&2€·I²££%2ÿbC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜&ö$[€2I·²££%2ÿbSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU#£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ eee81f81d84b44fe8f94226fd61abce1@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR ]Døò3µO¾ÇöY…C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜òøD]µ3O¾ÇöY…SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU$£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 0190e7cc87c84fc39258f3065dfa334e@@@@@@@@@@@@Su  3Hi there!SÀ RR  +©ë”Iƒâª³µ¶’©C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ë©+”Iƒâª³µ¶’©SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU%£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 4fe90924d06140088cc32539382c26a1@@@@@@@@@@@@Su  3Ho there!SÀ RR! ƒáó¢*Ç@™§zÏìß]áC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜óáƒ*¢@Ç™§zÏìß]áSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU&£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 725da4500abc4fc4bdb55a45e28ea243@@@@@@@@@@@@Su  3Hey there!SÀ RR" XœþŽkØM’kŒ™ÖÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þœXkŽMØ’kŒ™ÖÉSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU'£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 37f70567d87d4619b06fe0c5b2c60f05@@@@@@@@@@@@Su  3Hi there!SÀ RR# bŸ;¨’¦÷@xµ<¥JóDC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¨;Ÿb¦’@÷xµ<¥JóDSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU(£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 92b95937594749629c2439015fe9feae@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR$ ¼,pÅþÄ,F…J”TÆ«C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Åp,¼ÄþF,…J”TÆ«SrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU)£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ 6858aa0fe02a467dae4b53303daa726f@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR% -âÜ/Q B¡±c5VÑC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Üâ-Q/B ¡±c5VÑSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU*£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ a0a119a4bae743978a683208ab1abb9d@@@@@@@@@@@@Su  3Hi there!SÀ RR& "à@›K›ç®$i—ÚC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@à"›K›ç®$i—ÚSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU+£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ d0438307df1249e5914dcb3548ad57d2@@@@@@@@@@@@Su  3Ho there!SÀ RR' Œ®£½olJ€eùõY¡€yC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜½£®ŒoJl€eùõY¡€ySrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU,£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ 1cebd35124d5401fbcc716525d35402a@@@@@@@@@@@@Su  3Hey there!SÀ RR( í<5Ë•/M‘DEõ²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5<í•ËM/‘DEõ²SrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU-£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ fc4b825eb2124179a9e31289d7b7e319@@@@@@@@@@@@Su  3Hi there!SÀ RR) ›ü9Û.ßEªæƒ0Q¹|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜9ü›.ÛEߪæƒ0Q¹|SrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU.£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ 59a896dc725346f185540fd257a7de21@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR* æ (шyCº?¸–bÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜( æˆÑCyº?¸–bÛSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU/£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ e48c19ebc0e64907a19a4e2cc7103bc8@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR+ :º¶\nµ.NŸ²ÃU÷† sC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜\¶º:µnN.Ÿ²ÃU÷† sSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU0£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ 4d6fdca3655241ed8bad321f106ae603@@@@@@@@@@@@Su  3Hi there!SÀ RR, ("½NE¦òZ&dúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜½"(EN¦òZ&dúSrÁU£x-opt-enqueued-timeƒ`f¤†¾£x-opt-sequence-numberU1£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ ee88b32af2cd4594b612371f8229ecd6@@@@@@@@@@@@Su  3Ho there!SÀ RR- KÜ8Ÿ|ÿL¿±‰ÕWö;õC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ÿ8ÜK|Lÿ¿±‰ÕWö;õSrÁU£x-opt-enqueued-timeƒ`f¤†¾£x-opt-sequence-numberU2£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ dbe07d4e911043d1b1ec0f714807e2c2@@@@@@@@@@@@Su  3Hey there!SÀ RR. ¼0´Z¯þ¯I–ÚˆÑô‚ÚC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Z´0¼þ¯I¯–ÚˆÑô‚ÚSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU3£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ 00e8c68fbbd74a0eac974e5db84956f1@@@@@@@@@@@@Su  3Hi there!SÀ RR/  DU¡Ã+]F™ írƒÔ˜IC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¡UD +ÃF]™ írƒÔ˜ISrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU4£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ 565c685bb1ac4fa393d15f70c4b0bdd0@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR0 §“KSVÐBœò·7·ÑC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜SK“§ÐVBœò·7·ÑSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU5£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ 9dfe00f3a5584155bfb1369b4b48c32d@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR1 ¿Ö[yŸ§…K§„·®×£C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜y[Ö¿§ŸK…§„·®×£SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU6£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ 54d288f642a443c585be6f334405dc7d@@@@@@@@@@@@Su  3Hi there!SÀ RR2 —{ëÜöCÕOEoC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ë{—öÜCÕOEoSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU7£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ afb5ea722ae64f898d76817982399dc2@@@@@@@@@@@@Su  3Ho there!SÀ RR3 Ü߆·5¤FšyÛîû¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†ßÜ5·F¤šyÛîû¥SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU8£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ 4550a8e7ee71481cacd1a42bf4a1a31b@@@@@@@@@@@@Su  3Hey there!SÀ RR4 ›Ûu³4|@†ûèœñƒÿC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³uÛ›|4@†ûèœñƒÿSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU9£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ caeb9718b0f34baa85195a17e5709e03@@@@@@@@@@@@Su  3Hi there!SÀ RR5 Õšõ¬ÊµO­¤wë;aúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¬õšÕµÊO­¤wë;aúSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU:£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ 17805e985c8d47659f07f832fe0876c5@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR6 o]Í.ê¬>C„ÏÄa¾YßçC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜.Í]o¬êC>„ÏÄa¾YßçSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU;£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 5ce8c106c6304166a4f112530b3e7e56@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR7 ¹0ZÖ†ÉN²8,7µíWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÖZ0¹†Nɲ8,7µíWSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU<£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 39eb87ed46e149dd8f3902bb117adf70@@@@@@@@@@@@Su  3Hi there!SÀ RR8 "54˜ C•Õ­…d³ÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5"˜4C •Õ­…d³ÞSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU=£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ fed30d8abd124ea58ed507c27d7babd6@@@@@@@@@@@@Su  3Ho there!SÀ RR9 PNþhÕ'‚OªíÒ%ä&ËC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hþNP'ÕO‚ªíÒ%ä&ËSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU>£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 89826be41a544dc7aae85e40f6b144e2@@@@@@@@@@@@Su  3Hey there!SÀ RR: —‡Œ§Ås/F§A4"4æ)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜§Œ‡—sÅF/§A4"4æ)SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU?£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 21f0326ff8074ae79351a7e3aa702c00@@@@@@@@@@@@Su  3Hi there!SÀ RR; ôtléX[B¸JbêƒÔ¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ltôXéB[¸JbêƒÔ¸SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU@£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 3ca9be1f21d94c108058dc66c878af46@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR< ÅxžÓ¢´K®#uäm¶`!C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÓžxÅ´¢K®#uäm¶`!SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUA£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ 6b94c038d910458a92ac8c6e9d46b763@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR= ¢[áIE§B¼WȤ¾£œC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜á[¢EIB§¼WȤ¾£œSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUB£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ d0462d261cae48de9dd5acf019e1a0bd@@@@@@@@@@@@Su  3Hi there!SÀ RR> ·t•àÕ½ÈL³ªo±JûêC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜à•t·½ÕLȳªo±JûêSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUC£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ 9317317c9e9c46a2b9228b1687d0b7be@@@@@@@@@@@@Su  3Ho there!SÀ RR? ½³[Ög›@˜D–¾û¹(C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜[³½gÖ@›˜D–¾û¹(SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUD£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ b9dde05c34c148028785781afd80fe87@@@@@@@@@@@@Su  3Hey there!SÀ RR@ IT Ü|M¢\RjVz²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜TIÜ M|¢\RjVz²SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUE£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ 33eeb4c3b7cb446980cf4cf0c55e8e18@@@@@@@@@@@@Su  3Hi there!SÀ RRA uÔô±–ÄM©»êJÖu[C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ôÔu–±MÄ©»êJÖu[SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUF£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ e2a253a160cb4dcab7845201e7c95af6@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRB BóajÂE›L$ÝLKRC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jaóBÂE›L$ÝLKRSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUG£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ ea729f3ec5f94a4fa7ea34747050b429@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRC Ã6ã+<,G¾U³îçC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ã6Ã<+G,¾U³îçSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUH£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 1c44d362e8cf4c9c9afe14b4dbcd974c@@@@@@@@@@@@Su  3Hi there!SÀ RRD +…ÃAà­¨A¨ÁnùaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜AÃ…+­àA¨¨ÁnùaSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUI£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 4c434dd791ae425ab482d596f37fbd90@@@@@@@@@@@@Su  3Ho there!SÀ RRE ‚Xsq²I»@‚¹¡‹í (AC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜qsX‚I²@»‚¹¡‹í (ASrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUJ£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ ca602540424d4723a1617774afcc4a7e@@@@@@@@@@@@Su  3Hey there!SÀ RRF  J í¢VC¦¥¦ÃKš~{C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ J ¢íCV¦¥¦ÃKš~{SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUK£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ cb3189e3156646b98fc193e1fc31023d@@@@@@@@@@@@Su  3Hi there!SÀ RRG ’äÎG`_†Fºh5•æ{C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜GÎä’_`F†ºh5•æ{SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUL£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ d7dccfaabcb04f3689e8253e041bb962@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRH Ãتæ•9àLª×6àtº”\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æªØÃ9•Làª×6àtº”\SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUM£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 9c09407f7cd247b082afe5c48d9a65df@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRI Ø™|#!%WH—­^Eˆ•EC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#|™Ø%!HW—­^Eˆ•ESrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUN£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 56e55c70b5514fab941e15c10fed10d3@@@@@@@@@@@@Su  3Hi there!SÀ RRJ ã{GšˆRáK¢Í5+h³RC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜šG{ãRˆKá¢Í5+h³RSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUO£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 72dae1e18f7f4e778cf2cd5f4ed921fe@@@@@@@@@@@@Su  3Ho there!SÀ RRK é (œ¹®C›ë2H/”t€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜( 鹜C®›ë2H/”t€SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUP£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 48f5b34446504df69b4546998aba1357@@@@@@@@@@@@Su  3Hey there!SÀ RRL ij†pâõ¦L¶—¥¤UãFUC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜p†³ÄõâL¦¶—¥¤UãFUSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUQ£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 98838d8352fd4ca0971f06cb5fd5d100@@@@@@@@@@@@Su  3Hi there!SÀ RRM Ñæµè‡|@–J<&ZŸÔóC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜µæÑ‡è@|–J<&ZŸÔóSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUR£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 032b9a4cab0b4decac2e09c13c434b0b@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRN (¯ðÕ¥½I ÷@–,±˜bC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Õð¯(½¥I ÷@–,±˜bSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUS£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ aea00d8a183649318d4e7593a09c0630@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRO QÄÒý3C°"TeOWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÒÄQýC3°"TeOWSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUT£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 85136752c531452894badbacd55951d1@@@@@@@@@@@@Su  3Hi there!SÀ RRP @Á¢®>´K¶=d‚pýõC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¢Á@>®K´¶=d‚pýõSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUU£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 00e8f7baf7444a76a1d63c9d92bc2e09@@@@@@@@@@@@Su  3Ho there!SÀ RRQ  Ñ®+)YèG–aõÆ£ëÙ=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+®Ñ Y)Gè–aõÆ£ëÙ=SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUV£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 1e95f6d205da4774941a1e82dd5ce631@@@@@@@@@@@@Su  3Hey there!SÀ RRR )$Âà9/EŠã!<œßIC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜àÂ$)9E/Šã!<œßISrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUW£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 73a9f45c9a5a4a679067be681e988112@@@@@@@@@@@@Su  3Hi there!SÀ RRS ÎË–gúô I¨ÓBò‡³uC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜g–ËÎôúI ¨ÓBò‡³uSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUX£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 3765e7b7b9c04e8d8c884c902eb7afa5@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRT Ɇ~‰C°øY(˜ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†É~C‰°øY(˜ SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUY£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ d3b1503c5d89434fad5257637e779498@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRU ¹$j] Û%A‘&3|ßœaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜]j$¹Û A%‘&3|ßœaSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUZ£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ 2d61e4bb8473461d8ffa6a5ce7b1cc1a@@@@@@@@@@@@Su  3Hi there!SÀ RRV èq~2B‡AÙØÐ¿9C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜qè~B2‡AÙØÐ¿9SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU[£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ c019d37fd49546bbaaffaf556457c965@@@@@@@@@@@@Su  3Ho there!SÀ RRW ʂՆ÷&IFš 5§&ä+ÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†Õ‚Ê&÷FIš 5§&ä+ÄSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU\£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ d01d7767e0944635b6c3e67a031d9784@@@@@@@@@@@@Su  3Hey there!SÀ RRX RЍï-° F®±5BOlC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï¨ŠR°-F ®±5BOlSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU]£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ ae7740defb9a40a6b797d0b3dea1cac5@@@@@@@@@@@@Su  3Hi there!SÀ RRY UãÑJªõkF¹Ös’ÿ±"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜JÑãUõªFk¹Ös’ÿ±"SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU^£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ 4ee53754754a40b6ac3289c83ac9606f@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRZ ðØßXIJyA³0m!ì„Õ]C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Xߨð²ÄAy³0m!ì„Õ]SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU_£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ 6452879f7f3d4323a0bc0236f6923024@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR[  Ù˜ û@¡ì0Hbf-ìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ù  ˜@û¡ì0Hbf-ìSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU`£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ 66d67615bec547569676af375bac67b2@@@@@@@@@@@@Su  3Hi there!SÀ RR\ ö‘¶@ÇŠoE¶VÑä?…ô-C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@¶‘öŠÇEo¶VÑä?…ô-SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUa£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ a66507d0209644b78d8d4144912f42b9@@@@@@@@@@@@Su  3Ho there!SÀ RR] äc²§X°D‹r°(åöC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜§²cäXD°‹r°(åöSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUb£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ ee5c0da3254c4462a07222f747b2306d@@@@@@@@@@@@Su  3Hey there!SÀ RR^ 5÷»mBYCŠ~{u¾š C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜»÷5BmCYŠ~{u¾š SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUc£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ fa70e4d4964a47838b76f31c95b6f3b3@@@@@@@@@@@@Su  3Hi there!SÀ RR_ tKN{J7æL¬Œ´F›Ú·qC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{NKt7JL欌´F›Ú·qSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUd£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ d363d695ae3149e898af960854aaec1e@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR` ’öÄ(‘âC½WÒ-{M9C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Äö’‘(Câ½WÒ-{M9SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUe£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ b1a13f2e2b5b460fb6bba1477107d367@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRa ð%€S³ÃEŒÄÇÏÅü"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜S€%ð³EÃŒÄÇÏÅü"SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUf£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ a0d06e874b684b74b904e4b2f28453ca@@@@@@@@@@@@Su  3Hi there!SÀ RRb ô[ c×I»§Õ…}€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ [ô×cI»§Õ…}€SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUg£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ 34b1b8c94f5b4930b36fe2480e9528dc@@@@@@@@@@@@Su  3Ho there!SÀ RRc ó9KÛA†ÒD‹˜]Ø' .ˆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÛK9ó†ADÒ‹˜]Ø' .ˆSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUh£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ 1288d1e729c44df1b53b156fb2b9c3d9@@@@@@@@@@@@Su  3Hey there!SÀ RRd ~²½åëûšNj|éH‡ÄôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜å½²~ûëNšj|éH‡ÄôSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUi£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ 638bbd40094040a7a01c9f76f760a057@@@@@@@@@@@@Su  3Hi there!SÀ RRe 0nØý©î@£Q#&Š)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Øn0©ý@î£Q#&Š)SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUj£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ 2aaa8e0faefe464f9e0045f29c042ae4@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRf ECãÆ{²O™¤XC&‹-¼C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãCE{ÆO²™¤XC&‹-¼SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUk£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ dfde108ce1114e25bc9f0cc2d4af34d7@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRg qßþ³â6@¿tü ëëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³þßqâ@6¿tü ëëSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUl£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ cd31fe2243434244bc028688a799c34c@@@@@@@@@@@@Su  3Hi there!SÀ RRh M˜ƒîA®ögu¦ÄzÃC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Mƒ˜Aî®ögu¦ÄzÃSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUm£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ 1e98b4094c184fe8a6825d349c7690a8@@@@@@@@@@@@Su  3Ho there!SÀ RRi ç_è…êcH€•uä¹ 6C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜è_çê…Hc€•uä¹ 6SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUn£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ 991ec1e3d8264b6895b436ae53cd3cfc@@@@@@@@@@@@Su  3Hey there!SÀ RRj Õ±Û»SI±utr9:n|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Û±ÕS»I±utr9:n|SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUo£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ 3fde53ba4fbe40729aae86a23096e13c@@@@@@@@@@@@Su  3Hi there!SÀ RRk 6tùñ>´ÂM¦ýÞ@÷–ÅC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ñùt6´>M¦ýÞ@÷–ÅSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUp£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ 94b88707475d4c32927c2c294feff41c@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRl “Eœðï©G…•°›xÞÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜œE“ïðG©…•°›xÞÕSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUq£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ e3691688028e45c4beeb7556b46ad5ad@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRm éÒ‹ÄGšÇ³ŽézC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Òé‹GĚdzŽézSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUr£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ ab44d47ec51f47e191fc38b7943bfdb1@@@@@@@@@@@@Su  3Hi there!SÀ RRn CýÝJ†KEKŠs°]©IC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜JÝýCK†KEŠs°]©ISrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUs£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ 1eb50643bea9447d803c9029ff2a2663@@@@@@@@@@@@Su  3Ho there!SÀ RRo :{›Û˜N½]Zb`¬7˜C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Û›{:˜N½]Zb`¬7˜SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUt£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ adad5bb9849745879d5b7d5cb94bf8bf@@@@@@@@@@@@Su  3Hey there!SÀ RRp JÒ\ŽØF•ÙÔz % C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜\ÒJØŽF•ÙÔz % SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUu£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ c9f11a3a83c44c018fd9ecb074483ce5@@@@@@@@@@@@Su  3Hi there!SÀ RRq ÷Víº3MœÅÞVÊÇC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜íV÷ºM3œÅÞVÊÇSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUv£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ 8e487ff4cddc4d729f82ea5886895c84@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRr ž 4ÊMK§Èµ˜OHPC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4 žMÊK§Èµ˜OHPSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUw£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ b906f9ef18d24346baaabf4fdab05c9b@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRs R™üÖK[K–2á§ (¾C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ü™RKÖK[–2á§ (¾SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUx£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ b66149d7d9cb4d2e931b03af3e0e22ab@@@@@@@@@@@@Su  3Hi there!SÀ RRt KX”5nåIm’*¯FÌC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”XKn5Iåm’*¯FÌSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUy£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ f4d87ea7ddc7453b9f90f68b5c88075e@@@@@@@@@@@@Su  3Ho there!SÀ RRu t9¼å×ímJŒÇUZÿ8ÇaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜å¼9tí×JmŒÇUZÿ8ÇaSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUz£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ f7bc24d1f4864680af962f69fe0ea14b@@@@@@@@@@@@Su  3Hey there!SÀ RRv ³ý ﯡO•w_Ð Ø­C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï ý³¯O¡•w_Ð Ø­SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberU{£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ 746ca05f92064841ac581390101110de@@@@@@@@@@@@Su  3Hi there!SÀ RRw Š4ß¹–LµhöXÞ²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ß4йL–µhöXÞ²SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberU|£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ 4101f41a967c41f9a1c264ba55f8d083@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRx 3 _¼zpK¸þžª›ôŸC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜_ 3z¼Kp¸þžª›ôŸSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberU}£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ a79f92a70b7542a69501ecc866898b66@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRy @[~»šðL¦HŸ£¸ßC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~[@š»Lð¦HŸ£¸ßSrÁU£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberU~£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ 1353f699ea3e4b379522ad20b2bbde7c@@@@@@@@@@@@Su  3Hi there!SÀ RRz º.AC¹1:E¥L›-¤œ õC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜CA.º1¹E:¥L›-¤œ õSrÁU£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ 1d5c59e32cf44ba083e2f0389f28525c@@@@@@@@@@@@Su  3Ho there! SÀ RR{  ‰F½`ߦ€ªÀC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ F‰½`ߦ€ªÀSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number€£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ b9120148f5ec4563a8eabdab305830ae@@@@@@@@@@@@Su  3Hey there! SÀ RR| ]måº`ßµIÈoÖô¬1C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ºåm]ß`IµÈoÖô¬1SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ b41f3f84833d4f76bab2c322677b6804@@@@@@@@@@@@Su  3Hi there! SÀ RR} ÕQwåå>A‘)×yñpC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜wQÕååA>‘)×yñpSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‚£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ dd6dd88d608043cdaa5d9751f2cb5f5b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR~ 8ÓæÿÿD¯ïØ…¨5C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æÓ8ÿDÿ¯ïØ…¨5SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberƒ£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ fcef537e85df4e329a85f0c30a206238@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR  d^>‚›C® ÙÏâPÀC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^d ‚>C›® ÙÏâPÀSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number„£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ d0e88b9701504935b31ed088f85f065e@@@@@@@@@@@@Su  3Hi there! SÀ RR€ ½Ó/ÄÿcN——ã$£î3C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ä/Ó½ÿNc——ã$£î3SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number…£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ ef5bada9164346c1805abe859d5812db@@@@@@@@@@@@Su  3Ho there! SÀ RR ê¹ïGŠ Iœaë­SC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï¹êŠGI œaë­SSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number†£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ 16ef7dd8fe2f4c4985f937ce1fa38df7@@@@@@@@@@@@Su  3Hey there! SÀ RR‚ ܤÚÌ.€§J²¨-÷°ÊÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ìڤ܀.J§²¨-÷°ÊÝSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‡£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ bea19b42b06845dbb94c88bc9b135d4b@@@@@@@@@@@@Su  3Hi there! SÀ RRƒ ԃaKH–³8úíC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÔЇîaƒKH–³8úíSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberˆ£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ 3b950801e5024818a5eb580777d6c1dc@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR„ »•ÒjÂ(%G®á”çB.ÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jÒ•»(ÂG%®á”çB.ÔSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‰£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ c57b5f6e099b45c99a27bbb6299ceede@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR… ¬Áòr~N¨Þ—î}K©ÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜òÁ¬rN~¨Þ—î}K©ÄSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberŠ£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ 7a561baad99c4c9ea1c4d57addfdf690@@@@@@@@@@@@Su  3Hi there! SÀ RR† &‰Gù{ãK±a›C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜G‰&{ùKã±a›SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‹£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ 2287bc3e1c64455dadee056841d134be@@@@@@@@@@@@Su  3Ho there! SÀ RR‡ Ô,EÉÉC´0ÓàÌ:‰C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜,ÔÉECÉ´0ÓàÌ:‰SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberŒ£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ 5f71a1b51ae74a0eb1e6bb62781be95e@@@@@@@@@@@@Su  3Hey there! SÀ RRˆ Zˆâ›)SXN´ÑÊXgq£C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜›âˆZS)NX´ÑÊXgq£SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ 640c0f24b41544faab254a2cac3b0dcf@@@@@@@@@@@@Su  3Hi there! SÀ RR‰ ޲>Ÿ’B¿×ðÜp±MC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>²ŽŸB’¿×ðÜp±MSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberŽ£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ fc070119619c45d3b6d3cf2b18683525@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRŠ ‘"QÛŸ¼F„V‰&QÚ|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÛQ"‘ŸF¼„V‰&QÚ|SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ fa8b7f0704484f4aaeb56296fc234a69@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR‹ NSe^fõþD­‘@¾GC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^eSNõfDþ­‘@¾GSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ 25ef926f741f4358be2eb2e6b2fd9957@@@@@@@@@@@@Su  3Hi there! SÀ RRŒ èBû#°†J·?b¹¼GŽC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#ûBè°J†·?b¹¼GŽSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‘£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ 694757a4accf4cf485ccaa8f73e7899d@@@@@@@@@@@@Su  3Ho there! SÀ RR ";6°H¯ÅH®Œv´'ÎXC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°6;"¯HHÅ®Œv´'ÎXSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number’£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ 3702a9f3d7ce4f1cb4266b4999793680@@@@@@@@@@@@Su  3Hey there! SÀ RRŽ ßjœÁ8ÄG’ä©'óõ!õC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Áœjß8GÄ’ä©'óõ!õSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number“£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ ad6b74b84d5a41ebbb4edde0dbfcdce6@@@@@@@@@@@@Su  3Hi there! SÀ RR š=ñ+å=F  ÁN•ׯC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+ñ=š=åF  ÁN•ׯSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number”£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ 10ff794e715e4d55825c8d094de9a232@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR @¹dnBH¤ÝÆ&Ù‰ ÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¹@ndHB¤ÝÆ&Ù‰ ÕSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number•£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ 9f5d7269d1694e57a9e65005be2e70aa@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR‘ ºE¯ÑЉK“J|¶“RoC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯EºÐÑK‰“J|¶“RoSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number–£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ b83cad52fee745ad8c58459edec2bcec@@@@@@@@@@@@Su  3Hi there! SÀ RR’ #3ÌÏÓ9GœÉó©; C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÏÌ3#9ÓGœÉó©; SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number—£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ e84e67d0e1404313a162c641d1cb1fa5@@@@@@@@@@@@Su  3Ho there! SÀ RR“ XÌ‚=\uD‡þWÝ~5ÐõC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚ÌX\=Du‡þWÝ~5ÐõSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number˜£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ c8ce7210d00c439fab64d144b35a70fe@@@@@@@@@@@@Su  3Hey there! SÀ RR” Ðrâ*Âá®M¢\Æ*Å3ÂíC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*ârÐáÂM®¢\Æ*Å3ÂíSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number™£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ efe786e68fd94f2a9c568ee49c758b79@@@@@@@@@@@@Su  3Hi there! SÀ RR• |¿Xåy5ÉH†gËÂG?/C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åX¿|5yHɆgËÂG?/SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberš£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ a07a60ab18db40379271c0750e2a7180@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR– ´ËA­%ÓÔCÐ|²þP{C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜­AË´Ó%CÔÐ|²þP{SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number›£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ a381d6e23c794138ab9de04b3009bcd1@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR— øf2D¥q/AŒ()ëÓC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜D2føq¥A/Œ()ëÓSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberœ£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 083ab1b6e61e4f688e8da04cb3790fe8@@@@@@@@@@@@Su  3Hi there! SÀ RR˜ ·uÓWèÎG¸ù»¹¶ÝLC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Óu·èWGθù»¹¶ÝLSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 107d78c61b684b55a1234e05a8b2ca95@@@@@@@@@@@@Su  3Ho there! SÀ RR™ àÌæ‡A‰'/í²y›YC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æÌà‡A‰'/í²y›YSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberž£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 2f2f0e30508041a2a12928f656b27376@@@@@@@@@@@@Su  3Hey there! SÀ RRš ç÷Šamæ©IƒBÂ+ÁIì«C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜aŠ÷çæmI©ƒBÂ+ÁIì«SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberŸ£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 698661f4454e440daedadae817e48304@@@@@@@@@@@@Su  3Hi there! SÀ RR› õ˜¡wksL»meÉ…ê¼âC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜w¡˜õkLs»meÉ…ê¼âSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number £x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 1d53a067687d47769e292e906a9749ad@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRœ Æ·A @E¬ä_2ÇRC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜A·Æ E@¬ä_2ÇRSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¡£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ ff25046060c94be69cb602ada3c43896@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR LŸ²à/†9H„Qˆ‚W$(BC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜à²ŸL†/H9„Qˆ‚W$(BSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¢£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ ba7c3a9462a440d49383c812773cb5bd@@@@@@@@@@@@Su  3Hi there! SÀ RRž Ûýýv±å,I¨xà]IBõC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜výýÛå±I,¨xà]IBõSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number££x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ 658c86a3015b463ea2ce564b7315934d@@@@@@@@@@@@Su  3Ho there! SÀ RRŸ ÊŸQ‘Á&A‚s+ÞèC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜QŸÊÁ‘A&‚s+ÞèSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¤£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ 989f7f8f457d470187bf7eaf1dab460e@@@@@@@@@@@@Su  3Hey there! SÀ RR  L Û.¥Mª •sçÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Û L¥.Mª •sçÏSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¥£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ ef02fcbac2c04469ba12c64ad4688569@@@@@@@@@@@@Su  3Hi there! SÀ RR¡ æ>èAÏ@šÃàaxjC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Aè>æÏ@šÃàaxjSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¦£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ dd57e47205604331859d05dc7be47a11@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR¢ ¥ŒøeÜ/N‚ýSræ§4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜øŒ¥ÜeN/‚ýSræ§4SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number§£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ d3636221a69142ce910bdf159be32d3d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR£ |-ïy+ÇLŒØ¶õùäÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï-|+yLnjضõùäÏSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¨£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ 77386d51738641a4be046c110cfe634e@@@@@@@@@@@@Su  3Hi there! SÀ RR¤ ‰Qd¿Ê­Mž|nEÁÐ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¿dQ‰­ÊMž|nEÁÐ SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number©£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ d49a578213964e7baa74d8d41cac052f@@@@@@@@@@@@Su  3Ho there! SÀ RR¥ îÂãh8p–K»÷¢ C‡ß¯C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hãÂîp8K–»÷¢ C‡ß¯SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberª£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ 8e8e607bf4c04c948ff6679474cf7ff2@@@@@@@@@@@@Su  3Hey there! SÀ RR¦ *ÂÉ"¾aD¢’÷‘ºEi‘C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÉÂ*¾"Da¢’÷‘ºEi‘SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number«£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ 0cb119b874344909941c34719c75769d@@@@@@@@@@@@Su  3Hi there! SÀ RR§ Y»‰¸WMIœ[#Ò•C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¸‰»YWIMœ[#Ò•SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¬£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ c94644c17ee64812827cabf3e39a61d4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR¨ ÎÖä:ä"_I·ckgêÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:äÖÎ"äI_·ckgêÔSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number­£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ 2b291706aeb041969befce5f65b86259@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR© qYKxÆÇF”à'ùÈà8C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜KYqÆxFÇ”à'ùÈà8SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number®£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ ebcd8d1f76b9494298f2545f3f9a4818@@@@@@@@@@@@Su  3Hi there! SÀ RRª j*†^^³B®Nºñ‘æ#ÎC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^†*j^B³®Nºñ‘æ#ÎSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¯£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ 720d07c5c1f744f4a37640003da03265@@@@@@@@@@@@Su  3Ho there! SÀ RR« ܾÓ&&ÌDžóUfjS‰ùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ó¾Ü&&DÌžóUfjS‰ùSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number°£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ d4723a5885f64de49a7092e9c004650d@@@@@@@@@@@@Su  3Hey there! SÀ RR¬ 4Ç´º O´ô\•쩘C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ç4º´O ´ô\•쩘SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number±£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ 2787ca5d76bd4182a32bf577bf3c6f26@@@@@@@@@@@@Su  3Hi there! SÀ RR­ h3D÷vïF<ð·\Y8C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜÷D3hïvF<ð·\Y8SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number²£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ 6e4bf0134adc41b0a03b57b0f56f1547@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR® "N~ ŽF¢»"ÆôàC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ~N"ŽF¢»"ÆôàSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number³£x-opt-locked-untilƒ`f¥|zSsÀ/ ¡ 724b7a3641b54c2c9c0ae81c208ecac6@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR¯ ”ö/ÚëµîI²€Ék›„C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ú/ö”µëIî²€Ék›„SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number´£x-opt-locked-untilƒ`f¥|zSsÀ/ ¡ 026a13c3f2614eb1919b91db3b01bde1@@@@@@@@@@@@Su  3Hi there! SÀ RR° 2…ÍÃF¨L÷Ï#®á DC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÃÍ…2¨FL÷Ï#®á DSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberµ£x-opt-locked-untilƒ`f¥|zSsÀ/ ¡ 3297935e6cd14c40a2971e66e8164e5f@@@@@@@@@@@@Su  3Ho there! SÀ RR± žéRT% Jšs- "³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Réž%TJ šs- "³SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¶£x-opt-locked-untilƒ`f¥|zSsÀ/ ¡ 4be135e5db3644e2b74c4746af77698f@@@@@@@@@@@@Su  3Hey there! SÀ RR² Þî· É’“à·ÿrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5¹Š¶#MHtŽ>’“à·ÿrSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberº£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ 156a8b12d1ce424bbedd5df1c81d8b46@@@@@@@@@@@@Su  3Hi there! SÀ RR¶ HÉÐÈ($øFŠ‘Óî–*C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÈÐÉH$(FøŠ‘Óî–*SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number»£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ f2f9b7ba39cf4392a25e99d136dc727f@@@@@@@@@@@@Su  3Ho there! SÀ RR· Žòüæß³V@‚2j>yØ,LC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æüò޳ß@V‚2j>yØ,LSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¼£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ 83cc01d73fdf4ac5b063ba5302807a86@@@@@@@@@@@@Su  3Hey there! SÀ RR¸ ¹°¾ƒûñG‡™O¡U}|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾°¹ûƒGñ‡™O¡U}|SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number½£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ 223f83990ef4481d9beabc54695e8502@@@@@@@@@@@@Su  3Hi there! SÀ RR¹ pîk+—ޝH¤ÿe‡Ë(fC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+kîpŽ—H¯¤ÿe‡Ë(fSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¾£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ 35dc8b8c5b60474db747703d4668a79a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRº ó aŒrM³{\ßñäÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜a órŒM³{\ßñäÞSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¿£x-opt-locked-untilƒ`f¥}SsÀ/ ¡ c431a44d0eab43c98418cb4be7c059d0@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR» ´Ž‰5wC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜8ÛàßgGQ¯¢k‹[>5wSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberÜ£x-opt-locked-untilƒ`f¥~}SsÀ/ ¡ 8f06d767f672423ba41e0a0a15e37568@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRØ ÐvBh7dFH¹P9tx'C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hBvÐd7HF¹P9tx'SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberÝ£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ ec8876acd49f4614a3a99998195cb99b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RRÙ qQ&·ÁÌA—V±êï«eC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜&QqÁ·AÌ—V±êï«eSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberÞ£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ c05a4478472b44f19023ee9edd18c1aa@@@@@@@@@@@@Su  3Hi there! SÀ RRÚ ìX•ÝC„ÿg[WGJÈC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ì•XCÝ„ÿg[WGJÈSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberߣx-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ a4d6f4c395964b968a2485185e3e05dc@@@@@@@@@@@@Su  3Ho there! SÀ RRÛ m&€#h:õK…‘³Ix$uC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#€&m:hKõ…‘³Ix$uSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberà£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ 82b03c260e0f4edeaf9ae40ab03dd516@@@@@@@@@@@@Su  3Hey there! SÀ RRÜ @ûrÄ¥ÑEº…Ú›Tq*C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜rû@¥ÄEѺ…Ú›Tq*SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberá£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ 04ea404508714aa7b52b8efaa95bc00a@@@@@@@@@@@@Su  3Hi there! SÀ RRÝ YA kú$K¾ÕË]3C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜k AYúK$¾ÕË]3SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberâ£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ ffde1734f93d4c75b3590e0716508c9a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRÞ ŠOœ¤^c·C³Ýd…ôêG™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤œOŠc^C·³Ýd…ôêG™SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberã£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ 3ff7af3dcf3a492ea5033aab64364a2f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RRß @Í iLiA­Pûîß*ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ Í@LiAi­Pûîß*ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberä£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ 69a705e1b68948acb21211633cd118c1@@@@@@@@@@@@Su  3Hi there! SÀ RRà ¢;l˜êTF ƉõàhC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜l;¢ê˜FT ƉõàhSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberå£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ dbcb72ada6524654b7f3c1f77e76359e@@@@@@@@@@@@Su  3Ho there! SÀ RRá ÿ#îXÍ„L¶;.?—·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Xî#ÿÍL„¶;.?—·SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberæ£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ 2dd57e04cedc4803ae1d9f1050b112c6@@@@@@@@@@@@Su  3Hey there! SÀ RRâ —mv}ÌÕçD€'˜ÂjhùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜}vm—ÕÌDç€'˜ÂjhùSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberç£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ d57e665a1b764308a94ff259425fb7be@@@@@@@@@@@@Su  3Hi there! SÀ RRã ÕTC'Y%O{‚.IC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜CTÕY'O%{‚.ISrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberè£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ 04bf17b9d74c47fba115df742179ab36@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRä ¡z^x[©G»ÙDvüÃ×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^z¡[xG©»ÙDvüÃ×SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberé£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ c9ccc81ffdb94fc8aac261053214162e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RRå Õ±Yâø5è@  Û)äìvC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜âY±Õ5ø@è  Û)äìvSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberê£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ 766c71a41ac649a4834a180faa578670@@@@@@@@@@@@Su  3Hi there! SÀ RRæ vîyñÕã±NŽ×" Þ’ùåC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ñyîvãÕN±Ž×" Þ’ùåSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberë£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ e78849aa93e9402bb5954364fc97bd1a@@@@@@@@@@@@Su  3Ho there! SÀ RRç ż0Žï÷5Dˆ§6&йeC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ž0¼Å÷ïD5ˆ§6&йeSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberì£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ 1c86ba96e0064b92a9ac9d138c78bc64@@@@@@@@@@@@Su  3Hey there! SÀ RRè Aä_?BêŸK™(ö¹¸½DPC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜?_äAêBKŸ™(ö¹¸½DPSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberí£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ cd77e7b7b69a474299041a3d3a2207bb@@@@@@@@@@@@Su  3Hi there! SÀ RRé c§¹æRMˆæaMB†;`C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¹§cæMRˆæaMB†;`SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberî£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ 77c71356fc5f4a128a7aca008eab6124@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRê ïx›-°Až tÒ´‡ØLC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜›xï°-Až tÒ´‡ØLSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberï£x-opt-locked-untilƒ`f¥ôSsÀ/ ¡ 6c0850b4da2f4b02ba02c07eba55dc81@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RRë ^ÅM´…¿5G¼²öƒÕ:žEÿêv^Eš¨|">KH¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿE>(vêE^š¨|">KH¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥LSsÀ/ ¡ dea138aa54634b06860267b951ff6599@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ˜AåkiUN¨EÒ†í¥+KC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜kåA˜iNU¨EÒ†í¥+KSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥LSsÀ/ ¡ eb014cd8456240a1a7e3fe9cc2a7e64f@@@@@@@@@@@@Su  3Ho there! SÀ" Rp ÷>â[P‚L¶>ýäíC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜â>÷P[L‚¶>ýäíSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥LSsÀ/ ¡ ac8849ddf40e4e709282d14384d9db1d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp wМqQJŽ1“kžâhuC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜œÐwQqJŽ1“kžâhuSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥LSsÀ/ ¡ c40a9a4359fa4e6b9d924eb8c4d35ff9@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ÿŠ_»ôŽK¢°*)g™üC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜_Šÿô»KŽ¢°*)g™üSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥LSsÀ/ ¡ c87f99e59a1049b7884fcc8896b79598@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ˜ù‡¶Ù[F–šU|Ræû¯C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¶‡ù˜ÙF[–šU|Ræû¯SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 151464175be14d0f913333c80290c835@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp  ¹?v tKª· ¨Ø'C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜v?¹ Ktª· ¨Ø'SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 9b1e8380ef0945819259c394ba148c2a@@@@@@@@@@@@Su  3Hi there! SÀ" Rp  ÇßN·nM¾àìÍ¥¿C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜NßÇn·M¾àìÍ¥¿SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 961f656b9cf74b4286c97c28e6c154c5@@@@@@@@@@@@Su  3Ho there! SÀ" Rp   IïJ¦-í9RC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜I Jï¦-í9RSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 8459fc5229c649f7a664317b9ae4bc99@@@@@@@@@@@@Su  3Hey there! SÀ" Rp  •æi¬M\A“¿¯PmØ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¬iæ•MA\“¿¯PmØ SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 32adb445e6084c679ef20f2c7ee4da5e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp  ÉPJ1í(Nµœôu ?ÖC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜1JPÉíN(µœôu ?ÖSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ abea8e376646410c86fecc7f8745a914@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp —Kf&™F¹bOÔÈÍC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K—&fF™¹bOÔÈÍSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ 4b5b952fb58c4e65aaec3a7ddbdeea2c@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp žÙ}h|ßH‚L{ lÓ–C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h}Ùž|Hß‚L{ lÓ–SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ 92b692e0e3524b58a8abc53a06088f8a@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ÛÐB@ûÑF£Ìª*>šú4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜BÐÛû@Fѣ̪*>šú4SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ e5f5b3364f4840679660874202ce0320@@@@@@@@@@@@Su  3Ho there! SÀ" Rp Ïj$ÇÁH´R¬DHˆ³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jÏÇ$HÁ´R¬DHˆ³SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ cd93fefa73124756b6841cf3e193ebd4@@@@@@@@@@@@Su  3Hey there! SÀ" Rp æH"«OÀK¾Ÿ²§MðñC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜"HæO«KÀ¾Ÿ²§MðñSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ 0c6238724eae4cf5908523888ffe6264@@@@@@@@@@@@Su  3Hi there! SÀ" Rp Ô÷PœËã²CúoÁ«rtC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜œP÷ÔãËC²úoÁ«rtSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ 08ccb57caa0a475591595e89e4a66ba7@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ˜NñáÒ/ÇF³/È*E·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜áñN˜/ÒFdz/È*E·SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ f07d366fe1bf4fec9acf4b70d32d13aa@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp E' ë\&¯A¤¥vàk°AC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ë 'E&\A¯¤¥vàk°ASrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ b2ed3517511543f8826dec4d97254249@@@@@@@@@@@@Su  3Hi there! SÀ" Rp Þg«š‡N—ƒxÆ‹ì]éC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜gÞš«N‡—ƒxÆ‹ì]éSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ dc0083cb929344ae9dcc9c52c0f2df3a@@@@@@@@@@@@Su  3Ho there! SÀ" Rp Êììæñ"=N°UN%“ú×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æììÊ"ñN=°UN%“ú×SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ 2f6af03ee0394084be75c76ec1ee6b3d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp Ì– h2ÔI„ämDd?õ1C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ –Ì2hIÔ„ämDd?õ1SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ 627c75139b7e4f628446c0a405ee5f5c@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ö1¥¯ yKD…ÑÖBC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯¥1ö KyD…ÑÖBSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ df9ba16bb75d494382e8a533a662d7c8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp %1dÏ”ë@M³˜PU¨üüZC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ïd1%ë”M@³˜PU¨üüZSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ 5e9a0c738d774345a8872bd53eed9c51@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp gAÔåìŠäK¶œCA1!m-C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åÔAgŠìKä¶œCA1!m-SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ 15f84acd8fd84166ae7d226a4aca16a9@@@@@@@@@@@@Su  3Hi there! SÀ" Rp L˜˜ˆ4úL³dE]CQûC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ˆ˜˜L4Lú³dE]CQûSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number!£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ d5b5ae82c2b64e4f89bf0da59e375667@@@@@@@@@@@@Su  3Ho there! SÀ" Rp €‰t:¹f@ˆÀ Þe§ëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:t‰€¹@fˆÀ Þe§ëSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number"£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ 7f52ad7e42c54cc58db96bb72f23b187@@@@@@@@@@@@Su  3Hey there! SÀ" Rp £c.â%±K„.÷kv‰ >C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜â.c£%K±„.÷kv‰ >SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number#£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ 0615a6e6574e435a96e53a7f0dd93c51@@@@@@@@@@@@Su  3Hi there! SÀ" Rp |»Ð<´µ£F—È|‘`6‹ÐC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜<л|µ´F£—È|‘`6‹ÐSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number$£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ e3e1af49000c4e35b17129e6b8616646@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  û†eò=]M¨)Óº¶õC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜e†û=òM]¨)Óº¶õSrÁ\£x-opt-enqueued-timeƒ`f¤‡£x-opt-sequence-number%£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 650ea52bdd2249c39578d9709f6c9b73@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp! \M7¤õO¦±$†gû C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜M\¤7Oõ¦±$†gû SrÁ\£x-opt-enqueued-timeƒ`f¤‡£x-opt-sequence-number&£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ c327a03fd378488897b0197035e7d883@@@@@@@@@@@@Su  3Hi there! SÀ" Rp" ÂòÇWzH³ª³2U #%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÇòÂzWH³ª³2U #%SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number'£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 6b7f1d241bb347eaa96ea2059b1fa48d@@@@@@@@@@@@Su  3Ho there! SÀ" Rp# ¡ˆè¢°OœÔOgKDÌC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜èˆ¡¢O°œÔOgKDÌSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number(£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 018ce47e79c7431caecfecaf9cbf6a88@@@@@@@@@@@@Su  3Hey there! SÀ" Rp$ €í ½qE‘(Ò'¾1C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ í€q½E‘(Ò'¾1SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number)£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 22aa9820b5054e2e9de9247a9ed8de0e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp% SÑÿ¸`‡O¸“3]ðiÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿÑS`¸O‡¸“3]ðiÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number*£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 46c9365259714adeb8ebb862ab108062@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp& U‰KL{”Cˆ÷þýõ¡çWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K‰U{LC”ˆ÷þýõ¡çWSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number+£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ f343508c9e0f4bf08977b3ef3a232382@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp' È [}ÂÛŸCžØ@=CùÖÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜}[ ÈÛÂCŸžØ@=CùÖÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number,£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ 3a7b3d48c9e7440185139e486234c19a@@@@@@@@@@@@Su  3Hi there! SÀ" Rp( …d =K{&B”8ˆ,æ ÍC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜= d…{KB&”8ˆ,æ ÍSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number-£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ 106f2f4993e74d54bf59662c7086b5bb@@@@@@@@@@@@Su  3Ho there! SÀ" Rp) lö6ØŽ™H¥¥÷ŸºÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜6ölŽØH™¥¥÷ŸºÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number.£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ d5957aa44c174389b812be4c5852e290@@@@@@@@@@@@Su  3Hey there! SÀ" Rp* ~-.ó‚~\K’^æ¨Ù¾ÌC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ó.-~~‚K\’^æ¨Ù¾ÌSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number/£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ 87c2499d7c3c40bdbafaaed8cc763869@@@@@@@@@@@@Su  3Hi there! SÀ" Rp+ pƺã{oLˆ$Ôµ'µY´C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ºÆp{ãLoˆ$Ôµ'µY´SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number0£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ c826ccdcfe2945aeb0669569698deae1@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp, Pmxôd 5O¼4”{«“ÅrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ôxmP dO5¼4”{«“ÅrSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number1£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ a25dfb3bc65345bfbb110f89aca1b441@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp- DBOž‡—HŠB;CÛ&ÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜OBD‡žH—ŠB;CÛ&ÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number2£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ 483083f747904824b60d599536786ae1@@@@@@@@@@@@Su  3Hi there! SÀ" Rp. 3 ›…1äF²\ÌŠÓ4zC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜…› 3ä1F²\ÌŠÓ4zSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number3£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ d71dc11cff7c426db020b714b2a3616f@@@@@@@@@@@@Su  3Ho there! SÀ" Rp/ ëcIp–ÔA„yÞëPâ©C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Icë–pAÔ„yÞëPâ©SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number4£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ ba20998dbf164c31b6b353889c222f08@@@@@@@@@@@@Su  3Hey there! SÀ" Rp0 V‚ÜÕ3K@‚m¼uÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ü‚V3Õ@K‚m¼uÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number5£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ 35894c5eb4b84f108867b8243669cc18@@@@@@@@@@@@Su  3Hi there! SÀ" Rp1 m iÅæL€ñpÌÖnC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Åi mLæ€ñpÌÖnSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number6£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ 7a555fd372734b53a7b0faacbb6544af@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp2 t™ÚvN¦JK™Æ·ÏMC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ú™tvN¦JK™Æ·ÏMSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number7£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ 11737e5254f246b1bc8297abedc71e03@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp3 Ó.Ód-íE¾UˆÚH/1øC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ó.Ó-dEí¾UˆÚH/1øSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number8£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ 1c45c1db59f04560b6e373b5b3f48508@@@@@@@@@@@@Su  3Hi there! SÀ" Rp4 ¾I›½üq«N·à ˜æòí“C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜½›I¾qüN«·à ˜æòí“SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number9£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ a3eb3e3b59684f2ba88d337d9225a03a@@@@@@@@@@@@Su  3Ho there! SÀ" Rp5 $µÑ·Ÿ¸N€#ËäLQ`C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ñµ$Ÿ·N¸€#ËäLQ`SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number:£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ c313e4076d294fccb3117906cbccb8a6@@@@@@@@@@@@Su  3Hey there! SÀ" Rp6 †y„¼†4F°áÇa†z=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜„y††¼F4°áÇa†z=SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number;£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ 7b865139ae6548448cb832b4953674cb@@@@@@@@@@@@Su  3Hi there! SÀ" Rp7  â’j±rI¢^\¾ì¸[BC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜’â ±jIr¢^\¾ì¸[BSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number<£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ 0671cc17f07c4328a757560a6b858763@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp8 «Þj DO‚Ú…¦Kœ¿C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jÞ«D O‚Ú…¦Kœ¿SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number=£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 2c2434caad7d47edb11e852802e77742@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp9 ƒ=­¼ÛIŽZt`ÄuC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜­=ƒ¼IÛŽZt`ÄuSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number>£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ bf2dbf4e445f4b70a8fd21940a65e3a6@@@@@@@@@@@@Su  3Hi there! SÀ" Rp: B{°Ì¨B‰®ÔäíëˆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°{BÂÌB¨‰®ÔäíëˆSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number?£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 1af95c6d049240e7b66ef00714af278e@@@@@@@@@@@@Su  3Ho there! SÀ" Rp;  h†ú¯ÓÄB–üîæ¿§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ú†h Ó¯BÄ–üîæ¿§SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number@£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 1005ddc503f84f4aaf702adf6ca4008f@@@@@@@@@@@@Su  3Hey there! SÀ" Rp< Î2—{p~5J€}šðŽ›jC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{—2Î~pJ5€}šðŽ›jSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberA£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 9bb2253398f64adea274b0114dfdc9a8@@@@@@@@@@@@Su  3Hi there! SÀ" Rp= æ=§ƒVL£³í"]4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜=惧LV£³í"]4SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberB£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 602a8df4231a4ba5aa48625a66b8faa8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp> ÂlÎu½Ë¬A‡¯9c2ñîC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜uÎlÂ˽A¬‡¯9c2ñîSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberC£x-opt-locked-untilƒ`f¥„˜SsÀ/ ¡ 2d64836fbe984dee935428c18808bea6@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp? Qàe—†dpJ“4«_S‚¤ÁC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜eA2ÑÖDk»G>‚¤ÁSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberM£x-opt-locked-untilƒ`f¥„æSsÀ/ ¡ 92605924b77c4480b8d69f02601ef993@@@@@@@@@@@@Su  3Hi there! SÀ" RpI ñ‹Ü‰£5F…tîý^'[C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ü‹ñ£‰F5…tîý^'[SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberN£x-opt-locked-untilƒ`f¥„æSsÀ/ ¡ bbb047a607ad467fbd6e34f2462b869d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpJ T|dWÞþI»’0…RA§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Wd|TÞIþ»’0…RA§SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberO£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ ddc11f78ab6a409897b40d06d5e7262b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpK ^¹ ‡ªN‹M¬a#¿³úC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ¹^‡Nª‹M¬a#¿³úSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberP£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ 648de61a7b0d4dcea04b0ed877278e39@@@@@@@@@@@@Su  3Hi there! SÀ" RpL _ª Í­ÛÑC¯´ïZ¡ï;C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Í ª_Û­Cѯ´ïZ¡ï;SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberQ£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ f9adbd21c34946ee8a3984b2e32e211f@@@@@@@@@@@@Su  3Ho there! SÀ" RpM LY}=Ó*†M³(}³&Fá^C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜=}YL*ÓM†³(}³&Fá^SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberR£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ 8339b72a2ac6455abc3370f9c92162ce@@@@@@@@@@@@Su  3Hey there! SÀ" RpN .ÓWŽHÑvC­g ìç3,C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ŽWÓ.ÑHCv­g ìç3,SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberS£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ ce2f274feaec4f70b91d09eed3bddd19@@@@@@@@@@@@Su  3Hi there! SÀ" RpO š>NåÚÁC‚—ª[À¸›/C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜N>šÚåCÁ‚—ª[À¸›/SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberT£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ 653527ab84044d13a427e1baca67f3c0@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpP ¼å.MÏeF¾)•çr:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜M.å¼eÏF¾)•çr:SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ 519abdb61d7f420ba2f36e39bb3db0ef@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpQ Åx9|FRsG™Ï³xÓ¤C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜|9xÅRFGs™Ï³xÓ¤SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberV£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ fb5a0884a8c6441ea51718e0a661aaa0@@@@@@@@@@@@Su  3Hi there! SÀ" RpR r˜ÂÑH,°L¥ª–*xæiC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ñ˜r,HL°¥ª–*xæiSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberW£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ 07f8fb16fddd49c4b3c8f7c1ab22ade4@@@@@@@@@@@@Su  3Ho there! SÀ" RpS e³u­;*ºMŒƒæ9ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜­u³e*;MºŒƒæ9ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberX£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ 650f6d81885e4cdabb4b592e0646d34b@@@@@@@@@@@@Su  3Hey there! SÀ" RpT džI:?KŠï«ìÈâ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜I†Ç:K?Šï«ìÈâ SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberY£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ 75207c55e09f4beaa8c28a706ec232de@@@@@@@@@@@@Su  3Hi there! SÀ" RpU ôí® ìC­>'xbT C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜íô ®Cì­>'xbT SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberZ£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ c47b6a35cc134e658f12aa37d88df884@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpV –¼‚ªÈÐB’lß_Ê~C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚¼–ȪBÐ’lß_Ê~SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number[£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ ebafb73a5f7e4ac4a1d51b30d17838c1@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpW ñ3ÀùÖËM²Ä} ¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜À3ñÖùM˲Ä} ¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number\£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ dafd5e6d798445819eed719630728f49@@@@@@@@@@@@Su  3Hi there! SÀ" RpX mÜmYYäD…Ã9×à¾?C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜YmÜmYDä…Ã9×à¾?SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number]£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ 9a476888f07c435eada3ab1fbc28f785@@@@@@@@@@@@Su  3Ho there! SÀ" RpY 0S³h%iH¥0¶Y´´ç…C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h³S0i%H¥0¶Y´´ç…SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number^£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ fb7ebd9baa234a43a3e57fc21ed19bf6@@@@@@@@@@@@Su  3Hey there! SÀ" RpZ ²ÂÞ©q@ºh%@trC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜²©Þ@qºh%@trSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number_£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ c56111cdf1914729b9b4d1d40a91100e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp[ ØÊ>"møC°îíǯmbC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜">ÊØmCø°îíǯmbSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number`£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ 0482790c38bf4833b12b2964cefb8cd4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp\ H‚Îà0¾›H·â©”g j¡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜à΂H¾0H›·â©”g j¡SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbera£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ 2b4dbc3d4d0b4127a844cdb834072149@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp] ï@Ì=Ì»AŸˆv•}šAC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜=Ì@ïÌA»Ÿˆv•}šASrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberb£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ 91b6a4d551314d358d9f1a2fc9ead8cd@@@@@@@@@@@@Su  3Hi there! SÀ" Rp^ u a-¤:ñH¼‚yƒ±/7QC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜-a u:¤Hñ¼‚yƒ±/7QSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberc£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ 5bb798a0f56f407fb32f4aced9ab7b6b@@@@@@@@@@@@Su  3Ho there! SÀ" Rp_ @þA¾> H²âpʱÚ4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾Aþ@>H ²âpʱÚ4SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberd£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ 7e4da77629734338b421821736db8ccd@@@@@@@@@@@@Su  3Hey there! SÀ" Rp` ÿÝXIÌÐÅIŽe+™ÞùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜IXÝÿÐÌIÅŽe+™ÞùSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbere£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ ede20d5ad1e347599325619172beac8f@@@@@@@@@@@@Su  3Hi there! SÀ" Rpa Þ±l@‰è}M‹Ëòïkt@BC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@l±Þè‰M}‹Ëòïkt@BSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberf£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ a80a2c36a07d458e8bdfc5018418cc24@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpb Öÿ˜ÃíSO Í1H}C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜˜ÿÖíÃOS Í1H}SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberg£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ 4492376ecb1648efb9ee4b6893453099@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpc ¬Ìžú!ÔIµ©€“{˜²ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜žÌ¬!úIÔµ©€“{˜²ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberh£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ 3e1c68767862407e9a9e9d3870aa12f5@@@@@@@@@@@@Su  3Hi there! SÀ" Rpd Ã}4€îÀØE©D?Lš¶C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜€4}ÃÀîEØ©D?Lš¶SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberi£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ 68f57d9977eb4f8f8d65e0abea2fcaa6@@@@@@@@@@@@Su  3Ho there! SÀ" Rpe 7<—h¯»ÌH‹õ…äJëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h—<7»¯HÌ‹õ…äJëSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberj£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ c9aa539506a641d592f0f1692a6c4ac0@@@@@@@@@@@@Su  3Hey there! SÀ" Rpf MÙcÀƒþ§I¯Oò`˜Ø1C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÀcÙMþƒI§¯Oò`˜Ø1SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberk£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ d9c2ab8cf4f64518a275db31095e8c42@@@@@@@@@@@@Su  3Hi there! SÀ" Rpg û¬Ëÿ8:Lšïû—xC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ë¬û8ÿL:šïû—xSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberl£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ 5fe0bd2523664c5f87390a60a16e5080@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rph -”tCnÿNƒD õr-C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ct”-ÿnNƒD õr-SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberm£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ d577786be88e41c5bdb5ec6421544710@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpi  ¤¦ôþKG—[–…ß­ÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¦¤ þôGK—[–…ß­ÔSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbern£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ b893ca6baec74cafbf9d3889e8aa2509@@@@@@@@@@@@Su  3Hi there! SÀ" Rpj NCš8BüÙJ±?b±`yÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜8šCNüBJÙ±?b±`yÕSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbero£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ 426e348bd0b442b6aaf28349ec32488f@@@@@@@@@@@@Su  3Ho there! SÀ" Rpk YûÖwüÆêH¯pk¨›‰C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜wÖûYÆüHê¯pk¨›‰SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberp£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ aec5bbec59a64cabb871323b79fc912c@@@@@@@@@@@@Su  3Hey there! SÀ" Rpl ­a›cݸMˆ¹IÍ×lªC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜›a­ÝcM¸ˆ¹IÍ×lªSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberq£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ 6cf1d22a20cb44718704f632b663f760@@@@@@@@@@@@Su  3Hi there! SÀ" Rpm ÇB£>*7)K½ÌwlYC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>£BÇ7*K)½ÌwlYSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberr£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ 6d9988e933b34965bb6d4247fa5ac1c2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpn ¼0 ÄE|»Kž—¿è\¾0C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ä 0¼|EK»ž—¿è\¾0SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbers£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ cae36d3818a94ca0a12e5b9e4a9a1e73@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpo ä^•‹:ÙàN¨­Qà.ODÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‹•^äÙ:NਭQà.ODÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbert£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ a08aafd79c2745608b67419d0f9a842e@@@@@@@@@@@@Su  3Hi there! SÀ" Rpp ·èû ‘ñNm<uDêC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ûè·‘ Nñm<uDêSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberu£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ 6cc28418df78436faf166b756a90141c@@@@@@@@@@@@Su  3Ho there! SÀ" Rpq Ó¯¬sœ Mƒ›,¿9gÀ†C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¬¯ÓœsM ƒ›,¿9gÀ†SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberv£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ f1d50cdb4cdf46479dc40a37b95a1ad6@@@@@@@@@@@@Su  3Hey there! SÀ" Rpr …Ð?0EbkO¼âoNH©C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜0?Ð…bEOk¼âoNH©SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberw£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ edfea29f7c354106a353e2c20f55c4ca@@@@@@@@@@@@Su  3Hi there! SÀ" Rps ÏcÎ××1CƒdH²ÊÏÂC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜×ÎcÏ×C1ƒdH²ÊÏÂSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberx£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ 31d831e3d1814f03be9903e7dbe8f86c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpt þÄOh>‹ìIšÁ¼Ø@>åC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hOÄþ‹>IìšÁ¼Ø@>åSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbery£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 486b9a77939c46f4bcf89994c5bd520e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpu ”æ‹MF..M©ÆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”æM‹F..M©ÆSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberz£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 0969feee786c43aca37b2f0ec735d761@@@@@@@@@@@@Su  3Hi there! SÀ" Rpv ƒå:êú¤ E‰ÛŒË$qaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ê:僤úE ‰ÛŒË$qaSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number{£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 711e988fc2504fa5a52159c33f591804@@@@@@@@@@@@Su  3Ho there! SÀ" Rpw Ì*y‰•ŒUGˆî“SÖƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰y*ÌŒ•GUˆî“SÖƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number|£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ a693da10927c42478b528f385ccfd083@@@@@@@@@@@@Su  3Hey there! SÀ" Rpx Ñ„^!cCÄJºmG^ÃŽQ\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜!^„ÑCcJĺmG^ÃŽQ\SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number}£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 7af0c7c0d9ff48a1b7c95523cd35f4f0@@@@@@@@@@@@Su  3Hi there! SÀ" Rpy ÈkO1øK·o?Ž5vy‰C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜1OkÈKø·o?Ž5vy‰SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number~£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 680826af446243f89f9841b77509b6cb@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpz ƹ  5¦OŠzvC`6hC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ¹Æ5 O¦ŠzvC`6hSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ 57cf557907214318883c9d73dd09598b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp{ ¤ÈÚ߸§»IžôPQÍÔy(C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ßÚȤ§¸I»žôPQÍÔy(SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number€£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ 136ebcc72ced4412b4f84d2071498789@@@@@@@@@@@@Su  3Hi there! SÀ" Rp| ±žðU+FŠá†ÿ¯ÐCC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ðž±UF+Šá†ÿ¯ÐCSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ 6eaea7033c214f80a651e3b7defc4f83@@@@@@@@@@@@Su  3Ho there! SÀ" Rp} ÷8·ž>¬I¸ö¤¶§ÕgøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ž·8÷>I¬¸ö¤¶§ÕgøSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‚£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ b5cfe961723849318a07efdf536ec915@@@@@@@@@@@@Su  3Hey there! SÀ" Rp~ /p[W? K³ÄzÏ$^·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜[p/?WK ³ÄzÏ$^·SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberƒ£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ aed7595d2ce04c6e84c9f4b54154a1f7@@@@@@@@@@@@Su  3Hi there! SÀ" Rp #V˜„)O€8O2á÷C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜V#„˜O)€8O2á÷SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number„£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ adc378acd37b4865b4043cccb49afcbf@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp€ FÓ}„ULLƒü¬­79C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜„}ÓFULLƒü¬­79SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number…£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ bfa9c37793954385bf685eb3e62e8dd1@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ÛÛ4\õLº¤­9–öºC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4ÛÛ\Lõº¤­9–öºSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number†£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ 69932e0b86b745799a607d88d3af732f@@@@@@@@@@@@Su  3Hi there! SÀ" Rp‚ „âJ—•ÝA¹98ž~~²µC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Jâ„•—Aݹ98ž~~²µSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‡£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ 39413c18102743658efe4351725c536d@@@@@@@@@@@@Su  3Ho there! SÀ" Rpƒ õ!N[;´G˜´à3üå¶,C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜N!õ;[G´˜´à3üå¶,SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberˆ£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ 4211d7eac992432c8d659e8dab039161@@@@@@@@@@@@Su  3Hey there! SÀ" Rp„ Ã4[Ïá+L¤c —OåR³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜[4ÃáÏL+¤c —OåR³SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‰£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ e0ac40ff8b764ca28024d8b6f4b3a39f@@@@@@@@@@@@Su  3Hi there! SÀ" Rp… Á×ÍÂØ+E¿÷5&ë1zC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÂÍ×ÁØE+¿÷5&ë1zSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberŠ£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ 18d645d90b7e4527857c0106a25a009d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp† Ê0@KÃîþF©I TÓ€Q|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K@0ÊîÃFþ©I TÓ€Q|SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‹£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ 148c1ceb97b346d094f7ed6ff416a11a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp‡ ººÞð$©B…›m)`ä>“C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ðÞºº©$B…›m)`ä>“SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberŒ£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ 21e60487af14473cbd6ec54459cbbef4@@@@@@@@@@@@Su  3Hi there! SÀ" Rpˆ ØrcÂ}×Fˆ”`7r-ÖÇC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜crØ}ÂF׈”`7r-ÖÇSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ f23f39da000f46a0a8cb69abb87bc729@@@@@@@@@@@@Su  3Ho there! SÀ" Rp‰ ̽<Ù먩EºdòSÈZ˜LC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ù<½Ì¨ëE©ºdòSÈZ˜LSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberŽ£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ 06dbd3d95e8246b0a306e66b1ff07d25@@@@@@@@@@@@Su  3Hey there! SÀ" RpŠ '„—\¼D§GƒÞ#Z0fëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜\—„'D¼G§ƒÞ#Z0fëSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ 90bb8fe5e8664fa5b0c171ecf2385eed@@@@@@@@@@@@Su  3Hi there! SÀ" Rp‹ óØ&à?¿I‹pÀ˜vˆæC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜à&Øó?I¿‹pÀ˜vˆæSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ d01da4c17d374fad82a7c093bdb0188b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpŒ ª~ó‚Æ-”BŸl_PK‡¦~C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚ó~ª-ÆB”Ÿl_PK‡¦~SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‘£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ 912bbebe64334dd59e52ee9fef3310ab@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp œV”W§Ðà@”b¯8meRÆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜W”VœÐ§@à”b¯8meRÆSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number’£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ ef0f9d5850ff41ca850f1138a7c438be@@@@@@@@@@@@Su  3Hi there! SÀ" RpŽ æIxâÖP@œyUâÎÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜âxIæÖ@PœyUâÎÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number“£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ a85b88afa5584862a01e01675cc04c5e@@@@@@@@@@@@Su  3Ho there! SÀ" Rp l‹×]emC´î0ò’  HC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜×‹le]Cm´î0ò’  HSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number”£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ 3986c87884d04541bc63d8028dc3c13d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp b`(ÏMÊÜN™¨9d£?ÎC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ï(`bÊMNÜ™¨9d£?ÎSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number•£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ dcdf15688112471c88dc10f29aeb47b4@@@@@@@@@@@@Su  3Hi there! SÀ" Rp‘ ?–ðÕÙ+$OŒäD°ëxëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Õð–?+ÙO$ŒäD°ëxëSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number–£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ e028991f81dd4be2a8a72990e2c76bc2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp’ ñOaú™D„æt+|-q–C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úaOñ™D„æt+|-q–SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number—£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 30edcf484c174e88bb8ea2ae3dd2e08b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp“ –óþhVH'”±™zuTC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þó–hHV'”±™zuTSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number˜£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 50fd3fb4123e4dfd8b5e097a22d622c4@@@@@@@@@@@@Su  3Hi there! SÀ" Rp” »ð‡cá~B³Þ/¹‰"hìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‡ð»ácB~³Þ/¹‰"hìSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number™£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ a23bce9429f046399344be85403db60b@@@@@@@@@@@@Su  3Ho there! SÀ" Rp• MŸ¢ûv×›L¼ÑoUðšC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜û¢ŸM×vL›¼ÑoUðšSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberš£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 619549b376c3477a894023b18f3fd64e@@@@@@@@@@@@Su  3Hey there! SÀ" Rp– ðÅ»± ð½D¢ÿÙxy~.)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜±»Åðð D½¢ÿÙxy~.)SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number›£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 653c7dfa638c41eea352b9ce9511b159@@@@@@@@@@@@Su  3Hi there! SÀ" Rp— „¥{…¤H¦¼ßÒFÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{¥„…H¤¦¼ßÒFÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberœ£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 637c73f14bc0439c82068cea85f93d7a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp˜ Õ€9én-ûL™Œp¾²7šÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜é9€Õ-nLû™Œp¾²7šÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ c6b09cdbf84e4cdda2c12398bf2066c6@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp™ [xã>‚ÚbB®=øW鿳tC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>ãx[Ú‚Bb®=øW鿳tSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberž£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 31f48b62112e46719eca4ec904841e0b@@@@@@@@@@@@Su  3Hi there! SÀ" Rpš (æ7£rMC°Æ‚ –úC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜7æ(r£CM°Æ‚ –úSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberŸ£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 38045f42127c442c9d7291d059dca2b4@@@@@@@@@@@@Su  3Ho there! SÀ" Rp› pCßüQÖJH³ØãÄPáC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜üßCpÖQHJ³ØãÄPáSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number £x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 8893b6436fd74a5699a831de8c487dda@@@@@@@@@@@@Su  3Hey there! SÀ" Rpœ ¾BzfèN„ î[®ì=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜B¾fzNè„ î[®ì=SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¡£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 8bcea1a979f646f7aeba7c90cdbbc2c6@@@@@@@@@@@@Su  3Hi there! SÀ" Rp '"Á‚˜¼F˜[ß©,õaCC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Á"'˜‚F¼˜[ß©,õaCSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¢£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 1927b14318714a1b9fa7d10ca8a0b887@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpž R ÉßNˆjÓz‚C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜É RN߈jÓz‚SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number££x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 4b92b23ff9ec4d6f891e3f3c24474a6f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpŸ @«ñÿ0ïE˜×7•3Ù#"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿñ«@0Eï˜×7•3Ù#"SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¤£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 631ec385bb0e49f4a3c44c3519b33e56@@@@@@@@@@@@Su  3Hi there! SÀ" Rp  >*\ÃôgAK†›OåââgôKA†›Oåââ<SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¥£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 85a8b774051d44aabeb4569da3f7edd1@@@@@@@@@@@@Su  3Ho there! SÀ" Rp¡ Ý"n—ðzËC¢Ÿ›QϺÃQC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜—n"ÝzðCË¢Ÿ›QϺÃQSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¦£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 2259ae44561b44efb84d622f9043d438@@@@@@@@@@@@Su  3Hey there! SÀ" Rp¢ Ê}ôjåD‡*ôHLRHC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jô}ÊDå‡*ôHLRHSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number§£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 9ce5d4c86fdf4393b91a62cc07825c0c@@@@@@@@@@@@Su  3Hi there! SÀ" Rp£ Í/ˆÐ°ßHœa¼ Õ€LC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ðˆ/Íß°Hœa¼ Õ€LSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¨£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 30784821025d421b99c8e97b8a679553@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¤ ±zd¾‰ŒJ¦Lõ„Xo]°C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾dz±‰JŒ¦Lõ„Xo]°SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number©£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ 67b68a0da97b4f5d90e1b26ce46c6c5d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¥ ‚ƒqýæIF‹Ç[NV4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ýqƒ‚æFI‹Ç[NV4SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberª£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ f5f0d0d0c18a4b5892b2af14a4453e1f@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¦ VP0âfquCƒ†-Ù(0C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜â0PVqfCuƒ†-Ù(0SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number«£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ f69f253ce17e45a4a4ff31c07d1dba0e@@@@@@@@@@@@Su  3Ho there! SÀ" Rp§ Yíc4ÖÐrB½!•Yüo¢VC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4cíYÐÖBr½!•Yüo¢VSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¬£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ 2b7666a039744898a6e4bba808e8b734@@@@@@@@@@@@Su  3Hey there! SÀ" Rp¨ ØpýüŒF§ŸVÍpÒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜üýpØFŒ§ŸVÍpÒSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number­£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ 0ef38c1f0dc24359be8732f10f5d0d9b@@@@@@@@@@@@Su  3Hi there! SÀ" Rp© P%x]&b`Mž;°Q]×»[C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜]x%Pb&M`ž;°Q]×»[SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number®£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ 26e31930d6b145c9b50ef24070ae2c2b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpª ñ/ÊX¿Ü¬HŒáiŸÇ–C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜XÊ/ñÜ¿H¬ŒáiŸÇ–SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¯£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ 32baf8efe91e4bc29ee5624c417a156d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp« ¨€:^^î¼F… ƒâ`ÙðC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^:€¨î^F¼… ƒâ`ÙðSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number°£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ d94a25f8dee4474f99f116154a2cd125@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¬ ZA[¿’'J‹®1µeðû>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¿[AZ’J'‹®1µeðû>SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number±£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ 0abb27c1131c416e83def98954d97c79@@@@@@@@@@@@Su  3Ho there! SÀ" Rp­ ˆx>ý,½C¦´ ¨Öì°úC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ý>xˆ,C½¦´ ¨Öì°úSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number²£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ 8c441228f5fe4005bf5a843d90b76c2a@@@@@@@@@@@@Su  3Hey there! SÀ" Rp® “E ¤ G3Fi‘ÀíDå‡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤ E“G F3i‘ÀíDå‡SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number³£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ c66eaf951cf84a6b80bc83133e8b925d@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¯ ð¦D3&:eNš0øI1Z‚C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜3D¦ð:&Neš0øI1Z‚SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number´£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ 9cd09b92ecb642fb834e0f1520f542d1@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp° ðY¦ZrsNœ¢<¤ýoùÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¦YðrZNsœ¢<¤ýoùÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberµ£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ 19afa46b9c9a4ff48e3b6188c2369751@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp±  óåüÇÌF©~xÿ²uLC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åó ÇüFÌ©~xÿ²uLSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¶£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ 4c7f79e936c74e319912e925bdc4ac2e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp² v[A2÷J‘]!kª†ÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜A[v2J÷‘]!kª†ÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number·£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ f4ab574d1bac428a8bba691a49bb5c90@@@@@@@@@@@@Su  3Ho there! SÀ" Rp³ Ê0@`þ™.Dš.tÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜`@0Ê™þD.š.tÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¸£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ d67fb17a7a6b435a830d8c7cdd7e371b@@@@@@@@@@@@Su  3Hey there! SÀ" Rp´ 8MòˆH± ‘>å)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜M8ˆòH± ‘>å)SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¹£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ 5189e604ff2b4fe8bd691a6edbcdf631@@@@@@@@@@@@Su  3Hi there! SÀ" Rpµ A\5 à¹G²Ì‹RrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5\Aà G¹²Ì‹RrSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberº£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ 787c735ed44b47ba93b65cf28f052ccd@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¶ Œtx8ÞýB¤Šs™ñ¶ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜8xtŒýÞB¤Šs™ñ¶ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number»£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ 53645a6c3065425e9cf7e282f9fc9634@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp·  Éÿ±O¡ ºUr1ˆ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿÉ O±¡ ºUr1ˆ SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¼£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ 25aa4e15f8d24a5d92498d2f4ec513c3@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¸ ¡šã¥LJ¶÷+ÿó¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãš¡L¥J¶÷+ÿó¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number½£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ acfa03ecfeec464cb3c39e2106c6a0fb@@@@@@@@@@@@Su  3Ho there! SÀ" Rp¹ » Æ„žgL£ |È‘©dC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Æ »ž„Lg£ |È‘©dSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¾£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ 7fc686d892a549ac99138901391ab851@@@@@@@@@@@@Su  3Hey there! SÀ" Rpº Ù'‘K0xÜJŒ÷”g°k{C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K‘'Ùx0JÜŒ÷”g°k{SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¿£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ 2211601696ee43b7ba46d44ef2791ab6@@@@@@@@@@@@Su  3Hi there! SÀ" Rp» Ë£!IÔºC­E3 úk²·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜!£ËÔICº­E3 úk²·SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÀ£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ c24f9c84dfac45dfbfa7d75f497d517a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¼ ×ç¾PEDÂ=‘‘ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾ç×PDEÂ=‘‘ SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÁ£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 6e0a51c71312468bbbd6a5a8ed86d62e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp½ åüCAáCˆÒ yxlC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ACüåCáˆÒ yxlSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 112333264d3a4102b19a6b1ca6fbcd3b@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¾ UÒº‰ÛC­¡÷AWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰ºÒUÛC­¡÷AWSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberãx-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 8173360d7e594832aa4cb1fb7c20dedc@@@@@@@@@@@@Su  3Ho there! SÀ" Rp¿ Sé߈o£OŠ@Œ¹BÕ¨|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ˆßéSoO£Š@Œ¹BÕ¨|SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÄ£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 114d1167ce3f420c9e2f26174d2db230@@@@@@@@@@@@Su  3Hey there! SÀ" RpÀ š³~üI+B›¿rìaÒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ü~³šIB+›¿rìaÒSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÅ£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 434eddca7b8342b9b54bb9bc41283095@@@@@@@@@@@@Su  3Hi there! SÀ" RpÁ uëÎvðE¨B˦r†;C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÎëuvEð¨B˦r†;SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÆ£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 37941aefbb0d4e289d610d722f6471e8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ÛPzúãi@¬éž‡ºÙ9ŒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úzPÛã@i¬éž‡ºÙ9ŒSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÇ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ 7ff35f4f34f04777861116499a408cdb@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpà" ©*¤†GŽÉKlŸ¨C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜© "¤*G†ŽÉKlŸ¨SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÈ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ 3b19c8f8e747458fa1ec3f697d842945@@@@@@@@@@@@Su  3Hi there! SÀ" RpÄ ºØjÅ;o€M‡ødãÝ—C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Åjغo;M€‡ødãÝ—SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÉ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ e2bfc1f634214a029f8aba5ac6645153@@@@@@@@@@@@Su  3Ho there! SÀ" RpÅ ¯ì ·cSO²Zá¥>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ì¯c·OS²Zá¥>SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÊ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ e908ef6c4376446f82a6446e81701321@@@@@@@@@@@@Su  3Hey there! SÀ" RpÆ  .ƒöˆÂO–ÿIvý+©C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ƒ. ˆöO–ÿIvý+©SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberË£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ c05fde47fa2747f0a56882cabf9e384a@@@@@@@@@@@@Su  3Hi there! SÀ" RpÇ èšj*suC¹øtÂ÷ª½UC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*jšèsCu¹øtÂ÷ª½USrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÌ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ e43145ae5de74b029c05e4089b085e3d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÈ "TÖÛ-ïnM=šÁÓ”C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÛÖT"ï-Mn=šÁÓ”SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÍ£x-opt-locked-untilƒ`f¥ŒxSsÀ/ ¡ 8e58134ca46047d49dfaefe4b46c3a82@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÉ )·»G°~äK¢¬v±O|gC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜G»·)~°K䢬v±O|gSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberΣx-opt-locked-untilƒ`f¥ŒxSsÀ/ ¡ cf4b2bad521341e783e03118778c946e@@@@@@@@@@@@Su  3Hi there! SÀ" RpÊ çÖ¬í{N’SóºIã% C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¬ÖçíN{’SóºIã% SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÏ£x-opt-locked-untilƒ`f¥ŒxSsÀ/ ¡ a5ddaee4d0de4fb582258e6cccc829af@@@@@@@@@@@@Su  3Ho there! SÀ" RpË Š+) B´·©ëÖóC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+Š )B´·©ëÖóSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberУx-opt-locked-untilƒ`f¥ŒxSsÀ/ ¡ 86901e68368543c59ae709c82877ec2f@@@@@@@@@@@@Su  3Hey there! SÀ" RpÌ ÌÞ"¿<¶õG‘d7*YÒÎ.C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¿"Þ̶DŽVýÿ8ÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:Îë—KD>ŽVýÿ8ÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number×£x-opt-locked-untilƒ`f¥ŒÆSsÀ/ ¡ 5faa1af76e394104bd5da79b0ef870cf@@@@@@@@@@@@Su  3Hi there! SÀ" RpÓ kTå Ï2F¥Ó|ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ åTkÏF2¥Ó|ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberØ£x-opt-locked-untilƒ`f¥ŒÆSsÀ/ ¡ d0ee55e08dc74998969f3714a68927dd@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÔ e^_þí%èDƒlûä¿9tC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þ_^e%íDèƒlûä¿9tSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÙ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ f714c31c7aba4896ad2349d8438c50dc@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÕ {¸ºäg|E·}¬åV&WÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜º¸{gäE|·}¬åV&WÞSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÚ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ d6c759f332d3400c82188804f8e5342e@@@@@@@@@@@@Su  3Hi there! SÀ" RpÖ ä«°y ÛµK¾¹TPQ.C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜y°«äÛ Kµ¾¹TPQ.SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÛ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 0ba4ac26561948ebbfdb2563704374c1@@@@@@@@@@@@Su  3Ho there! SÀ" Rp× lÕ2qþºÊD³E"G3¹LC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜q2ÕlºþDʳE"G3¹LSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÜ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 75e0d1c552cd4d6da23f92c3d712b94b@@@@@@@@@@@@Su  3Hey there! SÀ" RpØ 2Ord—øE‹ i‡ñLKÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜rO2—dEø‹ i‡ñLKÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÝ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 91bbd851652d42088ff7c7eb4f32879a@@@@@@@@@@@@Su  3Hi there! SÀ" RpÙ ¯5‡€JB O±Í‘Ñt›fC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜€‡5¯BJO ±Í‘Ñt›fSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÞ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 9aee763ce29040f19a222a9c0f19892a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÚ  $YÙì}Aš¹î÷ϪC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Y$ ìÙA}š¹î÷ϪSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberߣx-opt-locked-untilƒ`f¥rSsÀ/ ¡ 36e8111bd0554634a345071a49be9236@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÛ T²÷Þ]L«TgÊ{à=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜÷²TÞL]«TgÊ{à=SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberà£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ 6451dcc418404ed28a2bb7c57ecf350d@@@@@@@@@@@@Su  3Hi there! SÀ" RpÜ ‡DÉ‚¶‚eL¡`:ÁAÑ8•C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚ÉD‡‚¶Le¡`:ÁAÑ8•SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberá£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ a83ca419440a4a26bb2629e3c47a1817@@@@@@@@@@@@Su  3Ho there! SÀ" RpÝ ò&êRͺIŸÒ?%xC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Rê&òÍIºŸÒ?%xSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberâ£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ 91d0d9bb627143ec984eda4c6a1cd97f@@@@@@@@@@@@Su  3Hey there! SÀ" RpÞ › Ddpƒ5MÔR˜­:£yC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜dD ›ƒpM5ÔR˜­:£ySrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberã£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ 9543e09285ee40a6b069f5f238d570ff@@@@@@@@@@@@Su  3Hi there! SÀ" Rpß „¿ÒL[Oš%ˆCêøq}C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ò¿„[LOš%ˆCêøq}SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberä£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ b386990d8448445f908b6667c77866cf@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpà r›Íñߨ¦Aä¿—þ¶äØC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ñÍ›r¨ßA¦ä¿—þ¶äØSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberå£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ dbf16ba9d2c048ba8d1e5213e970da06@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpá Þêæó­3K³Ft˜“=»uC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜óæêÞ­K3³Ft˜“=»uSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberæ£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ c2f7b8b42387451f974c4fdbccaa321b@@@@@@@@@@@@Su  3Hi there! SÀ" Rpâ z|ôÑîNˆu‘g™üÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ô|zÑNîˆu‘g™üÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberç£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ f74767b1407d42aba1b34c1409fec9ae@@@@@@@@@@@@Su  3Ho there! SÀ" Rpã 6m¬Ì ut@˜ê<"DcP:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ì¬m6u @t˜ê<"DcP:SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberè£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ 33181aa960a54a7fb91fb08dd2d9fe8e@@@@@@@@@@@@Su  3Hey there! SÀ" Rpä ~†&Gz7QDˆ ^¡Ôš2%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜G&†~7zDQˆ ^¡Ôš2%SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberé£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ 5ee5b1c27443453a89d34566478ec4e9@@@@@@@@@@@@Su  3Hi there! SÀ" Rpå x¤ÓçèøaEƒ¦—Øe…þC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜çÓ¤xøèEaƒ¦—Øe…þSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberê£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ d85b52a03640426881390f396a8c08d9@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpæ ýÀû È OŸ³|±¼6¸DC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ûÀýÈO Ÿ³|±¼6¸DSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberë£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ 3872c42ee15244d3b7277a0905311822@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpç  É»´T/I»µQ÷¨¯<-C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜»É T´I/»µQ÷¨¯<-SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberì£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ 4701cf5d70ed4dfc96b48266bf413ae0@@@@@@@@@@@@Su  3Hi there! SÀ" Rpè Ö¶ü $¢YO“e¹BŠ$'C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ü¶Ö¢$OY“e¹BŠ$'SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberí£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ f535c210ac0649d89437308ce6666dc1@@@@@@@@@@@@Su  3Ho there! SÀ" Rpé ^¿ÓåUl@Ÿ\æ>Î*pC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ó¿^Uå@lŸ\æ>Î*pSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberî£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ aacebdcbbbe04974907d8ad9724db662@@@@@@@@@@@@Su  3Hey there! SÀ" Rpê äÙV›¨HAˆÔ‰‚óa,C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜VÙ䨛AHˆÔ‰‚óa,SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberï£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ 267a5075eb894056b586b3bb043912cb@@@@@@@@@@@@Su  3Hi there! SÀ" Rpë ÔUìÊ¥«A“!™zåC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ìUÔ¥ÊA«“!™zåSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberð£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ 043bad9c3fb4408d8273254b008bf440@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpì 7–gE~Æ[@–`¨ú…u‰%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Eg–7Æ~@[–`¨ú…u‰%SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberñ£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ e5f6c3a3befa4bd1b8c09657f96d24c1@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpí (õg‚Ù!F”çFÕùæÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜gõ(Ù‚F!”çFÕùæÕSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberò£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ a16979b0c7974d1e8722e7a2ac7327ba@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpî ðÕ ³ê©F¯·…s 2<þC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³ ÕðêF©¯·…s 2<þSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberó£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ 4ddc94209d2a48cd9d6fd9536b651a33@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpï ªõ!•ÂéA»¤Ë›Ç¦’C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜!õªÂ•A黤˛Ǧ’SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberô£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ 42e45d2ab986484b901217ddac1b5a9f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpð P&hŽÙC’È Î¬Ð(C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h&PŽCÙ’È Î¬Ð(SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberõ£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ 978d42eb59bf4033812830d4a39b6f22@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpñ ãj–¥¾nC†W3ý¹tûxC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜–jã¾¥Cn†W3ý¹tûxSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberö£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ 82fba79dd5bf4b249dd5dc9d79462dae@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpò G§¼£ìDF‡6݃¸{›@C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼§Gì£FD‡6݃¸{›@SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number÷£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 396da32c3a8947b79c8567daccf381c7@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpó ÓµDRË,F@Ž|I ïÇ.C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜RDµÓ,Ë@FŽ|I ïÇ.SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberø£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 9b01f868100645c4902e8fd5a0a6ca06@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpô ™g5g'ÓBª7±ˆ9œ«}C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5g™'gBÓª7±ˆ9œ«}SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberù£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 137699977b1741eaa90c11444a53b3ed@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpõ aŸã:>GDžJ«ƒ¬àùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:ãŸaG>DžJ«ƒ¬àùSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberú£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 4d82454b1c48436a9e262c89fea04ba7@@@@@@@@@@@@Su  3Hey there! SÀ" Rpö Q2À·mãL¦v_%Ýè=™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜À2Qm·Lã¦v_%Ýè=™SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberû£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 6dfa3af2e01740db83a1ea39a145a4f6@@@@@@@@@@@@Su  3Hi there! SÀ" Rp÷ ô·ÄÇFnC̯¸ÑÇúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ä·ôFÇCn̯¸ÑÇúSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberü£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 599c4a5aa7b24994ba89e2c9b08da0c7@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpø Ò÷ò*ŒŒE«;Ëñx05=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ò÷ÒŒ*EŒ«;Ëñx05=SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberý£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ c098c3ec9c12492f849ba7ee7aab3fb3@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpù ZÎ>ÆBž<‰ÀF{µ>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>ÎZÆBž<‰ÀF{µ>SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberþ£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ 4fd8bd1220c54d7e9230ac8d8d4d8aa2@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpú á€*÷¶K/)8öC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜€á÷*K¶/)8öSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberÿ£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ ea04628be1704c61964bb18d726ea2b7@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpû kVíVþE•âOüŒõOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜íVkVEþ•âOüŒõOSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ a608d9eab4ce48339bf3c4dbe8294aa7@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpü  dî†;)N™7 CJ¯!ßC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜îd ;†N)™7 CJ¯!ßSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ 0d0cb6fe5b2a4b44bd52a74f4c5833ec@@@@@@@@@@@@Su  3Hi there! SÀ" Rpý }i·(tèFŒK;£ZLðôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜·i}t(FèŒK;£ZLðôSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ 5627c91b596148138186f4e9f3f4a135@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpþ 4üÝš;M„OøËŸ+ AC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜šÝü4;M„OøËŸ+ ASrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ 3268fe13af0948a8ba53ecf593426e39@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpÿ #Ià%YïH»ä†u4ÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜àI#Y%Hï»ä†u4ÝSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ e452d477fc4b476083f49abab999aab4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp a° KE™ lQçÅÒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ °aKE™ lQçÅÒSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ d0c98453c3ca40b1bec6f8a2922d68c9@@@@@@@@@@@@Su  3Ho there! SÀ" Rp ?¥ãÅ[A³,WÛ˜lC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ã¥?[ÅA³,WÛ˜lSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ 2fb1ea3796a8484c8769efbd9a2848de@@@@@@@@@@@@Su  3Hey there! SÀ" Rp Íšö±q¥‹Mœ_ƒÄƒÅªÖC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜±öšÍ¥qM‹œ_ƒÄƒÅªÖSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ 35149ed8b0c448b09d6cb3e415451b65@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ¨设ÿ@D­»—`”@­C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®è¨ÿ¾D@­»—`”@­SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ 6465f8ad488a495490021a556063e111@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp füI€”ÅL˜©6vâ†j¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Iüf”€LŘ©6vâ†j¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ 38822eadef534447824d52f1df266d1a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp r«hЯAžÒݳÿU*jC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h«rÐA¯žÒݳÿU*jSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ e0d684eca51a4087a9977b81825a52e8@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp "ìr¯@#N‚Ý›Â>¿ÍÎC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜rì"@¯N#‚Ý›Â>¿ÍÎSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ 1ac84f73229f4680aab93e18fc6d877f@@@@@@@@@@@@Su  3Ho there! SÀ" Rp Ò?.Nª¥¿‚p±C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼¦î?ÒN.ª¥¿‚p±SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ abb1dfa8e0314b96a085f771719abd72@@@@@@@@@@@@Su  3Hey there! SÀ" Rp +µ nßÁªN¸‰_é!?“œC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜n µ+ÁßNª¸‰_é!?“œSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ 3e70a12d3ef142ab843869dd22b5ad2d@@@@@@@@@@@@Su  3Hi there! SÀ" Rp  wÓ‹4Í N¦|ö:NC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‹ÓwÍ4N ¦|ö:NSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥GSsÀ/ ¡ 1a55ccdb37324ee8957398fbb4394784@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  Lçá`Á[.M‡ùI°9·>‰C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜`áçL[ÁM.‡ùI°9·>‰SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ eba5cdc452c14ce7962baf283535de67@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp  ~íW4áøEž‡šö¦Ù¡?C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Wí~á4Eøž‡šö¦Ù¡?SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 59175d6c221d4f5d9d60933201ec32c8@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp  ä¥;?^­DŠ’kuR_z\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜?;¥ä­^DŠ’kuR_z\SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 462a7808b1524491818a1cba727e5456@@@@@@@@@@@@Su  3Ho there! SÀ" Rp  å´Ñ`ްG°4ž@–Ú,C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ñ´åŽ`G°°4ž@–Ú,SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ b94470eda6c5455fb3acf71935ece29f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ㈑¸hIYS¥ ™òC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ˆã¸‘IhYS¥ ™òSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ cc31aeb4f2a544eeaeac2223b749fb74@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ÚnjfyÚTJ‚EŽ@s›ÓC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜fjnÚÚyJT‚EŽ@s›ÓSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 81d8460421774164ac95238b29713c0f@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ø÷;ôAC­Á襧{8C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜;÷øôCA­Á襧{8SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 5e64d56e674e44159f7a686e90afd438@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp 7‡Å?c·@º&ƒjº©ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Å‡7c?@·º&ƒjº©ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 0de8b8399e54456e97d5ff34e85c9d6e@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ÍzŒã½síF“-kIgr¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãŒzÍs½Fí“-kIgr¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 3185b0909c7b48c8849274be34c5bce9@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp [žuÔʺ‹BÏÝqí˜öÒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ôuž[ºÊB‹ÏÝqí˜öÒSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 0ed32855a83a4222a8689c1d85ff3a70@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ‘>,qxpHœˆV‰Ô+rC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜q,>‘pxHœˆV‰Ô+rSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ e1342725429b4f68b7242e41992f8954@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp  ÌÙIJ¿OH„ÑrÍ1þ©cC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÄÙÌ ¿²HO„ÑrÍ1þ©cSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 1921dbda02e441c096cbf41052ba5a99@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp j§1S,8dF¯2ÊSÀLP\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜S1§j8,Fd¯2ÊSÀLP\SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 3c4bed9995274187a5cac72c01774f0c@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp haTRiO³1=-F åC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜RTahOi³1=-F åSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 1e842fd3a601416aa677407f2f974403@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ª¦QÂéªsOŠë-œPôRFC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÂQ¦ªªéOsŠë-œPôRFSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 21a9ea597e384b7c93b9f194f3db5f6d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ZذšK_F­2ÝLBñ[C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°ØZKšF_­2ÝLBñ[SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ d55c6d181f1141759cb8ffe7cce1f0b0@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ¾’ÖhvßI®lUúÈã.C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hÖ’¾ßvI®lUúÈã.SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 5ba349c406f54bb19766daa158be46e4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp 8a)W³lÓA‚¾ù—§ÃÖøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜W)a8l³AÓ‚¾ù—§ÃÖøSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 70994474eaf34965be6d5ebfbf76d0c6@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ÑGôØžI´@Ù§ïC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜GÑØôIž´@Ù§ïSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number!£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 5f44931293c6433ba52e8d2fa7c501ca@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ~@½*òNI™*ÈÝ©ØìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*½@~NòI™*ÈÝ©ØìSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number"£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 176372ef59364c6394de20773fd28dc0@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ÆD®ýòšO©»nH-«eC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®DÆòýOš©»nH-«eSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number#£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 9a5ea7aa841c4889b34e36753f8ee47b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp qŽ~ lï@C ™ñÐ>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~Žql @ïC ™ñÐ>SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number$£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 83d206e1ffca49aeb6f0a585299f7e33@@@@@@@@@@@@Su  3Hey there! SÀ" Rp  §ýÕ)Ö>Ošéÿí½XkC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜)Õý§ÖO>šéÿí½XkSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number%£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 17f58b0657d74afa9e0ba8aac57f1419@@@@@@@@@@@@Su  3Hi there! SÀ" Rp! DnÁ;¿»OŸ(ª?¯ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÁnD¿;O»Ÿ(ª?¯ SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number&£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 1d988772ad7541eab0703b8904b6c065@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp" ÝH×awCbÌ»CóëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜HÝa×CwbÌ»CóëSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number'£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 70645150b3d64225a467d522b9a39638@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp# GÅ,„ùâOºÂ1ô>tÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜,ÅGù„OâºÂ1ô>tÔSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number(£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ ad1d09a6e57d41c887995628e39b6691@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp$ í}«·ôðT@”eƒ'üèC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜·«}íðô@T”eƒ'üèSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number)£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 1124737e583c479782e34c4879a2fcb6@@@@@@@@@@@@Su  3Ho there! SÀ" Rp% «·v*PÔmO–‚¬/A…C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*v·«ÔPOm–‚¬/A…SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number*£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 851c50b4e7994a7a8109939eaf8fc76d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp&  Ä/®ºCŽ>ŽØ!á/C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/Ä ®CºŽ>ŽØ!á/SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number+£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 04c81170b4da452a93abafefc697d332@@@@@@@@@@@@Su  3Hi there! SÀ" Rp' ᧃNNŽ"çßøŽÌOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ƒ§áNNŽ"çßøŽÌOSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number,£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 3414f7da4ef14f55908ea08a8ff3020d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp( ßÊ5Ï›_Kœ—G Ñ:EøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ï5Êß›K_œ—G Ñ:EøSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number-£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ f239c1f839f94a259496d0decb0dcb43@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp) Ú ôÃÅNœV^íïÊC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ô ÚÃNÅœV^íïÊSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number.£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ 9e950d61416c450796b3bde3e73d6ffe@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp* V™S/à¿ÑF€L•‘=ÖÈC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/S™V¿àFÑ€L•‘=ÖÈSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number/£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ fb6f3d8d5aa742a493ba84d2d21c2d03@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp+  •ƒ¾3ŒO´»P ­ùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾ƒ• Œ3O´»P ­ùSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number0£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ e6674f6f8536481f926d22b5fc7c1696@@@@@@@@@@@@Su  3Hey there! SÀ" Rp, šÕzµT«ˆEˆ0}LÖOÈC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜µzÕš«TEˆˆ0}LÖOÈSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number1£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ 53f32bc22ce34755858100a362eaf3af@@@@@@@@@@@@Su  3Hi there! SÀ" Rp- C§J¤ôÉJK‹˜#œ 9çYC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤J§CÉôKJ‹˜#œ 9çYSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number2£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ f91075b702414b8e900dcf432e0aedd3@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp. Íá ±(UM¤È|vS1¦C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ áÍ(±MU¤È|vS1¦SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number3£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ c262a834095c4db883162c3bf2aa9302@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp/ ñxxw·G®$“\³åC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜xñwxG·®$“\³åSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number4£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ baa1950bbd56477b9a7cb701fa86f17e@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp0 ÛjÆã|”ÒL£:˜rL(XC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãÆjÛ”|LÒ£:˜rL(XSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number5£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ 6513a3af59af475497b4d0c7a02f85df@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp1 ¬òg5L§¾ ¸ÿyTC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜gò¬5L§¾ ¸ÿyTSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number6£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ 31f8fefb308f426b8890f5eeb1542602@@@@@@@@@@@@Su  3Hey there! SÀ" Rp2  X¯ï L½êÑà¹üÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯X ïL ½êÑà¹üÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number7£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ 680a03dc4285440ab798a07f8eff0c49@@@@@@@@@@@@Su  3Hi there! SÀ" Rp3 è¹,Jv6JQÜ´Å–4ÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜,¹èvJJ6QÜ´Å–4ÞSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number8£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ 07bf5edfedbd468cbf4295c23a554d6c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp4 M„Cõ­êÇ@‘“LÂù–³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜õC„Mê­@Ç‘“LÂù–³SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number9£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ 9196724ef71042dba4f5f52efd6a83e7@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp5 ¥‰aÕõ –F±€NƒeôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Õa‰¥ õF–±€NƒeôSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number:£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ ad87afaec73841c49e00f5577163852c@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp6 Ÿý®ÇK¨D”XZõ9™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®ýŸKÇD¨”XZõ9™SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number;£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ 0a2909d7c3f6443093a3796960501cf6@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp7 >°MT™tI€Ä¤ÇëÀWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜TM°>t™I€Ä¤ÇëÀWSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number<£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ 2bab5dcabc3841d780a05d687d156f36@@@@@@@@@@@@Su  3Hey there! SÀ" Rp8 R‰/º»E¼‡*™ deC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜º/‰R»E¼‡*™ deSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number=£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ ec0923c15f884fb9a063c39bc7896af5@@@@@@@@@@@@Su  3Hi there! SÀ" Rp9 ú(å¾2Ï`F«4¢ã`t™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾å(úÏ2F`«4¢ã`t™SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number>£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ 0a9cca7276e94b328bea8995a8e91e5f@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp: )ÈÉà4 ¯§èe†$L¾3KE,ÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜e觯†L$¾3KE,ÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberC£x-opt-locked-untilƒ`f¥ÍSsÀ/ ¡ 5f0e095098134f48a974395913b841bb@@@@@@@@@@@@Su  3Hi there! SÀ" Rp? B}o3gVÏE‰HõW¾ZávC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜äü Æ1J÷‚û6Œi²>vSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberS£x-opt-locked-untilƒ`f¥‘ÇSsÀ/ ¡ 023d483c72bd4ac9923b97747e129ddd@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpO  k‡.D§M¼£ê|YÂrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‡k D.M§¼£ê|YÂrSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberT£x-opt-locked-untilƒ`f¥‘ÇSsÀ/ ¡ 697bf6094d06411ca4977a8aa032f6f2@@@@@@@@@@@@Su  3Hey there! SÀ" RpP Ÿxxþ| ŠJ„¤&øt _4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þxxŸ |JŠ„¤&øt _4SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥‘ÇSsÀ/ ¡ 31b1a8546d7844f098b6c57c68e51ce1@@@@@@@@@@@@Su  3Hi there! SÀ" RpQ —h@’üÔšNž`ï’?lC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜’@h—ÔüNšž`ï’?lSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberV£x-opt-locked-untilƒ`f¥‘ÇSsÀ/ ¡ 4022a64c4ab84aba95ff6d7f3c3969a8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpR ù®&nBûH­Þ^¢=g¼ëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜n&®ùBHû­Þ^¢=g¼ëSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberW£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ da8d8098270e416d933d44f2d82622c8@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpS 'ˆyýøBK‹ö!âOµ8JC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜yˆ'øýKB‹ö!âOµ8JSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberX£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ e0e59df5eab24a1b8553b42fb89edeed@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpT ÞÕFßÔC– cTtq&C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÕÞßFCÔ– cTtq&SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberY£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ a56c133cc8e94784a4bb045968a22469@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpU ,5¯‚3‘³J—é©Ne¨ŠC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚¯5,‘3J³—é©Ne¨ŠSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberZ£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ 2ab51e0ea1274e199e12fe8a19dcf9a4@@@@@@@@@@@@Su  3Hey there! SÀ" RpV |¦˜×Í3D¢ðk¡ÕbêÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜˜¦|Í×D3¢ðk¡ÕbêÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number[£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ f7da4884b4f14b1793711fa2b997805d@@@@@@@@@@@@Su  3Hi there! SÀ" RpW ðMM›¸²ØO’ø” fn0+C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜›MMð²¸OØ’ø” fn0+SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number\£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ ad1ed6c9c2534584a21fa614e1e55f66@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpX ÄÉPò SI¨ëÌséY]C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜PÉÄ òIS¨ëÌséY]SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number]£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ c6eecf4b353645ca81d79f9a3a991e2e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpY ûf–*8*8G˜ˆÁB ãT¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*–fû*8G8˜ˆÁB ãT¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number^£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ 21d241852eb144c69a7dbfee6ef91ee9@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpZ ^Úϯ™hMìG §ÓáC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯ÏÚ^™MhìG §ÓáSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number_£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ 6dd03069fa82494ba90acf9ec6be0db2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp[ ÑùÁ8išøG½x[sù› [C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜8ÁùÑšiGø½x[sù› [SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number`£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ b565e556ffc149babe1eedd0693a601e@@@@@@@@@@@@Su  3Hey there! SÀ" Rp\ OË??{gAª!Õ*ÚéÂúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜??ËO{Agª!Õ*ÚéÂúSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numbera£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ 3c874884cb1c49af9107671daf5b613e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp] Tüö{ŽEªtåë§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{öüTŽEªtåë§SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberb£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ d8e3742d4ce7418992c2ce81fb9d0ab4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp^ 7&:PÐAfF¾•N«íx—C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜P:&7AÐFf¾•N«íx—SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberc£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ e2186f1259ff4e75902dc619cff6b887@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp_ ¡Z"ÝŸ ©@±Ô¯% Šx÷C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ý"Z¡ Ÿ@©±Ô¯% Šx÷SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberd£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ 92ffbb7f715e4e85aedc200d241c881d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp` '¤<­WG‘rêóŸÆ²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜<¤'­GW‘rêóŸÆ²SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numbere£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ 0aad1b6d001846e3af01fa070f1de177@@@@@@@@@@@@Su  3Ho there! SÀ" Rpa ;YVøÙ‹K¸? *°5C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜øVY;ÙK‹¸? *°5SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberf£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ ed67a0288c804e8086c059ab8e62baf7@@@@@@@@@@@@Su  3Hey there! SÀ" Rpb ‹Kγ5O´Èd$ÇjMêC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÎK‹³O5´Èd$ÇjMêSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberg£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ e4b868c6576b44508429299b360432da@@@@@@@@@@@@Su  3Hi there! SÀ" Rpc \áWSCªï^{nSC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜á\WCSªï^{nSSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberh£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ 105030a7b49b4a7b8b431866ab26dbe1@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpd Æû ¨‹D˜–\öÌÕx_C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ûƨ D‹˜–\öÌÕx_SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberi£x-opt-locked-untilƒ`f¥’uSsÀ/ ¡ f1b4511895774d5799ccbd0caf9ab485@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpe ¨®ƒÌ)ÇI‰UUß´__C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ìƒ®¨Ç)I‰UUß´__SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberj£x-opt-locked-untilƒ`f¥’uSsÀ/ ¡ 85869c9156e340a890c57ff4316af570@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpf 9‚_~°Òê¾ðÐûB»^ éä„_C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ð¾ê>ûÐB»^ éä„_SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number|£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ 89659b61df2a47cbbd087714a8cee3c8@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpx #x~@O– 5}Y<ŸùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~x#@O– 5}Y<ŸùSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number}£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ e491a2cc42754accb4c23bfb477f4294@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpy ïèwˆ¿KL£pÕý79¤C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜wè￈LK£pÕý79¤SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number~£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ 072df25e914d4959830145d62ef3df9e@@@@@@@@@@@@Su  3Hey there! SÀ" Rpz UÛ-ï­q@­~´T™=¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï-ÛU­@q­~´T™=¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ 55e1a7de4742450a98718d2baded449e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp{ ¦¬BiYcB‹Úv¹÷ÑÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜B¬¦YiBc‹Úv¹÷ÑÕSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number€£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ fab93f675a5b4bb981527b54d2dda891@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp| üú†« N•4µ¸‘ ¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úü«†N •4µ¸‘ ¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ 4a0b8e2a2d054b3ebb4faa122637d0ae@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp} ÆâŒŠ¯åñMƒÜBƒÛB§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ŠŒâÆå¯MñƒÜBƒÛB§SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number‚£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ 2be88db13a074a61a4d001635dd389c6@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp~ ïÝÄìȽLH•*›ýÌ«ÕÐC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ìÄÝï½ÈHL•*›ýÌ«ÕÐSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberƒ£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ ddf5b88367a741ea8b34de072ff9285e@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp dbì@©¯»E¶wËVò¢ÏgC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@ìbd¯©E»¶wËVò¢ÏgSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number„£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ a9a263676ca147a59b2ce05e49604bab@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp€ Þ>šquJ´òç ï±C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>ÞqšJu´òç ï±SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number…£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ 7f976a1e527948e1811fad26b1e8fa48@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp [ô®ÇC È¡uÙoVC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®ô[ÇC È¡uÙoVSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number†£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ 17488fef89a94cc6bddc87a47fd4105c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp‚ ¥;PÞ}ŽL¶µîOOé9C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÞP;¥Ž}L¶µîOOé9SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number‡£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ 425502cd944049e28ae2b656e3644043@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpƒ ÍÄ QAF¼ÐÙ+·0¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ÄÍQFA¼ÐÙ+·0¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberˆ£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ 9d6a19c0d22d4a3fae447086670c459d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp„ ïl*‘HK„3B³ 7¸ìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*lï‘KH„3B³ 7¸ìSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number‰£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ f1163b7ddadb41d5894d93701e144efb@@@@@@@@@@@@Su  3Ho there! SÀ" Rp… sèN ýðK¾ZN,3ÞÆôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ NèsðýK¾ZN,3ÞÆôSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberŠ£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ 5392bd0956e040a9abb47c921913598d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp† ù,ªÀF¤ŒCRN×ÊC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ª,ùÀF¤ŒCRN×ÊSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number‹£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ 6834000aa763487492852ccef6c15260@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp‡ Ò °þ vM‚%ùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þ° Ò Mv‚%ùSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberŒ£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ d280da296ba6488eb20aec4c1708f636@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpˆ  ß 6·K¿&¥¸Qã½C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ß 6K·¿&¥¸Qã½SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ d0d6ded463034c19beaf00d763f033f7@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp‰ þP6ìÄýêC†,8ToóÿC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ì6PþýÄCê†,8ToóÿSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberŽ£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ 98dfea8d416d474fb39d5cc4690c341f@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpŠ Jµ^}í°­J¸F4<£)C½C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜}^µJ°íJ­¸F4<£)C½SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ 3159c9cc01b6417b88f84d885ae2ca37@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp‹ Õ‹¨_*,G’ä²>ûÿlC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¨‹Õ*_G,’ä²>ûÿlSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ ae5c4827585c4dab8321f14d86d2870f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpŒ E¹Î¤¿Å~M°[ÕâKÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤Î¹EÅ¿M~°[ÕâKÝSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number‘£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ 0691f33e4d684b32b1bf6b458d866ce4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ?éí¡¿–uM«Ú%»Ûîï­C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¡íé?–¿Mu«Ú%»Ûîï­SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number’£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ 4ffbbb94fa7442ff9103357e25a1642a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpŽ Ñ6ÍYoX @Ë[ûv*ãC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜YÍ6ÑXo@ Ë[ûv*ãSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number“£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ e904b86305f44a8b934a2158fe1a2033@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp Èþ³ cG¬êºGàËŽ*C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³þÈ Gc¬êºGàËŽ*SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number”£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ 2f10faaac80741c3854f4212b8e99d64@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ûsø¿õ¡A¤¡V ÕO‡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¿øsûõA¡¤¡V ÕO‡SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number•£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ e6565b5388f4423ead605b198eb20379@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp‘ Ôâg¬DñF— ¢¬–Q±ÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜gâÔD¬Fñ— ¢¬–Q±ÝSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number–£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ f447feed0fca424691464d80751259ac@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp’ × Μ(5§@Œqëëw][C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜œÎ ×5(@§Œqëëw][SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number—£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ aab4ecacb12940daba5a78d1feea585d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp“  b뵂J™C'@F+ÈC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜b µëJ‚™C'@F+ÈSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number˜£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ e7b5dc7c9837457fbdde44655bb60265@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp” m,T¶báæLª‚‚æ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¶T,mábL檂‚æ SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number™£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ b22ce84951094021b525d4dcb00fe719@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp• [}CUÖÑ5@ŠÎÔÀŸiOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜UC}[ÑÖ@5ŠÎÔÀŸiOSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberš£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ 3b59dfbe6a1a47849e926d283783c7f5@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp– Ö âHn(ŒE›\Ø4ShŽÁC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Hâ Ö(nEŒ›\Ø4ShŽÁSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number›£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ a1867a1aa7c64f6aae6eaae5db528c75@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp— Ƶ°ìe{zC˜Õ5u#ž C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ì°µÆ{eCz˜Õ5u#ž SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberœ£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ e22ca95313814b37895dcbd258b040a8@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp˜  àÔRÊ'AL’*ÁŠËßC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜RÔà 'ÊLA’*ÁŠËßSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ d3d1b161845d4e81b03bd9d035659265@@@@@@@@@@@@Su  3Hi there! SÀ" Rp™ 7aú/C^mB¿¾jBP #C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/úa7^CBm¿¾jBP #SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberž£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ 489f071dd43d4c88abe7bb1d483c1c72@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpš  Ñ#ãÊNM¡S(ÝÃOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ã#Ñ NÊM¡S(ÝÃOSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberŸ£x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 29c3defe62ca496bb190a49b6f949313@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp› rgbܭѬK·†õf“³6"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÜbgrÑ­K¬·†õf“³6"SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number £x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 5a8201d5940c4635b2511ffd9d3a0b52@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpœ „•|”¦>ÒM°©!w4-ïÆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”|•„>¦MÒ°©!w4-ïÆSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¡£x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 2892990673a7488995664a715f9941b2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp hT0wB£ú • Îh”C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h0TBw£ú • Îh”SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¢£x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 663fc790cdf3401fbc4db9de7d632e4f@@@@@@@@@@@@Su  3Hey there! SÀ" Rpž c‰}‘]êI¢\«(þÇ÷EC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‘}‰cê]I¢\«(þÇ÷ESrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number££x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 9f8188cc13bf492cb1427936a269ed25@@@@@@@@@@@@Su  3Hi there! SÀ" RpŸ ÁÞ&î„£yM‚Õ7J³kª¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜î&ÞÁ£„My‚Õ7J³kª¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¤£x-opt-locked-untilƒ`f¥” SsÀ/ ¡ b2969854a2674fa39be214c2bb2b68ec@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  (¡å«rZG¢¢Rå>BÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜«å¡(rGZ¢¢Rå>BÔSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¥£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ f7bbfd9e554d4a3f9bdea6db6889289d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¡ ^dÅ,A”ÀG™í> Š;ôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜,Åd^”AGÀ™í> Š;ôSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¦£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ d5d5f1e59ddb4b3d94012d743d2589fe@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¢ dñèfݬK±ìP‡"³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜fèñdÝK¬±ìP‡"³SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number§£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ 66337d8b097948d4bf96a0be4558bcbd@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp£ ~˜öVõ*F›•jÍi½[„C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Vö˜~*õF›•jÍi½[„SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¨£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ d92af4e591034c8eb953dd0034e69144@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¤ ^Ú :ˆ—]G‘ï¢]š‰×ÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜: Ú^—ˆG]‘ï¢]š‰×ÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number©£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ 94fcbcf24c5743b39a9eb1c90a495de3@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¥ ›W\‚q»N­×XpéòçC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜\W›q‚N»­×XpéòçSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberª£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ d6707e7d644a43cdafe5bb1b3e680953@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¦ þ‡©è1E«–*ms g'C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‡þè©E1«–*ms g'SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number«£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ 01f24d5e6dc1459b8a3d2cdcf6e630f6@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp§ ÿ]Jk–eB—“Ïû¥1€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜kJ]ÿe–B—“Ïû¥1€SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¬£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ 8b6ad48a368f496a8ce8d9129ea8c8e4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¨  Xo°iãwB„®H½eC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°oX ãiBw„®H½eSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number­£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ 70b9ab13d65a470c801aba222320497a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp© ÍS~©SÔC¸ׂJx•fC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~SÍS©CÔ¸ׂJx•fSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number®£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ c61aa096e0d945a886167d3ece46ec67@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpª Åx?!ïD·ç.,ìB C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜xÅ!?Dï·ç.,ìB SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¯£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ fffdf33f9f62410ea09ed3226aea14dd@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp« b‰ð!'xF¤þpsÐŒ§ØC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ð‰b'!Fx¤þpsÐŒ§ØSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number°£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ f44d0beb61204ea2a6ed35f7e244d423@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¬ S#l&ÜB•Á- ïûôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#S&lBÜ•Á- ïûôSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number±£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ 3cb74b14fbbc442ea33b1170f5436141@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp­ ’ eRãmO¢<ô|š#ÔìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Re ’ãOm¢<ô|š#ÔìSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number²£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ 1b428482f3da45ec8e99a4a9bcac7f83@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp® kžXÖcqF•+ m C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÖXžkcFq•+ m SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number³£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ dd43e092b495423f913cbe5f6aa71659@@@@@@@@@@@@Su  3Ho there! SÀ" Rp¯ *²éñüG¥=:œC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜²*ñéGü¥=:œSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number´£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ 5db7c237020e44cb9b4a46f3f2844aff@@@@@@@@@@@@Su  3Hey there! SÀ" Rp° °œ+L)úJ´k5@X“ÇîC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜L+œ°ú)J´k5@X“ÇîSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberµ£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ 565d6d4e5af541f19104157697826ff8@@@@@@@@@@@@Su  3Hi there! SÀ" Rp± Ô+]ur)gF¸i©Môv5C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜u]+Ô)rFg¸i©Môv5SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¶£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ a5d1952ca7d4441c98b9e689960c3343@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp² ’¬¼=¢ŠtM¿tU«¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜=¼¬’Š¢Mt¿tU«¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number·£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ ba3c49feadf240938fe3a966a2fc811a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp³ cÙ€¢°ECºÆŒÈÀøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¢€Ùc°CEºÆŒÈÀøSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¸£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ 1e80fe3b126c47e7a6a5e9feddfb2a84@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp´ gÅë âs@¹_|4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ëÅgâ@s¹_|4SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¹£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ 65a7e870b5fe46f89f7a9dd1467dd4ce@@@@@@@@@@@@Su  3Ho there! SÀ" Rpµ hÊ%+Éû°O‰áÍ~ò®ivC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+%ÊhûÉO°‰áÍ~ò®ivSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberº£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ 12b1d88797cc4e3aa9761ec4adc8f6a2@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¶ ’}j”¸ÜG¯eëáýãøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜j}’¸”GܯeëáýãøSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number»£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ e628453574074820b0d7e2659790d664@@@@@@@@@@@@Su  3Hi there! SÀ" Rp· ”<FÎB²òXœ8%jC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜F<”BβòXœ8%jSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¼£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ c6917bc1bfcc42f8be9656f8d5e5e4ac@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¸ ºÂë¦ô—”Dƒ>õE½C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¦ëº—ôD”ƒ>õE½SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number½£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 3c58df00f7d042f1a8f957842ed1cc6e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¹ ÁÝq‡i¥B³ŽÅèA„ünC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜qÝÁi‡B¥³ŽÅèA„ünSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¾£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 7709e4bf90e64855bec1186a5be2088c@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpº jemé‚IC°Çi¼ÞóÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜émejI‚C°Çi¼ÞóÔSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¿£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 8db6e73131a741c38a2b5470423d151a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp» s]ZY–êmBs6âøc ®C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜YZ]sê–Bms6âøc ®SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÀ£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 9aeba14b22004fed81b39b77c7848b79@@@@@@@@@@@@Su  3Hey there! SÀ" Rp¼ Â¥ÇÂßG’€‘ª^fC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ç¥ÂÂGß’€‘ª^fSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÁ£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ a2b7a5a8fc5a48b5ac7847148b24877c@@@@@@@@@@@@Su  3Hi there! SÀ" Rp½ ƒ|>€ñ%A¡ñ檥@ˆ†C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜€>|ƒñA%¡ñ檥@ˆ†SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 2715af4992484b9dbc49074b3a1f5a4b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¾ W¿•‡ÁÛMJ”pÌ¥g`”C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‡•¿WÛÁJM”pÌ¥g`”SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberãx-opt-locked-untilƒ`f¥•SsÀ/ ¡ 717768a46be1427abe65804f4f2bc271@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¿ 72< ×dI¨E®"x•àC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜<27× Id¨E®"x•àSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÄ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 4be9cfda917144f3b1a5e7d1345af706@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÀ ÀƒÔ”YhJ·SçÑ$ÖãËC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”ÔƒÀhYJ·SçÑ$ÖãËSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÅ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 340ceb2d61f64511ad6fc668bbc4447a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÁ ´?ÐñzèùFºð¡V†¶ÀC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ñÐ?´èzFùºð¡V†¶ÀSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÆ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ ef4e44c7b43247c2af2df6e3aa3274ac@@@@@@@@@@@@Su  3Hey there! SÀ" Rp µèÖd»žL–¼×]]TOÿC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Öèµ»dLž–¼×]]TOÿSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÇ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 89b8ca99735c4cfca9c72e21c5bfc3b3@@@@@@@@@@@@Su  3Hi there! SÀ" Rpà¥Çpú?ÂðD¤Â·ËwOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úpÇ¥Â?Dð¤Â·ËwOSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÈ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 5934c26da4bf49c8a0bd1cadb4966d1e@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÄ &xìË#ÒËN¼.Ž®ðñC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ëìx&Ò#N˼.Ž®ðñSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÉ£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ 0d6dd29ed44849c0abc95c36ad386ed3@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÅ ÁPÝãï‰ÝEžª;2BÝÖC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãÝPÁ‰ïEÝžª;2BÝÖSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÊ£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ aa29211d04184741919e17beb65edd8f@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÆ ¦ð;Ú*D¨~lá2…‘‹C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜;ð¦ÚD*¨~lá2…‘‹SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberË£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ 2091c06408b64375aa26a99db0b3eed9@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÇ ¦T7j•¯L²ƒÀu˜òC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜7T¦•jL¯²ƒÀu˜òSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÌ£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ 96ef14d8ca1042d682230dbaa239724d@@@@@@@@@@@@Su  3Hey there! SÀ" RpÈ `§k@ÄL¾?#÷¥'ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜§`@kLľ?#÷¥'ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÍ£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ 8a60c2329c5d403a8430fc3185869dab@@@@@@@@@@@@Su  3Hi there! SÀ" RpÉ íâ;}:¥H˜IeZÚbBRC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜;âí:}H¥˜IeZÚbBRSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberΣx-opt-locked-untilƒ`f¥•4SsÀ/ ¡ d076ad6eac4540479bc510601eb87990@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÊ [¶š<Û¤I0;è©>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜š¶[ÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÏ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ 83a7f2ec54b742c2804e9a99935ae489@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpË ¦u޼€åÒI…z;þ¶Ã½òC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼Žu¦å€IÒ…z;þ¶Ã½òSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberУx-opt-locked-untilƒ`f¥•cSsÀ/ ¡ f22da8c9c87b4cb786e9bfa085d1e634@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÌ ìÕO^kBûO”’Wø‘HÖC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^OÕìBkOû”’Wø‘HÖSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÑ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ 00a939d662454514bb807f09039a8b7a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÍ 8³Êåú3@šÜˆl­å‡lC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åʳ83ú@šÜˆl­å‡lSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÒ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ bf3ccc1b9a6740378c2fb0a284e77f62@@@@@@@@@@@@Su  3Hey there! SÀ" RpΠÁ›™Þq“ K¢cÅx˜ÆdC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Þ™›Á“qK ¢cÅx˜ÆdSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÓ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ 8dbfb9fd75f04487bd7f572007aa3fd0@@@@@@@@@@@@Su  3Hi there! SÀ" RpÏ ðë€~Û>±J’øèDóZmoC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~€ëð>ÛJ±’øèDóZmoSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÔ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ c6704fde073b4bd8a360f9a6ff4768f2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpРª|Š1\A²I¸(þ »:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜1Š|ªA\I²¸(þ »:SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÕ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ e3bb9e63b0674176b3a6a2edf1e1ed2d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÑ ‚Æ ÏÛ¼‹E¦šaÄè¡¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ï Æ‚¼ÛE‹¦šaÄè¡¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÖ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ d754ba81e82a4fb593a5bedaab6e72b0@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÒ ÚˆëwæÇÂO’,÷šÁ½ –C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜wëˆÚÇæOÂ’,÷šÁ½ –SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number×£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ 7660d3d55d014f6fa3ea7a190d5b489a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÓ χ)~–WEžp) ª$mC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~)‡Ï–EWžp) ª$mSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberØ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ f97c3b4e480e47d9ba18d20fe8e4bab4@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÔ +7ƒ‰'ëBåûm±C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰ƒ7+ë'Båûm±SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÙ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ b93d78b09ff34782aef9eda564603c27@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÕ ½†9({DB ù²Å´¢›±C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜9†½{(BD ù²Å´¢›±SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÚ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ a706f26ab0d846dd9f15918430a99732@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÖ ÙÇ»NO GˆsóÅß"]ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜N»ÇÙOG ˆsóÅß"]ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÛ£x-opt-locked-untilƒ`f¥•ÁSsÀ/ ¡ 5e65abf215424d4cb0c91a5aadf17a5a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp× ½jIɲA„G¤ )eNC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÉIj½A²G„¤ )eNSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÜ£x-opt-locked-untilƒ`f¥•ÁSsÀ/ ¡ 0b30d2807ca24b8486d4ba3beed87654@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpØ „eÛá™1äC·¼ÈV´-ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÃÌ!¸æDªU>ÈV´-ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberæ£x-opt-locked-untilƒ`f¥–SsÀ/ ¡ 0e7f712f8ac244b8b97bb47f0e7c5b8d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpâ تN­(¹êM‘Y9ÿ$cŽC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜­NªØ¹(Mê‘Y9ÿ$cŽSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberç£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 20eaa9a4855d405d9b5e9b26d60f1d00@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpã ŽoèTøe E¼vôIC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜TèoŽeøE ¼vôISrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberè£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 6abee82d88384c10b1071778712c68b5@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpä ÙÍ…ÁNJCˆý»ÿ‡XhC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Á…ÍÙNCJˆý»ÿ‡XhSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberé£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 7c9cd21953394e3d89d6584cea623a02@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpå ©“ÈDÚ %G¢óUµÀ´œJC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜DÈ“© ÚG%¢óUµÀ´œJSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberê£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 1b443f5fa4ef4648a158b2036670073a@@@@@@@@@@@@Su  3Hey there! SÀ" Rpæ ÁK127F@¾1o,²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜21KÁ7@F¾1o,²SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberë£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 4c49b0073da84f25a0244ca670efe72e@@@@@@@@@@@@Su  3Hi there! SÀ" Rpç òB{ÐÕÓJ¡b•Ë WÂC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ð{BòÕJÓ¡b•Ë WÂSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberì£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 40fcbdb23f8d450d93891dc4ec3ec637@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpè çkû× t‘KŽã`b%¬×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜×ûkçt K‘Žã`b%¬×SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberí£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ 036046deb9774666aeaabf16eafa6ef5@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpé ›…çbyÑ[Nœô‡’( ÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜bç…›ÑyN[œô‡’( ÞSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberî£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ 99669e48e3a54f659fac27949a1f6769@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpê S•mS‚›F‘ ÀáºÍfÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜m•S‚SF›‘ ÀáºÍfÝSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberï£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ f2e8fbce0be3470586512a790d1a6830@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpë j[Åq4KEÄvœÒ‡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Å[jqK4EÄvœÒ‡SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberð£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ da0ae1dd5dad4914aa11ef99de7abb2f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpì )Ú¯µ©oLŒ<޹º¸è^C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜µ¯Ú)o©LŒ<޹º¸è^SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberñ£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ ae54458ff97a4c22b30f3230e2aa870a@@@@@@@@@@@@Su  3Hi there! SÀ" Rpí Œé¤æ°ÿAŠ»< U"3¨C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤éŒ°æAÿŠ»< U"3¨SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberò£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ 2184a1504b6d490aa6a6e4b274e46d27@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpî Ad„Þ_ÿ’Iª}–ÁÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Þ„dAÿ_I’ª}–ÁÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberó£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ 9b91f6aacf70450bb36bf07cc9588dac@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpï oEO°`Eàfô¦µ“(C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜OEo°E`àfô¦µ“(SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberô£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ 9c42ff2a7d334c8e9a168e131369a297@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpð å Ú3d~C·?PD™Á­¹C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜3Ú å~dC·?PD™Á­¹SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberõ£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ e756b252dd8b45b89ac4614e6a7f8b91@@@@@@@@@@@@Su  3Ho there! SÀ" Rpñ ç&F´œ·B‘cÇGši8)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜´F&çœB·‘cÇGši8)SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberö£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ 5d9e4fed9c8841f9ac856355206ae1e8@@@@@@@@@@@@Su  3Hey there! SÀ" Rpò zíèÕãEûF¡zâ÷ætC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÕèízEãFû¡zâ÷ætSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number÷£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ a707996655e846078df696374be3200f@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpó ¦ÁÛ±WI®}×IL:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜±ÛÁ¦IW®}×IL:SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberø£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ b423e35ac3e64217809b26daa95471d4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpô üyÜú„¬Lˆ=s‡‚kaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Üyü„úL¬ˆ=s‡‚kaSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberù£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ bc9490b246924d1f9425da265d8cf0d9@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpõ ^]æ/nòFH†lI×Lä+C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/æ]^ònHF†lI×Lä+SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberú£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ 839c628a652e4810b07dd78a23f80964@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpö ã pƒlÏÇF¼jÞ-ŸlÕJC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ƒp ãÏlFǼjÞ-ŸlÕJSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberû£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ be39ea4945f3400589bd77a7820a40d0@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp÷ ¿A’¾ëzG¾¤[á%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾’A¿zëG¾¤[á%SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberü£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ 9ff1907d07af4966aa8f44bff9e6014e@@@@@@@@@@@@Su  3Hey there! SÀ" Rpø a:Ž—.%M··ãËjä×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜—Ž:a.M%··ãËjä×SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberý£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ 4b7741a1fd574b4bbb714c32cbb0b501@@@@@@@@@@@@Su  3Hi there! SÀ" Rpù ƒ®šúë*A‹üsð•„C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜š®ƒëúA*‹üsð•„SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberþ£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ fdd88cd95d1b439ba28c642f268469e1@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpú #6¶ÙÍ#ïB®wX¼Í×iûC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ù¶6##ÍBï®wX¼Í×iûSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÿ£x-opt-locked-untilƒ`f¥–êSsÀ/ ¡ 7939b9854c6b46919e7cea62f3dc98d5@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpû À¼' ¬M¥KCC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Á¤Ôü¯Já›ÊÇA>KCSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—SsÀ/ ¡ 296e6ba15ac74c51941e52378388e9ae@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ë‰³+œKš4(H㱸]C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰ë+³Kœš4(H㱸]SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ ba8a8f356f3d4240997deeaa42f7e5be@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ¢“Œ[@ôòE²‰g‚êwÁC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜[Œ“¢ô@Eò²‰g‚êwÁSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ 025c69be6e5544de948f78c53cbf3cf0@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp rÂ³ÏØi_A¼²“DÚ€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ï³ÂriØA_¼²“DÚ€SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ c15045efa07a483da00dc3355fc59711@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  gÆäžÏMª°I3å*EC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜äÆgÏžMª°I3å*ESrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ 4fae76a81a7f4e6e8e6263f480e15e32@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp  5§@$V2åAh„lÃïC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜$@§52VAåh„lÃïSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ 3050ba68f4154b349e21e5ea2a85e4e1@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp  í þåÉ $Hºš„±ëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åþ í ÉH$ºš„±ëSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ 3f51b158dd46453a9ce879f0c4846d70@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  Š Ñ—µ±7A“ˆ‘n°éC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜—Ñ Š±µA7“ˆ‘n°éSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ c87d6b35f70949119c29833590b3ab1d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp  Ð Ù*„ÃëM¶ÏR軨w\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*Ù ÐÄMë¶ÏR軨w\SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ ea25bd71c6ca43e0bcab9fc1b228a496@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp H`.R#MK¶á ½ †C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜.`H#RKM¶á ½ †SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ 843abd4414894823b6a59ce0f62fa429@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp T=dÛÎñšM k¾ Z‚C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ûd=TñÎMš k¾ Z‚SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ 4c6e578d4e024e13916b9ad06a7b8f08@@@@@@@@@@@@Su  3Hey there! SÀ" Rp ñ;å‹E‚.D¥Øª&?z³ùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‹å;ñ‚ED.¥Øª&?z³ùSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ 516987c6da1c443faacb27738c5bffbb@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ¿ëXv*`I«Àiâ‹C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Xë¿*vI`«Àiâ‹SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—wSsÀ/ ¡ 4906a1a0e0974c549ae3cf780faf1b1b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp Vó¼šÓ®Mµ9¼ì " AC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼óVÓšM®µ9¼ì " ASrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ 37695c45fc5d49b4b7d195177fcc1bdc@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp Kþ.î£1 C§¸[T[ÆAC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜î.þK1£C §¸[T[ÆASrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ 9df38ed59faf414db7a0f6de45fa2e11@@@@@@@@@@@@Su  3Hi there! SÀ" Rp 9d@üÖýsH¹â˜3a:\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ü@d9ýÖHs¹â˜3a:\SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ 363af49c66b9414b9cb96e8b89803739@@@@@@@@@@@@Su  3Ho there! SÀ" Rp =6—¾šM¥H´+á¿”Ö°C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾—6=MšH¥´+á¿”Ö°SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ e4c6c8e3fb0746118db4bd81e70906d4@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp kéZúª,Lªh]rEøwC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úZékªL,ªh]rEøwSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ e4a22423d9224cf896bdc486fa9b5040@@@@@@@@@@@@Su  3Hi there! SÀ" Rp Ýb¹”¡ƒgF¬¶Š¯ GhC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”¹b݃¡Fg¬¶Š¯ GhSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ f08b79866799457eaa738721399cebd8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp €v¶¦ «kB—HÜ—­J¾ÓC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¦¶v€« Bk—HÜ—­J¾ÓSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ 1e2f202dbfb64da6a0088d5bf5f0bd58@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp L‹@ðjlIªÐåB¢ÙG–C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@‹LjðIlªÐåB¢ÙG–SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ 4cff2d4bd2a14eb298b508d2385ad7c1@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp Á€UÁ D¿Çv†^„C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÁU€Á D ¿Çv†^„SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ 940b1f78cda142688a5a2fd72e9b127e@@@@@@@@@@@@Su  3Ho there! SÀ" Rp -ÈøFó|ØJ®+t¾GNð²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜FøÈ-|óJØ®+t¾GNð²SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ 4a67be7715c54f239900332b50cdfe20@@@@@@@@@@@@Su  3Hey there! SÀ" Rp Åã8»pÆÕK’N¿OY¾q&C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜»8ãÅÆpKÕ’N¿OY¾q&SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number!£x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ f978f04bbedd4084abff5ad32a100274@@@@@@@@@@@@Su  3Hi there! SÀ" Rp mMvÿˆ E«^6U±c€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿvMmˆE «^6U±c€SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number"£x-opt-locked-untilƒ`f¥—ÅSsÀ/ ¡ 29d1b6a7bb834fedaa915fd55d24af8a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ´îçÖ=¥H«ñ(,·mÇC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Öçî´=H¥«ñ(,·mÇSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number#£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ d13db326d34b484ab2664c0489e3c914@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ݼCæ ÂïFŸ­SâC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æC¼Ý FSâSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number$£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ dab10483ede14f559a7eeafa74c85b31@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp  b…ø xÊG¤Æ ¬jbZ—C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ø…bx GÊ¤Æ ¬jbZ—SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number%£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ 5dbc97d20ca547529fa9f5da693045ee@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp! ÉnÔ&KŠÍ«†&™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÔnÉ&KŠÍ«†&™SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number&£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ aa97846421cc4651afbc15938d25ec5a@@@@@@@@@@@@Su  3Hey there! SÀ" Rp" HS,·ÍJ\CŠVû:§f£C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜·,SHJÍC\ŠVû:§f£SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number'£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ 7219e23c0084475c97a46ee16f46315c@@@@@@@@@@@@Su  3Hi there! SÀ" Rp# #7©BÖ«KŸEÍ”/=¦€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜B©7#«ÖKŸEÍ”/=¦€SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number(£x-opt-locked-untilƒ`f¥—ôSsÀ/ ¡ b430e046f4a3469faea051b0f2f22bd2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp$ å3ã§¾¢ÏLšaáë®FèC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜§ã3墾LÏšaáë®FèSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number)£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ b6044c08f57543a7af6b2ca816965d50@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp% Ó&`;ý,Ncx7¢3¨bC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜;`&ÓýN,cx7¢3¨bSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number*£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ f6918a4ddfa7424f82f8b1d6afe7a055@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp& ¤ iT½F› gæ‹¢*™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ¤TiF½› gæ‹¢*™SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number+£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ 19a3d6ca8449490b8be0869c6955340c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp' švž‰( ®J°÷Ù/Žï’HC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰žvš (J®°÷Ù/Žï’HSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number,£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ 7b37addaedca4fb1a09a6a0a5889e90d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp( ËV/…PwK»$FnïóÍþC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/VËP…Kw»$FnïóÍþSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number-£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ 2310b3fafda44ddcb1a47bfa6898b494@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp) dÑ3 c0OƒGHî¿Ù›C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜3Ñdc O0ƒGHî¿Ù›SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number.£x-opt-locked-untilƒ`f¥˜#SsÀ/ ¡ 3318dcc6b8834bdbb40c11554dbed234@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp* Ôû-J£+óC˜JÑð"ÇÑÎC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜J-ûÔ+£Có˜JÑð"ÇÑÎSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number/£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 802821aa99d7498f8f4f187cb759a364@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp+ ôb2ÖO„¤ýÖ;RC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ö2bôO„¤ýÖ;RSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number0£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 6ca927451abb44cc8822685055c201b4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp, _=ÄŒæG„ÐA(ƒÕh}C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ŒÄ=_Gæ„ÐA(ƒÕh}SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number1£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 7ec928f8c10546bb8cfa9992d7e83362@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp- " 8¸¸„H©Ý'šÛÛøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¸8 "¸H„©Ý'šÛÛøSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number2£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 52a52c6f490e457286a72f6e4719c7be@@@@@@@@@@@@Su  3Hey there! SÀ" Rp. Ì$†¤kO¦Tçï8îTC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†$̤Ok¦Tçï8îTSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number3£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 065d3d7251d14af6a1bd63cae9a2a9cd@@@@@@@@@@@@Su  3Hi there! SÀ" Rp/ }Õ†v­ G¶Âѱªu*C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†Õ}­vG ¶Âѱªu*SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number4£x-opt-locked-untilƒ`f¥˜RSsÀ/ ¡ 4b38cc7cde2240ee82edd2cd2c6f5873@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp0 QàÔ-Ì E¥”…Ye×"ÍC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÔàQÌ-E ¥”…Ye×"ÍSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number5£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ cc9cf3fb011349f691cbecc179c61e62@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp1 fº¶®™ ÚMŽ­É7à>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®¶ºf ™MÚŽ­É7à>SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number6£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ f9738fc9cea84de29e05b65e33f0ce0e@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp2 û45bö’Kµ<´Û3¬MC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜b54ûöK’µ<´Û3¬MSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number7£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ f48d7d1af4dd4ca1a58e3a985c559a61@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp3 PT½Yp F T´Wfvò"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜½TPpYF  T´Wfvò"SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number8£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ e1a668f7a2c449a39a25b1a652cd2a15@@@@@@@@@@@@Su  3Hey there! SÀ" Rp4 UÜ$g«H•ø@µ;LÃC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜$ÜUgH«•ø@µ;LÃSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number9£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ 3ff7a743767a4b0785efd6526d47781e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp5 CéͳŠvH—z¤° Ô C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³ÍéCŠHv—z¤° Ô SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number:£x-opt-locked-untilƒ`f¥˜qSsÀ/ ¡ 51687a302a174f2bbfdeb10e7b7e638c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp6 ‡\ OZÙÇKˆéÔö½#C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜O \‡ÙZKLjéÔö½#SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number;£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ f6d5174486e049c3a7b264605ef968ff@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp7 òAݺçÞWM–6a[Ó·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ºÝAòÞçMW–6a[Ó·SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number<£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ 6b40baace0f94efa894f541a933dfe26@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp8 Í蔡,?1O¾7'*(í–=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¡”èÍ?,O1¾7'*(í–=SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number=£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ bb702b08e67b4bcfade3b263201027fa@@@@@@@@@@@@Su  3Ho there! SÀ" Rp9 ÆYþæŽêG²bã±›6C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þYÆŽæGê²bã±›6SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number>£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ dc89f50d66f54b9fb9988b4140cccf46@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp: $ ÍࢴÉN›ðá/ŒñC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜àÍ $´¢NÉ›ðá/ŒñSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number?£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ ff83c301f382406caeb724d4603000d7@@@@@@@@@@@@Su  3Hi there! SÀ" Rp; ª9b @‚üO´FjÄÊC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜9ªb@ ‚üO´FjÄÊSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number@£x-opt-locked-untilƒ`f¥˜ SsÀ/ ¡ 752ab8972a02454d92599d9f2004f856@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp< ¢´Š5ùN}F”ŒI{dôªC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5Š´¢NùF}”ŒI{dôªSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberA£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ 84079d948d5b4943b3c76e7112a4dafe@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp= ˆÐì!xkA—Æ o G•jC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ìЈx!Ak—Æ o G•jSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberB£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ 294a1aaf54fc4606a0aaf11388fea829@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp> ¯ èGHŒŠc¼gÙ©%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ¯GèHŒŠc¼gÙ©%SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberC£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ bcc1885e95d94aa5a6c9832cf5f52bf5@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp? {NøtßDMMŠq¡S­(¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜tøN{DßMMŠq¡S­(¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberD£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ 70a2c063066240e687ab1b70946a29f9@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp@ §ÇÆTúJ¾ØJŠ©Ù\4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÆÇ§TJú¾ØJŠ©Ù\4SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberE£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ bf23b22751c04a1ea5e4fb36b23c923d@@@@@@@@@@@@Su  3Hi there! SÀ" RpA nf»ž ÚN¹*}µù³ÕËC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜»fn žNÚ¹*}µù³ÕËSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberF£x-opt-locked-untilƒ`f¥˜ÏSsÀ/ ¡ 67540e32ecb24534add77ff3dd696c4d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpB 8~Ø "L©Ø––—«`C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~˜¼ï ØL"©Ø––—«`SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberG£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ cf78c769f8fe487abc6b574a68341011@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpC ã€KGu±M®VMvj/Ê”C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K€ãuGM±®VMvj/Ê”SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberH£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ e5e184ddb0964263af8cb147b4fb1a77@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpD DÚÇG>ÓG¸Ó ‡û¢C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜GÇÚDÓ>G¸Ó ‡û¢SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberI£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ 3f44e6c3574844d8a5efec71b6c04058@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpE ’ÖŸXø‰~N¹fÌ"žc·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜XŸÖ’‰øN~¹fÌ"žc·SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberJ£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ 7792f92416434251930cc2a6abcbc3cd@@@@@@@@@@@@Su  3Hey there! SÀ" RpF ›GÄÍ¢=DAfýgƒOñbC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÍÄG›=¢ADfýgƒOñbSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberK£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ fdd5a392544e435aba4946949483631a@@@@@@@@@@@@Su  3Hi there! SÀ" RpG  ̓8£F» \­%ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ƒÍ £8F» \­%ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberL£x-opt-locked-untilƒ`f¥˜ýSsÀ/ ¡ 6e4f475d32d14033aacdce52e481363e@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpH *Xÿ45ÈE½r¼³Ý±Ó/C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4ÿX*5EȽr¼³Ý±Ó/SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberM£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ 4e71fe51f49144dab61191f2ef616aed@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpI 6!J1è ÞHŠF®ì:[¾óC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜1J!6 èHÞŠF®ì:[¾óSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberN£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ 571a258f5b3a4c42b06875d62d6c7dd9@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpJ ½/hFÁCláà²@™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Fh/½CÁláà²@™SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberO£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ 8857349005454867bc35c88999293897@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpK ’¸¡¡9ÿ9FšÍdôeÂÌC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¡¡¸’ÿ9F9šÍdôeÂÌSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberP£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ e77554f574804ade827c981e376fd626@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpL FÞ‹ ÏêQK®ì˜^ŒqC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ‹ÞFêÏKQ®ì˜^ŒqSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberQ£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ e221474ab17944819156118c9240c886@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpM óÛ6ä;I»LD=U¨C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ûóä6I;»LD=U¨SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberR£x-opt-locked-untilƒ`f¥™,SsÀ/ ¡ 4bafe90a74df43449cbe90e53ef2f528@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpN %«Nâ:DŠ*Nàƒ"ZÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜N«%âD:Š*Nàƒ"ZÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberS£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ 1e6f05f776cb4081b0b2859b9c3b809b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpO ªHA©*J´~ÞÚ&ÅÍôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜AHª*©J´~ÞÚ&ÅÍôSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberT£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ 559c699f1e32462c983ec7bbe545e6fb@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpP =Q‘¾ñø!A¼_#‚ãúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾‘Q=øñA!¼_#‚ãúSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ e20ea8ef4a494b579cfdc70793f3ad07@@@@@@@@@@@@Su  3Ho there! SÀ" RpQ 饋ÛèC»=„÷Ó™%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‹¥éÛCè»=„÷Ó™%SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberV£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ 289b6f708d314d238fffc53a37d02430@@@@@@@@@@@@Su  3Hey there! SÀ" RpR V/ âÛ­5@¯ÏæÍ3P C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜â /V­Û@5¯ÏæÍ3P SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberW£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ 11f706bd4cd940dabb5cb9a63fa79872@@@@@@@@@@@@Su  3Hi there! SÀ" RpS èŒBH`ï±JŒ´& &0NC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜HBŒèï`J±Œ´& &0NSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberX£x-opt-locked-untilƒ`f¥™[SsÀ/ ¡ 9bd6e1c922f544d89e2f02a0e9129e01@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpT ÚE4§hCH¾¹v¹—ö¡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4EÚh§HC¾¹v¹—ö¡SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberY£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ 6d0a94b98db146e7b53259fa0e8f00da@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpU äÀÚc¸E’|X{yÙSC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÚÀä¸cE’|X{yÙSSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberZ£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ b6ae5f3e921d4c068d4b96707a1c649d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpV ‡yНtwI“>+«Ôv¨PC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Šy‡t¯Iw“>+«Ôv¨PSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number[£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ 80e40c354bda4222a1af6851755f435a@@@@@@@@@@@@Su  3Ho there! SÀ" RpW  Kî¿N`J§É12¯C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜îK N¿J`§É12¯SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number\£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ 90b4436516504614a2e5de9703844d88@@@@@@@@@@@@Su  3Hey there! SÀ" RpX ßøÉ&ÉÁ-E±Þ¢ÂmY%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜&ÉøßÁÉE-±Þ¢ÂmY%SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number]£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ f7851009b76c445ebaa803f5459497a6@@@@@@@@@@@@Su  3Hi there! SÀ" RpY /˜Ës%„O ÂE†m¹Ÿ:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜s˘/„%O ÂE†m¹Ÿ:SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number^£x-opt-locked-untilƒ`f¥™zSsÀ/ ¡ e80aaefcfd2848d5932c195817e0949a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpZ c}°ôÖûlC»ù¹ÔqçE½C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ô°}cûÖCl»ù¹ÔqçE½SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number_£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ be1bac5782ad48ad991e4003774da3ed@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp[ ÞŒª.+L°uø ÄèÅC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ªŒÞ+.L°uø ÄèÅSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number`£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ 11d3b9cd6ebb46cfaa372792d014e6e5@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp\ Ïåû…NFwDÛG´Øx^VC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜…ûåÏFNDwÛG´Øx^VSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbera£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ b732a9c958534034ba3e1cfd6baee508@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp] ä|‹R¸&ŒO¦]urR ÙóC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜R‹|ä&¸OŒ¦]urR ÙóSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberb£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ 39a2fc2984eb4648a0dbbfd4424a11fb@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp^ VŒû 1±Dƒ2{Íx›$þC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ûŒV±1Dƒ2{Íx›$þSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberc£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ 6eb94357de7c4ad5a12f340cec66b731@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp_ øéø· L„vÞ§#~s§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜øéø·L „vÞ§#~s§SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberd£x-opt-locked-untilƒ`f¥™©SsÀ/ ¡ dc50143a2b4d4ab2ba8aa04472949111@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp` fÁÎãËÊA»ßQÒu­TC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÎÁfËãAÊ»ßQÒu­TSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbere£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ 37a41ed7489648be9b2ec0e642bcb6ce@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpa Óĸ…?­LF…žq2ûrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜…¸ÄÓ­?FL…žq2ûrSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberf£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ 67af5e20b7fa4ca1a74be482dfe111e3@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpb ¯6‹ÖJ•B;6ßÍïÍC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Â6¯‹JÖ•B;6ßÍïÍSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberg£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ bba22fa4bc914121b4c2e4c281df7e1f@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpc ÚìPô3A˜X]O@´­IC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜PìÚôA3˜X]O@´­ISrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberh£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ 43604d9b30e04f2d9dc0550a5020fac2@@@@@@@@@@@@Su  3Hey there! SÀ" Rpd È4ÖãH£…`‚‘}8×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ö4ÈãH£…`‚‘}8×SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberi£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ d4a132622b1d4e748042f0d222c9a6c4@@@@@@@@@@@@Su  3Hi there! SÀ" Rpe y„¾°;ÄPG²•#¦$DªC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°¾„yÄ;GP²•#¦$DªSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberj£x-opt-locked-untilƒ`f¥™ØSsÀ/ ¡ cec9838bfc7e4c0db6d7d86fd6e4a0be@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpf 4À-hœJšï¿­®ðC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜-À4hJœšï¿­®ðSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberk£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 2d3ed5b1bcb84d5fa3aeff493da5ea9e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpg oã³Ä¿ä A‡ 5ÇW°þC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ä³ãoä¿A ‡ 5ÇW°þSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberl£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ d9912f6e611843408af4dd98985f0ddf@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rph Ë~Á LPN¿¬••šVC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Á~ËL NP¿¬••šVSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberm£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 41c23139f9a34b1590272682d4ac6458@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpi ÔÅ3©>TM¶A ‹³’aÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜3ÅÔ>©MT¶A ‹³’aÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbern£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 8f42f70baab542e1be0fb11a1eed0f27@@@@@@@@@@@@Su  3Hey there! SÀ" Rpj ÿ¶z:…äCŠºkHú{\²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:z¶ÿä…CŠºkHú{\²SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbero£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ cb75c39d7b6f48ffb84c656005dd6657@@@@@@@@@@@@Su  3Hi there! SÀ" Rpk sÛ+´ÌjX@€ÑÄe ²¸dC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜´+ÛsjÌ@X€ÑÄe ²¸dSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberp£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ d12cb86055024a9a9d3d60d74ed168ec@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpl îsf¼ôgÉIª„ #µ³CC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼fsîgôIɪ„ #µ³CSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberq£x-opt-locked-untilƒ`f¥š6SsÀ/ ¡ de05cacfb919483587287c6fd1a4d088@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpm Ú¢qìZ8»Fˆ•²)ì+RC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ìq¢Ú8ZF»ˆ•²)ì+RSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberr£x-opt-locked-untilƒ`f¥š6SsÀ/ ¡ e2d310ea25dc40d3bb46e0df8a2b1743@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpn ÈíÅN1@·4)ÎÔèZÚC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÅíÈN@1·4)ÎÔèZÚSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbers£x-opt-locked-untilƒ`f¥š6SsÀ/ ¡ ba0cc2432a8844ffb1ddf4add4cb7ebc@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpo üq#ôTOC`R[pC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ô#qüOTC`R[pSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbert£x-opt-locked-untilƒ`f¥š6SsÀ/ ¡ c6a275f2d301422b91c6c9b69c7aa30a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpp  -˜µ< ÕK»ôéºq¹C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜µ˜- ñ¨ùùÃK¼L÷¸qÍ_C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¨ñ>ùùKüL÷¸qÍ_SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numbery£x-opt-locked-untilƒ`f¥šUSsÀ/ ¡ d7d09308bb034f599657facf6ff90653@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpu !ók¶JìúD ‚3F·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¶kó!ìJDú ‚3F·SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-numberz£x-opt-locked-untilƒ`f¥šUSsÀ/ ¡ ab5b9784c88b4777b30f14db37502ac9@@@@@@@@@@@@Su  3Hey there! SÀ" Rpv ÀÌØ:@lTK¤bõh}æ÷:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:ØÌÀl@KT¤bõh}æ÷:SrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number{£x-opt-locked-untilƒ`f¥šUSsÀ/ ¡ e6ef7f83d3c146859921e598ae3413f5@@@@@@@@@@@@Su  3Hi there! SÀ" Rpw ÊY«Æ¿M¦}Ƈ[ûçC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜YÊÆ«M¿¦}Ƈ[ûçSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number|£x-opt-locked-untilƒ`f¥šUSsÀ/ ¡ 60a04385295d4bb7bd81dc1862ebfbe4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpx 9•.Ö\X*J‘Œ‰mhà‹ôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ö.•9X\J*‘Œ‰mhà‹ôSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number}£x-opt-locked-untilƒ`f¥š„SsÀ/ ¡ 5fa302ca01be4f6c841ad7ee4c7cee05@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpy Ê>4Ì„BÛG³F6†q¨üC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ì4>ÊB„GÛ³F6†q¨üSrÁ\£x-opt-enqueued-timeƒ`f¤‡z£x-opt-sequence-number~£x-opt-locked-untilƒ`f¥š„SsÀ/ ¡ 103d6d7beae640c79e941947ccbd992a@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpz cº„V«eEJ½ž Hi mate, how are you?d3bd932cf8b76010c1fcb0b6060c86b507becb3c-13000066400000000000000000000003461454613650200353340ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT áS@`RpˆRRÿ@@@d3e0559c90c47748d0699be389b8c85be87a2988-8000066400000000000000000000005201454613650200347170ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?YS@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJa ¿½ vzLXqzQrrUIv@ïý HYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@d478f06351817b67c650e878037bafece044f875-8000066400000000000000000000005201454613650200346670ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJaÿ½ vzLXqzQrÿÿÿÿ@�HYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@d4d42b62d0b6c9839e86a0c27478b599a36650bc-13000066400000000000000000000005201454613650200350120ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿ï½ï½¿ï½¿ï¿ï½¿ï½¿ïexeUBrVfäØCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@d503d64b852d7ae9f3cc96d6bff640316359ab04-14000066400000000000000000000005201454613650200351440ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e114eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`Rp½ˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/¿ñ½¿ï½ï½@ï½Ûï¿ï½[]½¿ïexeUBrVfdwCBDPS(À ¡/test@@@@@@@@@@@@@C€b@@@d5bf4e0df005cc5eb76fdcdd7048bce81f9359aa-1000066400000000000000000000034141454613650200355230ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e11½¿ï0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR ”äYÃ?–?AƒÕðÔž‰6÷C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nlH£x-opt-sequence-number™£x-opt-locked-untilƒ[£ná‡SsÀH ¡$f5b39d65-785d-4f40-8106-52c089dab354@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?d5c867c6659537c907485a953741e41725381f13-8000066400000000000000000000001441454613650200343170ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdS@"�ÀW¡(p½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿¿ï½¿ï½¿ïà/³MSCB@PS(À ¡/test@@@@@@@@@@d6012956af7d4bbef57f2d8bf358e66fd5ed33e1-1000066400000000000000000000001471454613650200353210ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!d642b629069ef795fae33fc0e094cc4d5a476ce2-3000066400000000000000000000046161454613650200351630ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#ccExplorer@@@@@@@@@StÁ8¡d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@[£njc£x-opt-sequence-number–£x-opt-locked-untixml versߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b€¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0D413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WWIN-U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡teervice Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC ="utf-8"?> Hi mate, how are you?SPLIT d6cec28172fde85844c17dce3bc3215a667c0efd-6000066400000000000000000000001441454613650200353050ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(p½¿ï½¿ï€½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@d7359b4f70df85db47a9870e4d25586772ac247a-17000066400000000000000000000005201454613650200350310ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc4ab500@1'eaaS 0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT S@`RpˆRRÿ@@@SPLIT ddSÀW7¡VfdaÿÿÿQˆ@Þ¿½HVfdwCB@PS(Àa¡/test@@@@@@@@@@@@€C€@@@d7822c2e993d2fe4dbb17d25a365506f1184b824-9000066400000000000000000000005201454613650200347250ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e114eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJaÿ½ vzLdqj(½¿ï½¿ï½¿ï½¿ïexeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@d7971cc2ca660d0b7bca8ff49b4fbaedf2f1df61-4000066400000000000000000000043421454613650200356020ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT ÿS@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT PSPLIT FSÀ9 ¡#ccExplorer@@@@@@@@@StÁ8¡d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À@@@@C€@@@SPLIT FService Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT 0ce0D413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WWIN-U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡teervice Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?zSÀ CR Öy‚ ØC ="utf-8"?> Hi mate, how are you?SPLIT z SÀ CR ”äYÃ?–?AƒÕðÔž‰6÷C@B@@`@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nlH£x-opt-sequence-number™£x-opt-Kocked-untilƒ[£ná‡SsÀH ¡$f5b39dd87d015be47fae43cdc4d0ca6feefd1387ea909c-12000066400000000000000000000001441454613650200356030ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusddSÀW¡(pqaJa ¿½ vzLXqzRrrUIYvaIuj ;��ހdwCB@PS(À ¡/test@@@@@@@r0@@@@@2à@C€d8bf060264b7a58fb05f5ea00ed6a233d2ce4ec6-8000066400000000000000000000001541454613650200352660ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿ï½¿ï€½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUBrXfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€W@@@6b17d1f2d9404c7d6618f446efb87982fd370d1a59bffd61-12000066400000000000000000000005201454613650200351670ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿ï½ñ½¿ñ½¿ï¿ï½¿ï½¿ïexeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@d9b3efe6d0cd642ebd5d7e522ac4da91b66ebd8a-10000066400000000000000000000005201454613650200356520ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(ŽžµÕ ¿è ½¿ï½¿ï½¿ïIYvaIujDpHŽžµa ¿è fdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@da39a3ee5e6b4b0d3255bfef95601890afd80709-9000066400000000000000000000000001454613650200351400ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusda3a33881c4f21f50ab8e73941b9ddc513737a83-4000066400000000000000000000001061454613650200347730ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR ”äYÃ?–?AƒÕðÔž‰6÷C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nlH£x-opt-sequence-number™£x-opt-locked-untilƒ[£ná‡SsÀH ¡$f5b39d65-785d-4f40-8106-52c089dab354@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how arde834d583b34e64c0699fa6de55481d1b9b30579-6000066400000000000000000000001441454613650200347460ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ï½¿ï%UeXhØ¿½JðǽïǽDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@deeb6aa8ea3c3984a64970bf80feed9daeedb2d0-12000066400000000000000000000005201454613650200357420ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?YS@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G7@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJa ¿½ vzLXqz Iv@ïý HYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@e0fad1f8a2ded57a7fcad10f165aa39f24abbbb4-12000066400000000000000000000005201454613650200357060ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaaÿ½ vzÿÿQˆ@Þ¿½HVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@e15cf347c02f7a5ef67541667248e50cbc284a89-14000066400000000000000000000005201454613650200350140ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb560e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqï½ڼ﬽ӿ½qï½W��ï˽;��ހdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@e166f191bd860531ea60daca92b067bf9620dbe3-7000066400000000000000000000001441454613650200351270ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqaÝ¿ïÄ¿ïÚªeXhØ¿½JðǽïǽDpHYjxeUBrVfdCB@PS(À ¡/test@@@@@@@@@@@@@C€w@@@e17c90610a4121ce56e695f2d9b68c5b79908b93-8000066400000000000000000000005201454613650200346630ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJa ¿½vzLXqzRrrUIYvaIuj WjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@e1af3dfb1907b9bf2a02aa3225cf21c238e44427-3000066400000000000000000000000261454613650200351050ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusSSSSSSSSSSSSSSSSSPLIT e25b13aebf98073fbb49b6bb6e658adbe564a138-8000066400000000000000000000000771454613650200353130ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus? S@À2à/³MSSBCBSPLAIN "MMOYS"äe27f50538397c70dba13d3c3ee624472deba243b-4000066400000000000000000000000771454613650200350530ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³MSSBCBSPLAIN ANONtMOYS"uUfe3efc249342091cc5310d0b7a3d29cfd03f1d08d-1000066400000000000000000007113441454613650200351240ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT GSÀ: ¡$3d9065c2239c48f88056bcfdd3334d81_G41@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ‚SÀu¡(zjrRNLRzGpzDszPvweGxRQcoxpAQxuFkaowCKoRcCAP@@S)À0¡'integration-receive-5577006791947779410@@@@@@@@@€@@@SPLIT #SÀ CpˆRRCCpèC@B@SPLIT ‡SÀz¡(cTyTJHeKKokJNwUaqKCBRxMSdypnuVQlXTxlLUfRRB@PS(À4 ¡'integration-receive-5577006791947779410@@@@@@@@@@@@@C€@@@SPLIT SÀ AR@AS$E@SÀ AR@AS$E@SÀ AC@AS$E@SÀ AR@AS$E@SÀ AR!@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR @AS$E@SÀ AR @AS$E@SÀ AR @AS$E@SÀ AR @AS$E@SÀ AR @AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SPLIT SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR @AS$E@SÀ AR"@AS$E@SÀ AR#@AS$E@SÀ AR$@AS$E@SÀ AR%@AS$E@SÀ AR&@AS$E@SÀ AR'@AS$E@SÀ AR(@AS$E@SÀ AR)@AS$E@SÀ AR*@AS$E@SÀ AR+@AS$E@SPLIT SÀ AR,@AS$E@SÀ AR.@AS$E@SÀ AR/@AS$E@SÀ AR-@AS$E@SÀ AR;@AS$E@SÀ AR0@AS$E@SÀ AR1@AS$E@SÀ AR2@AS$E@SÀ AR3@AS$E@SÀ AR4@AS$E@SÀ AR5@AS$E@SÀ AR6@AS$E@SÀ AR7@AS$E@SÀ AR8@AS$E@SÀ AR9@AS$E@SÀ AR:@AS$E@SÀ ARX@AS$E@SÀ ARY@AS$E@SÀ ARZ@AS$E@SÀ AR[@AS$E@SÀ AR\@AS$E@SÀ AR]@AS$E@SÀ AR^@AS$E@SÀ AR_@AS$E@SÀ AR`@AS$E@SÀ ARa@AS$E@SÀ ARb@AS$E@SÀ ARc@AS$E@SÀ ARd@AS$E@SÀ ARe@AS$E@SÀ ARf@AS$E@SÀ ARg@AS$E@SÀ ARh@AS$E@SÀ AR<@AS$E@SÀ AR=@AS$E@SÀ AR>@AS$E@SÀ AR?@AS$E@SÀ AR@@AS$E@SÀ ARA@AS$E@SÀ ARB@AS$E@SÀ ARC@AS$E@SÀ ARD@AS$E@SÀ ARE@AS$E@SÀ ARF@AS$E@SÀ ARG@AS$E@SÀ ARH@AS$E@SÀ ARI@AS$E@SÀ ARJ@AS$E@SÀ ARK@AS$E@SÀ ARL@AS$E@SÀ ARM@AS$E@SÀ ARN@AS$E@SÀ ARO@AS$E@SÀ ARP@AS$E@SÀ ARQ@AS$E@SÀ ARR@AS$E@%SÀ RypsRRCRypÓC@B@SÀ ARS@AS$E@SÀ ART@AS$E@SÀ ARU@AS$E@SÀ ARV@AS$E@SÀ ARW@AS$E@SÀ ARi@AS$E@SSPLIT À ARj@AS$E@SÀ ARk@AS$E@SÀ ARl@AS$E@SÀ ARm@AS$E@SÀ ARn@AS$E@SÀ ARo@AS$E@SÀ ARp@AS$E@SÀ ARq@AS$E@SÀ ARr@AS$E@SÀ ARs@AS$E@SÀ ARt@AS$E@SÀ ARu@AS$E@SÀ ARv@AS$E@SÀ ARw@AS$E@SÀ ARx@AS$E@SPLIT SÀ AR|@AS$E@SÀ AR{@AS$E@SÀ ARy@AS$E@SÀ ARz@AS$E@SÀ ARÝ@AS$E@SÀ ARÞ@AS$E@SÀ ARß@AS$E@SÀ ARÓ@AS$E@SÀ ARÔ@AS$E@SÀ ARÕ@AS$E@SÀ ARÖ@AS$E@SÀ AR×@AS$E@SÀ ARØ@AS$E@SÀ ARÙ@AS$E@SÀ ARÚ@AS$E@SÀ ARÛ@AS$E@SÀ ARÜ@AS$E@SÀ AR»@AS$E@SÀ AR¼@AS$E@SÀ AR½@AS$E@SÀ AR¾@AS$E@SÀ AR¿@AS$E@SÀ ARÀ@AS$E@SÀ ARÁ@AS$E@SÀ ARÂ@AS$E@SÀ ARÃ@AS$E@SÀ ARÄ@AS$E@SÀ ARÅ@AS$E@SÀ ARÆ@AS$E@SÀ ARÇ@AS$E@SÀ ARÈ@AS$E@SÀ ARÉ@AS$E@SÀ ARÊ@AS$E@SÀ ARË@AS$E@SÀ ARÌ@AS$E@SÀ ARÍ@AS$E@SÀ ARÎ@AS$E@SÀ ARÏ@AS$E@SÀ ARÐ@AS$E@SÀ ARÑ@AS$E@SÀ ARÒ@AS$E@SÀ AR}@AS$E@SÀ AR~@AS$E@SÀ AR@AS$E@SÀ AR€@AS$E@SÀ AR@AS$E@SÀ AR‚@AS$E@SÀ ARƒ@AS$E@SÀ AR„@AS$E@SÀ AR…@AS$E@SÀ AR†@AS$E@SÀ AR‡@AS$E@SÀ ARˆ@AS$E@SÀ AR‰@AS$E@SÀ ARŠ@AS$E@SÀ AR‹@AS$E@SÀ ARŒ@AS$E@SÀ AR@AS$E@SÀ ARŽ@AS$E@SÀ AR@AS$E@SÀ AR@AS$E@SÀ AR‘@AS$E@SÀ AR’@AS$E@SÀ AR“@AS$E@SPLIT SÀ AR”@AS$E@SÀ AR•@AS$E@SÀ AR–@AS$E@SÀ AR—@AS$E@SÀ AR˜@AS$E@SÀ AR™@AS$E@SÀ ARš@AS$E@SÀ AR›@AS$E@SÀ ARœ@AS$E@SÀ AR@AS$E@SÀ ARž@AS$E@SÀ ARŸ@AS$E@SÀ AR @AS$E@SÀ AR¡@AS$E@SÀ AR¢@AS$E@+SÀ p p0RRCp pC@B@SÀ AR£@AS$E@SÀ AR¤@AS$E@SÀ AR¥@AS$E@SÀ AR¦@AS$E@SÀ AR§@AS$E@SÀ AR¨@AS$E@SÀ AR©@AS$E@SÀ ARª@AS$E@SÀ AR«@AS$E@SÀ AR¬@AS$E@SÀ AR­@AS$E@SÀ AR®@AS$E@SÀ AR¯@AS$E@SÀ AR°@AS$E@SÀ AR±@AS$E@SÀ AR²@AS$E@SÀ AR³@AS$E@SÀ AR´@AS$E@SÀ ARµ@AS$E@SÀ AR¶@AS$E@SÀ AR·@AS$E@SÀ AR¸@AS$E@SÀ AR¹@AS$E@SÀ ARº@AS$E@SÀ ARà@AS$E@SÀ ARá@AS$E@SÀ ARâ@AS$E@SÀ ARã@AS$E@SÀ ARä@AS$E@SÀ ARå@AS$E@SÀ ARæ@AS$E@SÀ ARç@AS$E@SÀ ARè@AS$E@SÀ ARé@AS$E@SÀ ARê@AS$E@SÀ ARë@AS$E@SÀ ARì@AS$E@SÀ ARí@AS$E@SÀ ARî@AS$E@SÀ ARï@AS$E@SÀ ARð@AS$E@SÀ ARñ@AS$E@SÀ ARò@AS$E@SÀ ARó@AS$E@SÀ ARô@AS$E@SÀ ARõ@AS$E@SÀ ARö@AS$E@SPLIT SÀ AR÷@AS$E@SÀ ARø@AS$E@SÀ ARù@AS$E@SÀ ARú@AS$E@SÀ ARû@AS$E@SÀ ARü@AS$E@SÀ ARý@AS$E@SÀ ARþ@AS$E@SÀ ARÿ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SPLIT SÀAp!@AS$E@SÀAp"@AS$E@SÀAp @AS$E@SÀAp#@AS$E@SÀApx@AS$E@SÀApy@AS$E@SÀApz@AS$E@SÀAp{@AS$E@SÀApo@AS$E@SÀApp@AS$E@SÀApq@AS$E@SÀApr@AS$E@+SÀ p´pRRCp±pcC@B@SÀAps@AS$E@SÀApt@AS$E@SÀApu@AS$E@SÀApv@AS$E@SÀApw@AS$E@SÀAp$@AS$E@SÀAp%@AS$E@SÀAp&@AS$E@SÀAp'@AS$E@SÀAp(@AS$E@SÀAp)@AS$E@SÀAp*@AS$E@SÀAp+@AS$E@SÀAp,@AS$E@SÀAp-@AS$E@SÀAp.@AS$E@SÀAp/@AS$E@SÀAp0@AS$E@SÀAp1@AS$E@SÀAp2@AS$E@SÀAp3@AS$E@SÀAp4@AS$E@SÀAp5@AS$E@SÀAp6@AS$E@SÀAp7@AS$E@SÀAp8@AS$E@SÀAp9@AS$E@SÀAp:@AS$E@SÀAp;@AS$E@SÀAp<@AS$E@SÀAp=@AS$E@SÀAp>@AS$E@SÀAp?@AS$E@SÀAp@@AS$E@SÀApA@AS$E@SÀApB@AS$E@SÀApC@AS$E@SÀApD@AS$E@SÀApE@AS$E@SÀApF@AS$E@SÀApG@AS$E@SÀApH@AS$E@SÀApI@AS$E@SPLIT SÀApJ@AS$E@SÀApK@AS$E@SÀApL@AS$E@SÀApM@AS$E@SÀApN@AS$E@SÀApO@AS$E@SÀApP@AS$E@SÀApQ@AS$E@SÀApR@AS$E@SÀApS@AS$E@SÀApT@AS$E@SÀApU@AS$E@SÀApV@AS$E@SÀApW@AS$E@SÀApX@AS$E@SÀApY@AS$E@SÀApZ@AS$E@SÀAp[@AS$E@SÀAp\@AS$E@SÀAp]@AS$E@SÀAp^@AS$E@SÀAp_@AS$E@SÀAp`@AS$E@SÀApa@AS$E@SÀApb@AS$E@SÀApc@AS$E@SÀApd@AS$E@SÀApe@AS$E@SÀApf@AS$E@SÀApg@AS$E@SÀAph@AS$E@SÀApi@AS$E@SÀApj@AS$E@SÀApk@AS$E@SÀApl@AS$E@SÀApm@AS$E@SÀApn@AS$E@SÀApÜ@AS$E@SÀApÝ@AS$E@SÀApÞ@AS$E@SÀApß@AS$E@SÀApÃ@AS$E@SÀApÄ@AS$E@SÀApÅ@AS$E@SÀApÆ@AS$E@SÀApÇ@AS$E@SÀApÈ@AS$E@SÀApÉ@AS$E@SÀApÊ@AS$E@SÀApË@AS$E@SÀApÌ@AS$E@SÀApÍ@AS$E@SÀApÎ@AS$E@SÀApÏ@AS$E@SÀApÐ@AS$E@SÀApÑ@AS$E@SÀApÒ@AS$E@+SPLIT SÀ ppp¨RRCpppC@B@SÀApÓ@AS$E@SÀApÔ@AS$E@SÀApÕ@AS$E@SÀApÖ@AS$E@SÀAp×@AS$E@SÀApØ@AS$E@SÀApÙ@AS$E@SÀApÚ@AS$E@SÀApÛ@AS$E@SÀAp|@AS$E@SÀAp°@AS$E@SÀAp}@AS$E@SÀAp±@AS$E@SÀAp~@AS$E@SÀAp²@AS$E@SÀAp³@AS$E@SÀAp@AS$E@SÀAp´@AS$E@SÀAp€@AS$E@SÀApµ@AS$E@SÀAp¶@AS$E@SÀAp·@AS$E@SÀAp¸@AS$E@SÀAp¹@AS$E@SÀApº@AS$E@SÀAp»@AS$E@SÀAp¼@AS$E@SÀAp½@AS$E@SÀAp¾@AS$E@SÀAp¿@AS$E@SÀApÀ@AS$E@SÀApÁ@AS$E@SÀApÂ@AS$E@SÀAp@AS$E@SÀAp‚@AS$E@SÀApƒ@AS$E@SÀAp„@AS$E@SÀAp…@AS$E@SÀAp†@AS$E@SÀAp‡@AS$E@SÀApˆ@AS$E@SÀAp‰@AS$E@SÀApŠ@AS$E@SÀAp‹@AS$E@SÀApŒ@AS$E@SÀAp@AS$E@SÀApŽ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp‘@AS$E@SÀAp’@AS$E@SÀAp“@AS$E@SÀAp”@AS$E@SÀAp•@AS$E@SÀAp–@AS$E@SPLIT SÀAp—@AS$E@SÀAp˜@AS$E@SÀAp™@AS$E@SÀApš@AS$E@SÀAp›@AS$E@SÀApœ@AS$E@SÀAp@AS$E@SÀApž@AS$E@SÀApŸ@AS$E@SÀAp @AS$E@SÀAp¡@AS$E@SÀAp¢@AS$E@SÀAp£@AS$E@SÀAp¤@AS$E@SÀAp¥@AS$E@SÀAp¦@AS$E@SÀAp§@AS$E@SÀAp¨@AS$E@SÀAp©@AS$E@SÀApª@AS$E@SÀAp«@AS$E@SÀAp¬@AS$E@SÀAp­@AS$E@SÀAp®@AS$E@SÀAp¯@AS$E@SPLIT SÀAp|@AS$E@SÀAp}@AS$E@SÀApa@AS$E@SÀApb@AS$E@SÀApc@AS$E@SÀApd@AS$E@SÀApe@AS$E@SÀApf@AS$E@SÀApg@AS$E@SÀAph@AS$E@SÀApi@AS$E@SÀApj@AS$E@SÀApk@AS$E@SÀApl@AS$E@SÀApm@AS$E@SÀApn@AS$E@SÀApo@AS$E@SÀApp@AS$E@SÀApq@AS$E@SÀApr@AS$E@+SÀ ppmRRCp pÑC@B@SÀAps@AS$E@SÀApt@AS$E@SÀApu@AS$E@SÀApv@AS$E@SÀApw@AS$E@SÀApx@AS$E@SÀApy@AS$E@SÀApz@AS$E@SÀAp{@AS$E@SÀAp~@AS$E@SÀAp@AS$E@SÀAp€@AS$E@SÀAp@AS$E@SÀAp‚@AS$E@SÀApƒ@AS$E@SÀAp„@AS$E@SÀAp…@AS$E@SÀAp†@AS$E@SÀAp®@AS$E@SÀAp‡@AS$E@SÀApˆ@AS$E@SÀAp‰@AS$E@SÀApŠ@AS$E@SÀAp‹@AS$E@SÀApŒ@AS$E@SÀAp@AS$E@SÀApŽ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp‘@AS$E@SÀAp’@AS$E@SÀAp“@AS$E@SÀAp”@AS$E@SÀAp•@AS$E@SÀAp–@AS$E@SPLIT SÀAp—@AS$E@SÀAp¯@AS$E@SÀAp˜@AS$E@SÀAp™@AS$E@SÀApš@AS$E@SÀAp›@AS$E@SÀApœ@AS$E@SÀAp@AS$E@SÀApž@AS$E@SÀApŸ@AS$E@SÀAp @AS$E@SÀAp¡@AS$E@SÀAp¢@AS$E@SÀAp£@AS$E@SÀAp¤@AS$E@SÀAp¥@AS$E@SÀAp¦@AS$E@SÀAp§@AS$E@SÀAp¨@AS$E@SÀAp©@AS$E@SÀApª@AS$E@SÀAp«@AS$E@SÀAp¬@AS$E@SÀAp­@AS$E@SÀAp°@AS$E@SÀAp±@AS$E@SÀAp²@AS$E@SÀAp³@AS$E@SÀAp´@AS$E@SÀApµ@AS$E@SÀAp¶@AS$E@SÀAp·@AS$E@SÀAp¸@AS$E@SÀAp¹@AS$E@SÀApº@AS$E@SÀApà@AS$E@SÀApá@AS$E@SÀApâ@AS$E@SÀApã@AS$E@SÀApä@AS$E@SÀApå@AS$E@SÀApæ@AS$E@SÀApç@AS$E@SÀApè@AS$E@SÀApé@AS$E@SÀApê@AS$E@SÀApë@AS$E@SÀApì@AS$E@SÀApí@AS$E@SÀApî@AS$E@SÀApï@AS$E@SÀApð@AS$E@SÀApñ@AS$E@SÀApò@AS$E@SÀApó@AS$E@SÀApô@AS$E@SÀApõ@AS$E@SPLIT SÀApö@AS$E@SÀAp÷@AS$E@SÀApø@AS$E@SÀApù@AS$E@SÀApú@AS$E@SÀApû@AS$E@SÀApü@AS$E@SÀApý@AS$E@+SÀ pMp“RRCp1pC@B@SÀApþ@AS$E@SÀApÿ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp!@AS$E@SÀAp"@AS$E@SÀAp#@AS$E@SÀAp$@AS$E@SÀAp%@AS$E@SÀAp&@AS$E@SÀAp'@AS$E@SÀAp(@AS$E@SÀAp)@AS$E@SÀAp*@AS$E@SÀAp+@AS$E@SÀAp,@AS$E@SPLIT SÀAp-@AS$E@SÀAp.@AS$E@SÀAp/@AS$E@SÀAp0@AS$E@SÀAp1@AS$E@SÀAp2@AS$E@SÀAp3@AS$E@SÀAp4@AS$E@SÀAp5@AS$E@SÀAp6@AS$E@SÀAp7@AS$E@SÀAp8@AS$E@SÀAp9@AS$E@SÀAp:@AS$E@SÀAp;@AS$E@SÀAp<@AS$E@SÀAp=@AS$E@SÀAp>@AS$E@SÀAp?@AS$E@SÀAp@@AS$E@SÀApA@AS$E@SÀApB@AS$E@SÀApC@AS$E@SÀApD@AS$E@SÀApE@AS$E@SÀApF@AS$E@SÀApG@AS$E@SÀApH@AS$E@SÀApI@AS$E@SÀApJ@AS$E@SÀApK@AS$E@SÀApL@AS$E@SÀApM@AS$E@SÀApN@AS$E@SÀApO@AS$E@SÀApP@AS$E@SÀApQ@AS$E@SÀApR@AS$E@SÀApS@AS$E@SÀApT@AS$E@SÀApU@AS$E@SÀApV@AS$E@SÀApW@AS$E@SÀApX@AS$E@SÀApY@AS$E@SÀApZ@AS$E@SÀAp[@AS$E@SÀAp\@AS$E@SÀAp]@AS$E@SÀAp^@AS$E@SÀAp_@AS$E@SÀAp`@AS$E@SÀAp2@AS$E@SÀAp1@AS$E@+SÀ p“p²RRCptp0C@B@SÀAp»@AS$E@SÀApSPLIT ¼@AS$E@SÀAp½@AS$E@SÀAp¾@AS$E@SÀAp¿@AS$E@SÀApÀ@AS$E@SÀApÁ@AS$E@SÀApÂ@AS$E@SÀApÃ@AS$E@SÀApÄ@AS$E@SÀApÅ@AS$E@SÀApÆ@AS$E@SÀApÇ@AS$E@SÀApÈ@AS$E@SÀApÉ@AS$E@SÀApÊ@AS$E@SÀApË@AS$E@SÀApÌ@AS$E@SÀApÍ@AS$E@SÀApÎ@AS$E@SÀApÏ@AS$E@SÀApÐ@AS$E@SÀApÑ@AS$E@SÀApÒ@AS$E@SÀApÓ@AS$E@SÀApÔ@AS$E@SÀApÕ@AS$E@SÀApÖ@AS$E@SÀAp×@AS$E@SÀApØ@AS$E@SÀApÙ@AS$E@SÀApÚ@AS$E@SÀApÛ@AS$E@SÀApÜ@AS$E@SÀApÝ@AS$E@SÀApÞ@AS$E@SÀApß@AS$E@SÀApà@AS$E@SÀApá@AS$E@SÀApâ@AS$E@SÀApã@AS$E@SÀApä@AS$E@SÀApå@AS$E@SÀApæ@AS$E@SÀApç@AS$E@SÀApè@AS$E@SÀApé@AS$E@SÀApê@AS$E@SÀApë@AS$E@SÀApì@AS$E@SÀApí@AS$E@SÀApî@AS$E@SÀApï@AS$E@SÀApð@AS$E@SÀApñ@AS$E@SÀApò@AS$E@SÀApó@AS$E@SÀApô@AS$E@SPLIT SÀApõ@AS$E@SÀApö@AS$E@SÀAp÷@AS$E@SÀApø@AS$E@SÀApù@AS$E@SÀApú@AS$E@SÀApû@AS$E@SÀApü@AS$E@SÀApý@AS$E@SÀApþ@AS$E@SÀApÿ@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp @AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@SÀAp@AS$E@+SÀ p¤pRRCppkC@B@SÀAp@AS$E@SÀAp@AS$E@SÀAp @AS$E@SÀAp!@AS$E@SÀAp"@AS$E@SÀAp#@AS$E@SÀAp$@AS$E@SÀAp%@AS$E@SÀAp&@AS$E@SÀAp'@AS$E@SÀAp(@AS$E@SÀAp)@AS$E@SÀAp*@AS$E@SÀAp+@AS$E@SPLIT SÀAp,@AS$E@SÀAp-@AS$E@SÀAp.@AS$E@SÀAp/@AS$E@SÀAp0@AS$E@SÀAp3@AS$E@SÀCA@SPLIT SÀ RC tû:±“O€Hy ô ¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:ût±O“€Hy ô ¥SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥qÚSsÀ/ ¡ fee5cb9a196b40a4a37f4d070d7c04da@@@@@@@@@@@@Su  3Hey there!SÀ RR %é—¯2ÓL©*/ýRÅC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯—é%Ó2L©*/ýRÅSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥qÚSsÀ/ ¡ bc11c5d10908443a8f7ce1feaff341d3@@@@@@@@@@@@Su  3Hi there!SÀ RR 6++Ø£¿?FŸ¶®h:·þ­C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ø++6¿£F?Ÿ¶®h:·þ­SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥qÚSsÀ/ ¡ 8defb79ec88345b19dbf7ccb2b3b2f12@@@@@@@@@@@@Su  3Ho there!SÀ RR ŽËX çE©¾õŸ…’«+C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ËŽ XE穾õŸ…’«+SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥qéSsÀ/ ¡ 27e8c62818ea432fa74523f5003843ba@@@@@@@@@@@@Su  3Hey there!SÀ RR ÃqÝG¿ê «ñQ"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜qÃÝG¿ê «ñQ"SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU £x-opt-locked-untilƒ`f¥qéSsÀ/ ¡ 0e99e30e1ee943d7b0a34736a7f6428b@@@@@@@@@@@@Su  3Hi there!SÀ RR îC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜|vF‡ÂIjƒ;æ'>îSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥räSsÀ/ ¡ ab98f9e78b1c4320a775ec6404f8e6b8@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR Œ4®.øQA¤¿,—òK’C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®4Œø.AQ¤¿,—òK’SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ d5ce3e1a23de440bbf90ac455ff333ab@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR µ(>QÆPüF¶K‹öòÛŸMC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Q>(µPÆFü¶K‹öòÛŸMSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ f81bf218eda54688b27715a78fb4d712@@@@@@@@@@@@Su  3Hi there!SÀ RR Øè°ÛÝF¦tä|Üf`C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜èØÛ°Fݦtä|Üf`SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ b54c1d2df89f468aa2cb4a85459986e3@@@@@@@@@@@@Su  3Ho there!SÀ RR b|{ÀKµ”³U¸¨tC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜|b{KÀµ”³U¸¨tSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU £x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ 077eccc37c8245ee9ef3d240a2fe03d2@@@@@@@@@@@@Su  3Hey there!SÀ RR sºÉä"ÇHŽ~ (—± C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Éºs"äHÇŽ~ (—± SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU!£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ 8d20854bac354eae9ef5ebb0ba67738d@@@@@@@@@@@@Su  3Hi there!SÀ RR ÓÍH>¨E A’2T ÑÀÄuC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>HÍÓE¨A ’2T ÑÀÄuSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU"£x-opt-locked-untilƒ`f¥s2SsÀ/ ¡ c0d42cb9039d4bb5b6974ed3e6f159e8@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR [$ö&2€·I²££%2ÿbC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜&ö$[€2I·²££%2ÿbSrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU#£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ eee81f81d84b44fe8f94226fd61abce1@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR ]Døò3µO¾ÇöY…C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜òøD]µ3O¾ÇöY…SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU$£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 0190e7cc87c84fc39258f3065dfa334e@@@@@@@@@@@@Su  3Hi there!SÀ RR  +©ë”Iƒâª³µ¶’©C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ë©+”Iƒâª³µ¶’©SrÁU£x-opt-enqueued-timeƒ`f¤†Ÿ£x-opt-sequence-numberU%£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 4fe90924d06140088cc32539382c26a1@@@@@@@@@@@@Su  3Ho there!SÀ RR! ƒáó¢*Ç@™§zÏìß]áC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜óáƒ*¢@Ç™§zÏìß]áSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU&£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 725da4500abc4fc4bdb55a45e28ea243@@@@@@@@@@@@Su  3Hey there!SÀ RR" XœþŽkØM’kŒ™ÖÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þœXkŽMØ’kŒ™ÖÉSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU'£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 37f70567d87d4619b06fe0c5b2c60f05@@@@@@@@@@@@Su  3Hi there!SÀ RR# bŸ;¨’¦÷@xµ<¥JóDC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¨;Ÿb¦’@÷xµ<¥JóDSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU(£x-opt-locked-untilƒ`f¥s€SsÀ/ ¡ 92b95937594749629c2439015fe9feae@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR$ ¼,pÅþÄ,F…J”TÆ«C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Åp,¼ÄþF,…J”TÆ«SrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU)£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ 6858aa0fe02a467dae4b53303daa726f@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR% -âÜ/Q B¡±c5VÑC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Üâ-Q/B ¡±c5VÑSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU*£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ a0a119a4bae743978a683208ab1abb9d@@@@@@@@@@@@Su  3Hi there!SÀ RR& "à@›K›ç®$i—ÚC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@à"›K›ç®$i—ÚSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU+£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ d0438307df1249e5914dcb3548ad57d2@@@@@@@@@@@@Su  3Ho there!SÀ RR' Œ®£½olJ€eùõY¡€yC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜½£®ŒoJl€eùõY¡€ySrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU,£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ 1cebd35124d5401fbcc716525d35402a@@@@@@@@@@@@Su  3Hey there!SÀ RR( í<5Ë•/M‘DEõ²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5<í•ËM/‘DEõ²SrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU-£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ fc4b825eb2124179a9e31289d7b7e319@@@@@@@@@@@@Su  3Hi there!SÀ RR) ›ü9Û.ßEªæƒ0Q¹|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜9ü›.ÛEߪæƒ0Q¹|SrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU.£x-opt-locked-untilƒ`f¥tKSsÀ/ ¡ 59a896dc725346f185540fd257a7de21@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR* æ (шyCº?¸–bÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜( æˆÑCyº?¸–bÛSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU/£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ e48c19ebc0e64907a19a4e2cc7103bc8@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR+ :º¶\nµ.NŸ²ÃU÷† sC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜\¶º:µnN.Ÿ²ÃU÷† sSrÁU£x-opt-enqueued-timeƒ`f¤†®£x-opt-sequence-numberU0£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ 4d6fdca3655241ed8bad321f106ae603@@@@@@@@@@@@Su  3Hi there!SÀ RR, ("½NE¦òZ&dúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜½"(EN¦òZ&dúSrÁU£x-opt-enqueued-timeƒ`f¤†¾£x-opt-sequence-numberU1£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ ee88b32af2cd4594b612371f8229ecd6@@@@@@@@@@@@Su  3Ho there!SÀ RR- KÜ8Ÿ|ÿL¿±‰ÕWö;õC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ÿ8ÜK|Lÿ¿±‰ÕWö;õSrÁU£x-opt-enqueued-timeƒ`f¤†¾£x-opt-sequence-numberU2£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ dbe07d4e911043d1b1ec0f714807e2c2@@@@@@@@@@@@Su  3Hey there!SÀ RR. ¼0´Z¯þ¯I–ÚˆÑô‚ÚC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Z´0¼þ¯I¯–ÚˆÑô‚ÚSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU3£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ 00e8c68fbbd74a0eac974e5db84956f1@@@@@@@@@@@@Su  3Hi there!SÀ RR/  DU¡Ã+]F™ írƒÔ˜IC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¡UD +ÃF]™ írƒÔ˜ISrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU4£x-opt-locked-untilƒ`f¥tšSsÀ/ ¡ 565c685bb1ac4fa393d15f70c4b0bdd0@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR0 §“KSVÐBœò·7·ÑC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜SK“§ÐVBœò·7·ÑSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU5£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ 9dfe00f3a5584155bfb1369b4b48c32d@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR1 ¿Ö[yŸ§…K§„·®×£C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜y[Ö¿§ŸK…§„·®×£SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU6£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ 54d288f642a443c585be6f334405dc7d@@@@@@@@@@@@Su  3Hi there!SÀ RR2 —{ëÜöCÕOEoC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ë{—öÜCÕOEoSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU7£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ afb5ea722ae64f898d76817982399dc2@@@@@@@@@@@@Su  3Ho there!SÀ RR3 Ü߆·5¤FšyÛîû¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†ßÜ5·F¤šyÛîû¥SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU8£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ 4550a8e7ee71481cacd1a42bf4a1a31b@@@@@@@@@@@@Su  3Hey there!SÀ RR4 ›Ûu³4|@†ûèœñƒÿC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³uÛ›|4@†ûèœñƒÿSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU9£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ caeb9718b0f34baa85195a17e5709e03@@@@@@@@@@@@Su  3Hi there!SÀ RR5 Õšõ¬ÊµO­¤wë;aúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¬õšÕµÊO­¤wë;aúSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU:£x-opt-locked-untilƒ`f¥t÷SsÀ/ ¡ 17805e985c8d47659f07f832fe0876c5@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR6 o]Í.ê¬>C„ÏÄa¾YßçC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜.Í]o¬êC>„ÏÄa¾YßçSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU;£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 5ce8c106c6304166a4f112530b3e7e56@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR7 ¹0ZÖ†ÉN²8,7µíWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÖZ0¹†Nɲ8,7µíWSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU<£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 39eb87ed46e149dd8f3902bb117adf70@@@@@@@@@@@@Su  3Hi there!SÀ RR8 "54˜ C•Õ­…d³ÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5"˜4C •Õ­…d³ÞSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU=£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ fed30d8abd124ea58ed507c27d7babd6@@@@@@@@@@@@Su  3Ho there!SÀ RR9 PNþhÕ'‚OªíÒ%ä&ËC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hþNP'ÕO‚ªíÒ%ä&ËSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU>£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 89826be41a544dc7aae85e40f6b144e2@@@@@@@@@@@@Su  3Hey there!SÀ RR: —‡Œ§Ås/F§A4"4æ)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜§Œ‡—sÅF/§A4"4æ)SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU?£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 21f0326ff8074ae79351a7e3aa702c00@@@@@@@@@@@@Su  3Hi there!SÀ RR; ôtléX[B¸JbêƒÔ¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ltôXéB[¸JbêƒÔ¸SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU@£x-opt-locked-untilƒ`f¥uUSsÀ/ ¡ 3ca9be1f21d94c108058dc66c878af46@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR< ÅxžÓ¢´K®#uäm¶`!C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÓžxÅ´¢K®#uäm¶`!SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUA£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ 6b94c038d910458a92ac8c6e9d46b763@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR= ¢[áIE§B¼WȤ¾£œC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜á[¢EIB§¼WȤ¾£œSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUB£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ d0462d261cae48de9dd5acf019e1a0bd@@@@@@@@@@@@Su  3Hi there!SÀ RR> ·t•àÕ½ÈL³ªo±JûêC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜à•t·½ÕLȳªo±JûêSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUC£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ 9317317c9e9c46a2b9228b1687d0b7be@@@@@@@@@@@@Su  3Ho there!SÀ RR? ½³[Ög›@˜D–¾û¹(C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜[³½gÖ@›˜D–¾û¹(SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUD£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ b9dde05c34c148028785781afd80fe87@@@@@@@@@@@@Su  3Hey there!SÀ RR@ IT Ü|M¢\RjVz²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜TIÜ M|¢\RjVz²SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUE£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ 33eeb4c3b7cb446980cf4cf0c55e8e18@@@@@@@@@@@@Su  3Hi there!SÀ RRA uÔô±–ÄM©»êJÖu[C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ôÔu–±MÄ©»êJÖu[SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUF£x-opt-locked-untilƒ`f¥u£SsÀ/ ¡ e2a253a160cb4dcab7845201e7c95af6@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRB BóajÂE›L$ÝLKRC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jaóBÂE›L$ÝLKRSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUG£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ ea729f3ec5f94a4fa7ea34747050b429@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRC Ã6ã+<,G¾U³îçC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ã6Ã<+G,¾U³îçSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUH£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 1c44d362e8cf4c9c9afe14b4dbcd974c@@@@@@@@@@@@Su  3Hi there!SÀ RRD +…ÃAà­¨A¨ÁnùaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜AÃ…+­àA¨¨ÁnùaSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUI£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 4c434dd791ae425ab482d596f37fbd90@@@@@@@@@@@@Su  3Ho there!SÀ RRE ‚Xsq²I»@‚¹¡‹í (AC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜qsX‚I²@»‚¹¡‹í (ASrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUJ£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ ca602540424d4723a1617774afcc4a7e@@@@@@@@@@@@Su  3Hey there!SÀ RRF  J í¢VC¦¥¦ÃKš~{C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ J ¢íCV¦¥¦ÃKš~{SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUK£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ cb3189e3156646b98fc193e1fc31023d@@@@@@@@@@@@Su  3Hi there!SÀ RRG ’äÎG`_†Fºh5•æ{C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜GÎä’_`F†ºh5•æ{SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUL£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ d7dccfaabcb04f3689e8253e041bb962@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRH Ãتæ•9àLª×6àtº”\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æªØÃ9•Làª×6àtº”\SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUM£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 9c09407f7cd247b082afe5c48d9a65df@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRI Ø™|#!%WH—­^Eˆ•EC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#|™Ø%!HW—­^Eˆ•ESrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUN£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 56e55c70b5514fab941e15c10fed10d3@@@@@@@@@@@@Su  3Hi there!SÀ RRJ ã{GšˆRáK¢Í5+h³RC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜šG{ãRˆKá¢Í5+h³RSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUO£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 72dae1e18f7f4e778cf2cd5f4ed921fe@@@@@@@@@@@@Su  3Ho there!SÀ RRK é (œ¹®C›ë2H/”t€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜( 鹜C®›ë2H/”t€SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUP£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 48f5b34446504df69b4546998aba1357@@@@@@@@@@@@Su  3Hey there!SÀ RRL ij†pâõ¦L¶—¥¤UãFUC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜p†³ÄõâL¦¶—¥¤UãFUSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUQ£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 98838d8352fd4ca0971f06cb5fd5d100@@@@@@@@@@@@Su  3Hi there!SÀ RRM Ñæµè‡|@–J<&ZŸÔóC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜µæÑ‡è@|–J<&ZŸÔóSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUR£x-opt-locked-untilƒ`f¥vOSsÀ/ ¡ 032b9a4cab0b4decac2e09c13c434b0b@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRN (¯ðÕ¥½I ÷@–,±˜bC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Õð¯(½¥I ÷@–,±˜bSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUS£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ aea00d8a183649318d4e7593a09c0630@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRO QÄÒý3C°"TeOWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÒÄQýC3°"TeOWSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUT£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 85136752c531452894badbacd55951d1@@@@@@@@@@@@Su  3Hi there!SÀ RRP @Á¢®>´K¶=d‚pýõC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¢Á@>®K´¶=d‚pýõSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUU£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 00e8f7baf7444a76a1d63c9d92bc2e09@@@@@@@@@@@@Su  3Ho there!SÀ RRQ  Ñ®+)YèG–aõÆ£ëÙ=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+®Ñ Y)Gè–aõÆ£ëÙ=SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUV£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 1e95f6d205da4774941a1e82dd5ce631@@@@@@@@@@@@Su  3Hey there!SÀ RRR )$Âà9/EŠã!<œßIC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜àÂ$)9E/Šã!<œßISrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUW£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 73a9f45c9a5a4a679067be681e988112@@@@@@@@@@@@Su  3Hi there!SÀ RRS ÎË–gúô I¨ÓBò‡³uC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜g–ËÎôúI ¨ÓBò‡³uSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUX£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 3765e7b7b9c04e8d8c884c902eb7afa5@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRT Ɇ~‰C°øY(˜ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†É~C‰°øY(˜ SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUY£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ d3b1503c5d89434fad5257637e779498@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRU ¹$j] Û%A‘&3|ßœaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜]j$¹Û A%‘&3|ßœaSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUZ£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ 2d61e4bb8473461d8ffa6a5ce7b1cc1a@@@@@@@@@@@@Su  3Hi there!SÀ RRV èq~2B‡AÙØÐ¿9C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜qè~B2‡AÙØÐ¿9SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU[£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ c019d37fd49546bbaaffaf556457c965@@@@@@@@@@@@Su  3Ho there!SÀ RRW ʂՆ÷&IFš 5§&ä+ÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜†Õ‚Ê&÷FIš 5§&ä+ÄSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU\£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ d01d7767e0944635b6c3e67a031d9784@@@@@@@@@@@@Su  3Hey there!SÀ RRX RЍï-° F®±5BOlC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï¨ŠR°-F ®±5BOlSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU]£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ ae7740defb9a40a6b797d0b3dea1cac5@@@@@@@@@@@@Su  3Hi there!SÀ RRY UãÑJªõkF¹Ös’ÿ±"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜JÑãUõªFk¹Ös’ÿ±"SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU^£x-opt-locked-untilƒ`f¥vûSsÀ/ ¡ 4ee53754754a40b6ac3289c83ac9606f@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRZ ðØßXIJyA³0m!ì„Õ]C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Xߨð²ÄAy³0m!ì„Õ]SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU_£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ 6452879f7f3d4323a0bc0236f6923024@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RR[  Ù˜ û@¡ì0Hbf-ìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ù  ˜@û¡ì0Hbf-ìSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberU`£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ 66d67615bec547569676af375bac67b2@@@@@@@@@@@@Su  3Hi there!SÀ RR\ ö‘¶@ÇŠoE¶VÑä?…ô-C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@¶‘öŠÇEo¶VÑä?…ô-SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUa£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ a66507d0209644b78d8d4144912f42b9@@@@@@@@@@@@Su  3Ho there!SÀ RR] äc²§X°D‹r°(åöC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜§²cäXD°‹r°(åöSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUb£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ ee5c0da3254c4462a07222f747b2306d@@@@@@@@@@@@Su  3Hey there!SÀ RR^ 5÷»mBYCŠ~{u¾š C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜»÷5BmCYŠ~{u¾š SrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUc£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ fa70e4d4964a47838b76f31c95b6f3b3@@@@@@@@@@@@Su  3Hi there!SÀ RR_ tKN{J7æL¬Œ´F›Ú·qC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{NKt7JL欌´F›Ú·qSrÁU£x-opt-enqueued-timeƒ`f¤†Ï£x-opt-sequence-numberUd£x-opt-locked-untilƒ`f¥wISsÀ/ ¡ d363d695ae3149e898af960854aaec1e@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RR` ’öÄ(‘âC½WÒ-{M9C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Äö’‘(Câ½WÒ-{M9SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUe£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ b1a13f2e2b5b460fb6bba1477107d367@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRa ð%€S³ÃEŒÄÇÏÅü"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜S€%ð³EÃŒÄÇÏÅü"SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUf£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ a0d06e874b684b74b904e4b2f28453ca@@@@@@@@@@@@Su  3Hi there!SÀ RRb ô[ c×I»§Õ…}€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ [ô×cI»§Õ…}€SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUg£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ 34b1b8c94f5b4930b36fe2480e9528dc@@@@@@@@@@@@Su  3Ho there!SÀ RRc ó9KÛA†ÒD‹˜]Ø' .ˆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÛK9ó†ADÒ‹˜]Ø' .ˆSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUh£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ 1288d1e729c44df1b53b156fb2b9c3d9@@@@@@@@@@@@Su  3Hey there!SÀ RRd ~²½åëûšNj|éH‡ÄôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜å½²~ûëNšj|éH‡ÄôSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUi£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ 638bbd40094040a7a01c9f76f760a057@@@@@@@@@@@@Su  3Hi there!SÀ RRe 0nØý©î@£Q#&Š)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Øn0©ý@î£Q#&Š)SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUj£x-opt-locked-untilƒ`f¥w§SsÀ/ ¡ 2aaa8e0faefe464f9e0045f29c042ae4@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRf ECãÆ{²O™¤XC&‹-¼C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãCE{ÆO²™¤XC&‹-¼SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUk£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ dfde108ce1114e25bc9f0cc2d4af34d7@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRg qßþ³â6@¿tü ëëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³þßqâ@6¿tü ëëSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUl£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ cd31fe2243434244bc028688a799c34c@@@@@@@@@@@@Su  3Hi there!SÀ RRh M˜ƒîA®ögu¦ÄzÃC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Mƒ˜Aî®ögu¦ÄzÃSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUm£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ 1e98b4094c184fe8a6825d349c7690a8@@@@@@@@@@@@Su  3Ho there!SÀ RRi ç_è…êcH€•uä¹ 6C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜è_çê…Hc€•uä¹ 6SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUn£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ 991ec1e3d8264b6895b436ae53cd3cfc@@@@@@@@@@@@Su  3Hey there!SÀ RRj Õ±Û»SI±utr9:n|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Û±ÕS»I±utr9:n|SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUo£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ 3fde53ba4fbe40729aae86a23096e13c@@@@@@@@@@@@Su  3Hi there!SÀ RRk 6tùñ>´ÂM¦ýÞ@÷–ÅC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ñùt6´>M¦ýÞ@÷–ÅSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUp£x-opt-locked-untilƒ`f¥xbSsÀ/ ¡ 94b88707475d4c32927c2c294feff41c@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRl “Eœðï©G…•°›xÞÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜œE“ïðG©…•°›xÞÕSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUq£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ e3691688028e45c4beeb7556b46ad5ad@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRm éÒ‹ÄGšÇ³ŽézC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Òé‹GĚdzŽézSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUr£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ ab44d47ec51f47e191fc38b7943bfdb1@@@@@@@@@@@@Su  3Hi there!SÀ RRn CýÝJ†KEKŠs°]©IC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜JÝýCK†KEŠs°]©ISrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUs£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ 1eb50643bea9447d803c9029ff2a2663@@@@@@@@@@@@Su  3Ho there!SÀ RRo :{›Û˜N½]Zb`¬7˜C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Û›{:˜N½]Zb`¬7˜SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUt£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ adad5bb9849745879d5b7d5cb94bf8bf@@@@@@@@@@@@Su  3Hey there!SÀ RRp JÒ\ŽØF•ÙÔz % C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜\ÒJØŽF•ÙÔz % SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUu£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ c9f11a3a83c44c018fd9ecb074483ce5@@@@@@@@@@@@Su  3Hi there!SÀ RRq ÷Víº3MœÅÞVÊÇC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜íV÷ºM3œÅÞVÊÇSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUv£x-opt-locked-untilƒ`f¥xÀSsÀ/ ¡ 8e487ff4cddc4d729f82ea5886895c84@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRr ž 4ÊMK§Èµ˜OHPC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4 žMÊK§Èµ˜OHPSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUw£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ b906f9ef18d24346baaabf4fdab05c9b@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRs R™üÖK[K–2á§ (¾C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ü™RKÖK[–2á§ (¾SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUx£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ b66149d7d9cb4d2e931b03af3e0e22ab@@@@@@@@@@@@Su  3Hi there!SÀ RRt KX”5nåIm’*¯FÌC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”XKn5Iåm’*¯FÌSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUy£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ f4d87ea7ddc7453b9f90f68b5c88075e@@@@@@@@@@@@Su  3Ho there!SÀ RRu t9¼å×ímJŒÇUZÿ8ÇaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜å¼9tí×JmŒÇUZÿ8ÇaSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberUz£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ f7bc24d1f4864680af962f69fe0ea14b@@@@@@@@@@@@Su  3Hey there!SÀ RRv ³ý ﯡO•w_Ð Ø­C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï ý³¯O¡•w_Ð Ø­SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberU{£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ 746ca05f92064841ac581390101110de@@@@@@@@@@@@Su  3Hi there!SÀ RRw Š4ß¹–LµhöXÞ²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ß4йL–µhöXÞ²SrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberU|£x-opt-locked-untilƒ`f¥ySsÀ/ ¡ 4101f41a967c41f9a1c264ba55f8d083@@@@@@@@@@@@Su  3Ho there!SPLIT SÀ RRx 3 _¼zpK¸þžª›ôŸC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜_ 3z¼Kp¸þžª›ôŸSrÁU£x-opt-enqueued-timeƒ`f¤†Ý£x-opt-sequence-numberU}£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ a79f92a70b7542a69501ecc866898b66@@@@@@@@@@@@Su  3Hey there!SPLIT SÀ RRy @[~»šðL¦HŸ£¸ßC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~[@š»Lð¦HŸ£¸ßSrÁU£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberU~£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ 1353f699ea3e4b379522ad20b2bbde7c@@@@@@@@@@@@Su  3Hi there!SÀ RRz º.AC¹1:E¥L›-¤œ õC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜CA.º1¹E:¥L›-¤œ õSrÁU£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ 1d5c59e32cf44ba083e2f0389f28525c@@@@@@@@@@@@Su  3Ho there! SÀ RR{  ‰F½`ߦ€ªÀC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ F‰½`ߦ€ªÀSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number€£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ b9120148f5ec4563a8eabdab305830ae@@@@@@@@@@@@Su  3Hey there! SÀ RR| ]måº`ßµIÈoÖô¬1C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ºåm]ß`IµÈoÖô¬1SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ b41f3f84833d4f76bab2c322677b6804@@@@@@@@@@@@Su  3Hi there! SÀ RR} ÕQwåå>A‘)×yñpC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜wQÕååA>‘)×yñpSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‚£x-opt-locked-untilƒ`f¥y]SsÀ/ ¡ dd6dd88d608043cdaa5d9751f2cb5f5b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR~ 8ÓæÿÿD¯ïØ…¨5C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æÓ8ÿDÿ¯ïØ…¨5SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberƒ£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ fcef537e85df4e329a85f0c30a206238@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR  d^>‚›C® ÙÏâPÀC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^d ‚>C›® ÙÏâPÀSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number„£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ d0e88b9701504935b31ed088f85f065e@@@@@@@@@@@@Su  3Hi there! SÀ RR€ ½Ó/ÄÿcN——ã$£î3C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ä/Ó½ÿNc——ã$£î3SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number…£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ ef5bada9164346c1805abe859d5812db@@@@@@@@@@@@Su  3Ho there! SÀ RR ê¹ïGŠ Iœaë­SC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï¹êŠGI œaë­SSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number†£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ 16ef7dd8fe2f4c4985f937ce1fa38df7@@@@@@@@@@@@Su  3Hey there! SÀ RR‚ ܤÚÌ.€§J²¨-÷°ÊÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ìڤ܀.J§²¨-÷°ÊÝSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‡£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ bea19b42b06845dbb94c88bc9b135d4b@@@@@@@@@@@@Su  3Hi there! SÀ RRƒ ԃaKH–³8úíC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÔЇîaƒKH–³8úíSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberˆ£x-opt-locked-untilƒ`f¥yÊSsÀ/ ¡ 3b950801e5024818a5eb580777d6c1dc@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR„ »•ÒjÂ(%G®á”çB.ÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jÒ•»(ÂG%®á”çB.ÔSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‰£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ c57b5f6e099b45c99a27bbb6299ceede@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR… ¬Áòr~N¨Þ—î}K©ÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜òÁ¬rN~¨Þ—î}K©ÄSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberŠ£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ 7a561baad99c4c9ea1c4d57addfdf690@@@@@@@@@@@@Su  3Hi there! SÀ RR† &‰Gù{ãK±a›C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜G‰&{ùKã±a›SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‹£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ 2287bc3e1c64455dadee056841d134be@@@@@@@@@@@@Su  3Ho there! SÀ RR‡ Ô,EÉÉC´0ÓàÌ:‰C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜,ÔÉECÉ´0ÓàÌ:‰SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberŒ£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ 5f71a1b51ae74a0eb1e6bb62781be95e@@@@@@@@@@@@Su  3Hey there! SÀ RRˆ Zˆâ›)SXN´ÑÊXgq£C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜›âˆZS)NX´ÑÊXgq£SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ 640c0f24b41544faab254a2cac3b0dcf@@@@@@@@@@@@Su  3Hi there! SÀ RR‰ ޲>Ÿ’B¿×ðÜp±MC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>²ŽŸB’¿×ðÜp±MSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberŽ£x-opt-locked-untilƒ`f¥z(SsÀ/ ¡ fc070119619c45d3b6d3cf2b18683525@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRŠ ‘"QÛŸ¼F„V‰&QÚ|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÛQ"‘ŸF¼„V‰&QÚ|SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ fa8b7f0704484f4aaeb56296fc234a69@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR‹ NSe^fõþD­‘@¾GC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^eSNõfDþ­‘@¾GSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ 25ef926f741f4358be2eb2e6b2fd9957@@@@@@@@@@@@Su  3Hi there! SÀ RRŒ èBû#°†J·?b¹¼GŽC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#ûBè°J†·?b¹¼GŽSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number‘£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ 694757a4accf4cf485ccaa8f73e7899d@@@@@@@@@@@@Su  3Ho there! SÀ RR ";6°H¯ÅH®Œv´'ÎXC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°6;"¯HHÅ®Œv´'ÎXSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number’£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ 3702a9f3d7ce4f1cb4266b4999793680@@@@@@@@@@@@Su  3Hey there! SÀ RRŽ ßjœÁ8ÄG’ä©'óõ!õC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Áœjß8GÄ’ä©'óõ!õSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number“£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ ad6b74b84d5a41ebbb4edde0dbfcdce6@@@@@@@@@@@@Su  3Hi there! SÀ RR š=ñ+å=F  ÁN•ׯC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+ñ=š=åF  ÁN•ׯSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number”£x-opt-locked-untilƒ`f¥zvSsÀ/ ¡ 10ff794e715e4d55825c8d094de9a232@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR @¹dnBH¤ÝÆ&Ù‰ ÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¹@ndHB¤ÝÆ&Ù‰ ÕSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number•£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ 9f5d7269d1694e57a9e65005be2e70aa@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR‘ ºE¯ÑЉK“J|¶“RoC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯EºÐÑK‰“J|¶“RoSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number–£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ b83cad52fee745ad8c58459edec2bcec@@@@@@@@@@@@Su  3Hi there! SÀ RR’ #3ÌÏÓ9GœÉó©; C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÏÌ3#9ÓGœÉó©; SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number—£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ e84e67d0e1404313a162c641d1cb1fa5@@@@@@@@@@@@Su  3Ho there! SÀ RR“ XÌ‚=\uD‡þWÝ~5ÐõC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚ÌX\=Du‡þWÝ~5ÐõSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number˜£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ c8ce7210d00c439fab64d144b35a70fe@@@@@@@@@@@@Su  3Hey there! SÀ RR” Ðrâ*Âá®M¢\Æ*Å3ÂíC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*ârÐáÂM®¢\Æ*Å3ÂíSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number™£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ efe786e68fd94f2a9c568ee49c758b79@@@@@@@@@@@@Su  3Hi there! SÀ RR• |¿Xåy5ÉH†gËÂG?/C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åX¿|5yHɆgËÂG?/SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberš£x-opt-locked-untilƒ`f¥zÄSsÀ/ ¡ a07a60ab18db40379271c0750e2a7180@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR– ´ËA­%ÓÔCÐ|²þP{C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜­AË´Ó%CÔÐ|²þP{SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number›£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ a381d6e23c794138ab9de04b3009bcd1@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR— øf2D¥q/AŒ()ëÓC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜D2føq¥A/Œ()ëÓSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberœ£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 083ab1b6e61e4f688e8da04cb3790fe8@@@@@@@@@@@@Su  3Hi there! SÀ RR˜ ·uÓWèÎG¸ù»¹¶ÝLC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Óu·èWGθù»¹¶ÝLSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 107d78c61b684b55a1234e05a8b2ca95@@@@@@@@@@@@Su  3Ho there! SÀ RR™ àÌæ‡A‰'/í²y›YC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æÌà‡A‰'/í²y›YSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberž£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 2f2f0e30508041a2a12928f656b27376@@@@@@@@@@@@Su  3Hey there! SÀ RRš ç÷Šamæ©IƒBÂ+ÁIì«C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜aŠ÷çæmI©ƒBÂ+ÁIì«SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberŸ£x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 698661f4454e440daedadae817e48304@@@@@@@@@@@@Su  3Hi there! SÀ RR› õ˜¡wksL»meÉ…ê¼âC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜w¡˜õkLs»meÉ…ê¼âSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number £x-opt-locked-untilƒ`f¥{"SsÀ/ ¡ 1d53a067687d47769e292e906a9749ad@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRœ Æ·A @E¬ä_2ÇRC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜A·Æ E@¬ä_2ÇRSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¡£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ ff25046060c94be69cb602ada3c43896@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR LŸ²à/†9H„Qˆ‚W$(BC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜à²ŸL†/H9„Qˆ‚W$(BSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¢£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ ba7c3a9462a440d49383c812773cb5bd@@@@@@@@@@@@Su  3Hi there! SÀ RRž Ûýýv±å,I¨xà]IBõC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜výýÛå±I,¨xà]IBõSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number££x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ 658c86a3015b463ea2ce564b7315934d@@@@@@@@@@@@Su  3Ho there! SÀ RRŸ ÊŸQ‘Á&A‚s+ÞèC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜QŸÊÁ‘A&‚s+ÞèSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¤£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ 989f7f8f457d470187bf7eaf1dab460e@@@@@@@@@@@@Su  3Hey there! SÀ RR  L Û.¥Mª •sçÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Û L¥.Mª •sçÏSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¥£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ ef02fcbac2c04469ba12c64ad4688569@@@@@@@@@@@@Su  3Hi there! SÀ RR¡ æ>èAÏ@šÃàaxjC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Aè>æÏ@šÃàaxjSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¦£x-opt-locked-untilƒ`f¥{€SsÀ/ ¡ dd57e47205604331859d05dc7be47a11@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR¢ ¥ŒøeÜ/N‚ýSræ§4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜øŒ¥ÜeN/‚ýSræ§4SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number§£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ d3636221a69142ce910bdf159be32d3d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR£ |-ïy+ÇLŒØ¶õùäÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï-|+yLnjضõùäÏSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¨£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ 77386d51738641a4be046c110cfe634e@@@@@@@@@@@@Su  3Hi there! SÀ RR¤ ‰Qd¿Ê­Mž|nEÁÐ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¿dQ‰­ÊMž|nEÁÐ SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number©£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ d49a578213964e7baa74d8d41cac052f@@@@@@@@@@@@Su  3Ho there! SÀ RR¥ îÂãh8p–K»÷¢ C‡ß¯C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hãÂîp8K–»÷¢ C‡ß¯SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberª£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ 8e8e607bf4c04c948ff6679474cf7ff2@@@@@@@@@@@@Su  3Hey there! SÀ RR¦ *ÂÉ"¾aD¢’÷‘ºEi‘C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÉÂ*¾"Da¢’÷‘ºEi‘SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number«£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ 0cb119b874344909941c34719c75769d@@@@@@@@@@@@Su  3Hi there! SÀ RR§ Y»‰¸WMIœ[#Ò•C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¸‰»YWIMœ[#Ò•SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¬£x-opt-locked-untilƒ`f¥{ÎSsÀ/ ¡ c94644c17ee64812827cabf3e39a61d4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR¨ ÎÖä:ä"_I·ckgêÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:äÖÎ"äI_·ckgêÔSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number­£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ 2b291706aeb041969befce5f65b86259@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR© qYKxÆÇF”à'ùÈà8C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜KYqÆxFÇ”à'ùÈà8SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number®£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ ebcd8d1f76b9494298f2545f3f9a4818@@@@@@@@@@@@Su  3Hi there! SÀ RRª j*†^^³B®Nºñ‘æ#ÎC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^†*j^B³®Nºñ‘æ#ÎSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¯£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ 720d07c5c1f744f4a37640003da03265@@@@@@@@@@@@Su  3Ho there! SÀ RR« ܾÓ&&ÌDžóUfjS‰ùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ó¾Ü&&DÌžóUfjS‰ùSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number°£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ d4723a5885f64de49a7092e9c004650d@@@@@@@@@@@@Su  3Hey there! SÀ RR¬ 4Ç´º O´ô\•쩘C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ç4º´O ´ô\•쩘SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number±£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ 2787ca5d76bd4182a32bf577bf3c6f26@@@@@@@@@@@@Su  3Hi there! SÀ RR­ h3D÷vïF<ð·\Y8C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜÷D3hïvF<ð·\Y8SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number²£x-opt-locked-untilƒ`f¥|SsÀ/ ¡ 6e4bf0134adc41b0a03b57b0f56f1547@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RR® "N~ ŽF¢»"ÆôàC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ~N"ŽF¢»"ÆôàSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number³£x-opt-locked-untilƒ`f¥|zSsÀ/ ¡ 724b7a3641b54c2c9c0ae81c208ecac6@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR¯ ”ö/ÚëµîI²€Ék›„C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ú/ö”µëIî²€Ék›„SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number´£x-opt-locked-untilƒ`f¥|zSsÀ/ ¡ 026a13c3f2614eb1919b91db3b01bde1@@@@@@@@@@@@Su  3Hi there! SÀ RR° 2…ÍÃF¨L÷Ï#®á DC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÃÍ…2¨FL÷Ï#®á DSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberµ£x-opt-locked-untilƒ`f¥|zSsÀ/ ¡ 3297935e6cd14c40a2971e66e8164e5f@@@@@@@@@@@@Su  3Ho there! SÀ RR± žéRT% Jšs- "³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Réž%TJ šs- "³SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¶£x-opt-locked-untilƒ`f¥|zSsÀ/ ¡ 4be135e5db3644e2b74c4746af77698f@@@@@@@@@@@@Su  3Hey there! SÀ RR² Þî· É’“à·ÿrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5¹Š¶#MHtŽ>’“à·ÿrSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-numberº£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ 156a8b12d1ce424bbedd5df1c81d8b46@@@@@@@@@@@@Su  3Hi there! SÀ RR¶ HÉÐÈ($øFŠ‘Óî–*C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÈÐÉH$(FøŠ‘Óî–*SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number»£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ f2f9b7ba39cf4392a25e99d136dc727f@@@@@@@@@@@@Su  3Ho there! SÀ RR· Žòüæß³V@‚2j>yØ,LC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æüò޳ß@V‚2j>yØ,LSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¼£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ 83cc01d73fdf4ac5b063ba5302807a86@@@@@@@@@@@@Su  3Hey there! SÀ RR¸ ¹°¾ƒûñG‡™O¡U}|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾°¹ûƒGñ‡™O¡U}|SrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number½£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ 223f83990ef4481d9beabc54695e8502@@@@@@@@@@@@Su  3Hi there! SÀ RR¹ pîk+—ޝH¤ÿe‡Ë(fC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+kîpŽ—H¯¤ÿe‡Ë(fSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¾£x-opt-locked-untilƒ`f¥|ÈSsÀ/ ¡ 35dc8b8c5b60474db747703d4668a79a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRº ó aŒrM³{\ßñäÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜a órŒM³{\ßñäÞSrÁ\£x-opt-enqueued-timeƒ`f¤†ý£x-opt-sequence-number¿£x-opt-locked-untilƒ`f¥}SsÀ/ ¡ c431a44d0eab43c98418cb4be7c059d0@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RR» ´Ž‰5wC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜8ÛàßgGQ¯¢k‹[>5wSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberÜ£x-opt-locked-untilƒ`f¥~}SsÀ/ ¡ 8f06d767f672423ba41e0a0a15e37568@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRØ ÐvBh7dFH¹P9tx'C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hBvÐd7HF¹P9tx'SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberÝ£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ ec8876acd49f4614a3a99998195cb99b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RRÙ qQ&·ÁÌA—V±êï«eC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜&QqÁ·AÌ—V±êï«eSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberÞ£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ c05a4478472b44f19023ee9edd18c1aa@@@@@@@@@@@@Su  3Hi there! SÀ RRÚ ìX•ÝC„ÿg[WGJÈC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ì•XCÝ„ÿg[WGJÈSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberߣx-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ a4d6f4c395964b968a2485185e3e05dc@@@@@@@@@@@@Su  3Ho there! SÀ RRÛ m&€#h:õK…‘³Ix$uC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#€&m:hKõ…‘³Ix$uSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberà£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ 82b03c260e0f4edeaf9ae40ab03dd516@@@@@@@@@@@@Su  3Hey there! SÀ RRÜ @ûrÄ¥ÑEº…Ú›Tq*C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜rû@¥ÄEѺ…Ú›Tq*SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberá£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ 04ea404508714aa7b52b8efaa95bc00a@@@@@@@@@@@@Su  3Hi there! SÀ RRÝ YA kú$K¾ÕË]3C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜k AYúK$¾ÕË]3SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberâ£x-opt-locked-untilƒ`f¥~ËSsÀ/ ¡ ffde1734f93d4c75b3590e0716508c9a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRÞ ŠOœ¤^c·C³Ýd…ôêG™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤œOŠc^C·³Ýd…ôêG™SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberã£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ 3ff7af3dcf3a492ea5033aab64364a2f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RRß @Í iLiA­Pûîß*ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ Í@LiAi­Pûîß*ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberä£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ 69a705e1b68948acb21211633cd118c1@@@@@@@@@@@@Su  3Hi there! SÀ RRà ¢;l˜êTF ƉõàhC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜l;¢ê˜FT ƉõàhSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberå£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ dbcb72ada6524654b7f3c1f77e76359e@@@@@@@@@@@@Su  3Ho there! SÀ RRá ÿ#îXÍ„L¶;.?—·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Xî#ÿÍL„¶;.?—·SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberæ£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ 2dd57e04cedc4803ae1d9f1050b112c6@@@@@@@@@@@@Su  3Hey there! SÀ RRâ —mv}ÌÕçD€'˜ÂjhùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜}vm—ÕÌDç€'˜ÂjhùSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberç£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ d57e665a1b764308a94ff259425fb7be@@@@@@@@@@@@Su  3Hi there! SÀ RRã ÕTC'Y%O{‚.IC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜CTÕY'O%{‚.ISrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberè£x-opt-locked-untilƒ`f¥)SsÀ/ ¡ 04bf17b9d74c47fba115df742179ab36@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRä ¡z^x[©G»ÙDvüÃ×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^z¡[xG©»ÙDvüÃ×SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberé£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ c9ccc81ffdb94fc8aac261053214162e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RRå Õ±Yâø5è@  Û)äìvC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜âY±Õ5ø@è  Û)äìvSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberê£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ 766c71a41ac649a4834a180faa578670@@@@@@@@@@@@Su  3Hi there! SÀ RRæ vîyñÕã±NŽ×" Þ’ùåC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ñyîvãÕN±Ž×" Þ’ùåSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberë£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ e78849aa93e9402bb5954364fc97bd1a@@@@@@@@@@@@Su  3Ho there! SÀ RRç ż0Žï÷5Dˆ§6&йeC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ž0¼Å÷ïD5ˆ§6&йeSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberì£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ 1c86ba96e0064b92a9ac9d138c78bc64@@@@@@@@@@@@Su  3Hey there! SÀ RRè Aä_?BêŸK™(ö¹¸½DPC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜?_äAêBKŸ™(ö¹¸½DPSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberí£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ cd77e7b7b69a474299041a3d3a2207bb@@@@@@@@@@@@Su  3Hi there! SÀ RRé c§¹æRMˆæaMB†;`C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¹§cæMRˆæaMB†;`SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberî£x-opt-locked-untilƒ`f¥—SsÀ/ ¡ 77c71356fc5f4a128a7aca008eab6124@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ RRê ïx›-°Až tÒ´‡ØLC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜›xï°-Až tÒ´‡ØLSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-numberï£x-opt-locked-untilƒ`f¥ôSsÀ/ ¡ 6c0850b4da2f4b02ba02c07eba55dc81@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ RRë ^ÅM´…¿5G¼²öƒÕ:žEÿêv^Eš¨|">KH¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿE>(vêE^š¨|">KH¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥LSsÀ/ ¡ dea138aa54634b06860267b951ff6599@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ˜AåkiUN¨EÒ†í¥+KC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜kåA˜iNU¨EÒ†í¥+KSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥LSsÀ/ ¡ eb014cd8456240a1a7e3fe9cc2a7e64f@@@@@@@@@@@@Su  3Ho there! SÀ" Rp ÷>â[P‚L¶>ýäíC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜â>÷P[L‚¶>ýäíSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥LSsÀ/ ¡ ac8849ddf40e4e709282d14384d9db1d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp wМqQJŽ1“kžâhuC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜œÐwQqJŽ1“kžâhuSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥LSsÀ/ ¡ c40a9a4359fa4e6b9d924eb8c4d35ff9@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ÿŠ_»ôŽK¢°*)g™üC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜_Šÿô»KŽ¢°*)g™üSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥LSsÀ/ ¡ c87f99e59a1049b7884fcc8896b79598@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ˜ù‡¶Ù[F–šU|Ræû¯C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¶‡ù˜ÙF[–šU|Ræû¯SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 151464175be14d0f913333c80290c835@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp  ¹?v tKª· ¨Ø'C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜v?¹ Ktª· ¨Ø'SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 9b1e8380ef0945819259c394ba148c2a@@@@@@@@@@@@Su  3Hi there! SÀ" Rp  ÇßN·nM¾àìÍ¥¿C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜NßÇn·M¾àìÍ¥¿SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 961f656b9cf74b4286c97c28e6c154c5@@@@@@@@@@@@Su  3Ho there! SÀ" Rp   IïJ¦-í9RC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜I Jï¦-í9RSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 8459fc5229c649f7a664317b9ae4bc99@@@@@@@@@@@@Su  3Hey there! SÀ" Rp  •æi¬M\A“¿¯PmØ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¬iæ•MA\“¿¯PmØ SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ 32adb445e6084c679ef20f2c7ee4da5e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp  ÉPJ1í(Nµœôu ?ÖC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜1JPÉíN(µœôu ?ÖSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥šSsÀ/ ¡ abea8e376646410c86fecc7f8745a914@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp —Kf&™F¹bOÔÈÍC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K—&fF™¹bOÔÈÍSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ 4b5b952fb58c4e65aaec3a7ddbdeea2c@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp žÙ}h|ßH‚L{ lÓ–C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h}Ùž|Hß‚L{ lÓ–SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ 92b692e0e3524b58a8abc53a06088f8a@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ÛÐB@ûÑF£Ìª*>šú4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜BÐÛû@Fѣ̪*>šú4SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ e5f5b3364f4840679660874202ce0320@@@@@@@@@@@@Su  3Ho there! SÀ" Rp Ïj$ÇÁH´R¬DHˆ³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jÏÇ$HÁ´R¬DHˆ³SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ cd93fefa73124756b6841cf3e193ebd4@@@@@@@@@@@@Su  3Hey there! SÀ" Rp æH"«OÀK¾Ÿ²§MðñC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜"HæO«KÀ¾Ÿ²§MðñSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ 0c6238724eae4cf5908523888ffe6264@@@@@@@@@@@@Su  3Hi there! SÀ" Rp Ô÷PœËã²CúoÁ«rtC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜œP÷ÔãËC²úoÁ«rtSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥èSsÀ/ ¡ 08ccb57caa0a475591595e89e4a66ba7@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ˜NñáÒ/ÇF³/È*E·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜áñN˜/ÒFdz/È*E·SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ f07d366fe1bf4fec9acf4b70d32d13aa@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp E' ë\&¯A¤¥vàk°AC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ë 'E&\A¯¤¥vàk°ASrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ b2ed3517511543f8826dec4d97254249@@@@@@@@@@@@Su  3Hi there! SÀ" Rp Þg«š‡N—ƒxÆ‹ì]éC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜gÞš«N‡—ƒxÆ‹ì]éSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ dc0083cb929344ae9dcc9c52c0f2df3a@@@@@@@@@@@@Su  3Ho there! SÀ" Rp Êììæñ"=N°UN%“ú×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜æììÊ"ñN=°UN%“ú×SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ 2f6af03ee0394084be75c76ec1ee6b3d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp Ì– h2ÔI„ämDd?õ1C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ –Ì2hIÔ„ämDd?õ1SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ 627c75139b7e4f628446c0a405ee5f5c@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ö1¥¯ yKD…ÑÖBC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯¥1ö KyD…ÑÖBSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚FSsÀ/ ¡ df9ba16bb75d494382e8a533a662d7c8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp %1dÏ”ë@M³˜PU¨üüZC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ïd1%ë”M@³˜PU¨üüZSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ 5e9a0c738d774345a8872bd53eed9c51@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp gAÔåìŠäK¶œCA1!m-C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åÔAgŠìKä¶œCA1!m-SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number £x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ 15f84acd8fd84166ae7d226a4aca16a9@@@@@@@@@@@@Su  3Hi there! SÀ" Rp L˜˜ˆ4úL³dE]CQûC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ˆ˜˜L4Lú³dE]CQûSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number!£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ d5b5ae82c2b64e4f89bf0da59e375667@@@@@@@@@@@@Su  3Ho there! SÀ" Rp €‰t:¹f@ˆÀ Þe§ëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:t‰€¹@fˆÀ Þe§ëSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number"£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ 7f52ad7e42c54cc58db96bb72f23b187@@@@@@@@@@@@Su  3Hey there! SÀ" Rp £c.â%±K„.÷kv‰ >C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜â.c£%K±„.÷kv‰ >SrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number#£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ 0615a6e6574e435a96e53a7f0dd93c51@@@@@@@@@@@@Su  3Hi there! SÀ" Rp |»Ð<´µ£F—È|‘`6‹ÐC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜<л|µ´F£—È|‘`6‹ÐSrÁ\£x-opt-enqueued-timeƒ`f¤‡ £x-opt-sequence-number$£x-opt-locked-untilƒ`f¥‚”SsÀ/ ¡ e3e1af49000c4e35b17129e6b8616646@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  û†eò=]M¨)Óº¶õC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜e†û=òM]¨)Óº¶õSrÁ\£x-opt-enqueued-timeƒ`f¤‡£x-opt-sequence-number%£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 650ea52bdd2249c39578d9709f6c9b73@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp! \M7¤õO¦±$†gû C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜M\¤7Oõ¦±$†gû SrÁ\£x-opt-enqueued-timeƒ`f¤‡£x-opt-sequence-number&£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ c327a03fd378488897b0197035e7d883@@@@@@@@@@@@Su  3Hi there! SÀ" Rp" ÂòÇWzH³ª³2U #%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÇòÂzWH³ª³2U #%SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number'£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 6b7f1d241bb347eaa96ea2059b1fa48d@@@@@@@@@@@@Su  3Ho there! SÀ" Rp# ¡ˆè¢°OœÔOgKDÌC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜èˆ¡¢O°œÔOgKDÌSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number(£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 018ce47e79c7431caecfecaf9cbf6a88@@@@@@@@@@@@Su  3Hey there! SÀ" Rp$ €í ½qE‘(Ò'¾1C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ í€q½E‘(Ò'¾1SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number)£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 22aa9820b5054e2e9de9247a9ed8de0e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp% SÑÿ¸`‡O¸“3]ðiÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿÑS`¸O‡¸“3]ðiÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number*£x-opt-locked-untilƒ`f¥‚âSsÀ/ ¡ 46c9365259714adeb8ebb862ab108062@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp& U‰KL{”Cˆ÷þýõ¡çWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K‰U{LC”ˆ÷þýõ¡çWSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number+£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ f343508c9e0f4bf08977b3ef3a232382@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp' È [}ÂÛŸCžØ@=CùÖÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜}[ ÈÛÂCŸžØ@=CùÖÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number,£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ 3a7b3d48c9e7440185139e486234c19a@@@@@@@@@@@@Su  3Hi there! SÀ" Rp( …d =K{&B”8ˆ,æ ÍC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜= d…{KB&”8ˆ,æ ÍSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number-£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ 106f2f4993e74d54bf59662c7086b5bb@@@@@@@@@@@@Su  3Ho there! SÀ" Rp) lö6ØŽ™H¥¥÷ŸºÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜6ölŽØH™¥¥÷ŸºÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number.£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ d5957aa44c174389b812be4c5852e290@@@@@@@@@@@@Su  3Hey there! SÀ" Rp* ~-.ó‚~\K’^æ¨Ù¾ÌC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ó.-~~‚K\’^æ¨Ù¾ÌSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number/£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ 87c2499d7c3c40bdbafaaed8cc763869@@@@@@@@@@@@Su  3Hi there! SÀ" Rp+ pƺã{oLˆ$Ôµ'µY´C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ºÆp{ãLoˆ$Ôµ'µY´SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number0£x-opt-locked-untilƒ`f¥ƒ@SsÀ/ ¡ c826ccdcfe2945aeb0669569698deae1@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp, Pmxôd 5O¼4”{«“ÅrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ôxmP dO5¼4”{«“ÅrSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number1£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ a25dfb3bc65345bfbb110f89aca1b441@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp- DBOž‡—HŠB;CÛ&ÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜OBD‡žH—ŠB;CÛ&ÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number2£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ 483083f747904824b60d599536786ae1@@@@@@@@@@@@Su  3Hi there! SÀ" Rp. 3 ›…1äF²\ÌŠÓ4zC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜…› 3ä1F²\ÌŠÓ4zSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number3£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ d71dc11cff7c426db020b714b2a3616f@@@@@@@@@@@@Su  3Ho there! SÀ" Rp/ ëcIp–ÔA„yÞëPâ©C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Icë–pAÔ„yÞëPâ©SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number4£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ ba20998dbf164c31b6b353889c222f08@@@@@@@@@@@@Su  3Hey there! SÀ" Rp0 V‚ÜÕ3K@‚m¼uÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ü‚V3Õ@K‚m¼uÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number5£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ 35894c5eb4b84f108867b8243669cc18@@@@@@@@@@@@Su  3Hi there! SÀ" Rp1 m iÅæL€ñpÌÖnC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Åi mLæ€ñpÌÖnSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number6£x-opt-locked-untilƒ`f¥ƒŽSsÀ/ ¡ 7a555fd372734b53a7b0faacbb6544af@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp2 t™ÚvN¦JK™Æ·ÏMC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ú™tvN¦JK™Æ·ÏMSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number7£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ 11737e5254f246b1bc8297abedc71e03@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp3 Ó.Ód-íE¾UˆÚH/1øC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ó.Ó-dEí¾UˆÚH/1øSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number8£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ 1c45c1db59f04560b6e373b5b3f48508@@@@@@@@@@@@Su  3Hi there! SÀ" Rp4 ¾I›½üq«N·à ˜æòí“C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜½›I¾qüN«·à ˜æòí“SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number9£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ a3eb3e3b59684f2ba88d337d9225a03a@@@@@@@@@@@@Su  3Ho there! SÀ" Rp5 $µÑ·Ÿ¸N€#ËäLQ`C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ñµ$Ÿ·N¸€#ËäLQ`SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number:£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ c313e4076d294fccb3117906cbccb8a6@@@@@@@@@@@@Su  3Hey there! SÀ" Rp6 †y„¼†4F°áÇa†z=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜„y††¼F4°áÇa†z=SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number;£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ 7b865139ae6548448cb832b4953674cb@@@@@@@@@@@@Su  3Hi there! SÀ" Rp7  â’j±rI¢^\¾ì¸[BC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜’â ±jIr¢^\¾ì¸[BSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number<£x-opt-locked-untilƒ`f¥ƒìSsÀ/ ¡ 0671cc17f07c4328a757560a6b858763@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp8 «Þj DO‚Ú…¦Kœ¿C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jÞ«D O‚Ú…¦Kœ¿SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number=£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 2c2434caad7d47edb11e852802e77742@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp9 ƒ=­¼ÛIŽZt`ÄuC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜­=ƒ¼IÛŽZt`ÄuSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number>£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ bf2dbf4e445f4b70a8fd21940a65e3a6@@@@@@@@@@@@Su  3Hi there! SÀ" Rp: B{°Ì¨B‰®ÔäíëˆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°{BÂÌB¨‰®ÔäíëˆSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number?£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 1af95c6d049240e7b66ef00714af278e@@@@@@@@@@@@Su  3Ho there! SÀ" Rp;  h†ú¯ÓÄB–üîæ¿§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ú†h Ó¯BÄ–üîæ¿§SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number@£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 1005ddc503f84f4aaf702adf6ca4008f@@@@@@@@@@@@Su  3Hey there! SÀ" Rp< Î2—{p~5J€}šðŽ›jC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{—2Î~pJ5€}šðŽ›jSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberA£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 9bb2253398f64adea274b0114dfdc9a8@@@@@@@@@@@@Su  3Hi there! SÀ" Rp= æ=§ƒVL£³í"]4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜=惧LV£³í"]4SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberB£x-opt-locked-untilƒ`f¥„:SsÀ/ ¡ 602a8df4231a4ba5aa48625a66b8faa8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp> ÂlÎu½Ë¬A‡¯9c2ñîC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜uÎlÂ˽A¬‡¯9c2ñîSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberC£x-opt-locked-untilƒ`f¥„˜SsÀ/ ¡ 2d64836fbe984dee935428c18808bea6@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp? Qàe—†dpJ“4«_S‚¤ÁC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜eA2ÑÖDk»G>‚¤ÁSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberM£x-opt-locked-untilƒ`f¥„æSsÀ/ ¡ 92605924b77c4480b8d69f02601ef993@@@@@@@@@@@@Su  3Hi there! SÀ" RpI ñ‹Ü‰£5F…tîý^'[C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ü‹ñ£‰F5…tîý^'[SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberN£x-opt-locked-untilƒ`f¥„æSsÀ/ ¡ bbb047a607ad467fbd6e34f2462b869d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpJ T|dWÞþI»’0…RA§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Wd|TÞIþ»’0…RA§SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberO£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ ddc11f78ab6a409897b40d06d5e7262b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpK ^¹ ‡ªN‹M¬a#¿³úC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ¹^‡Nª‹M¬a#¿³úSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberP£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ 648de61a7b0d4dcea04b0ed877278e39@@@@@@@@@@@@Su  3Hi there! SÀ" RpL _ª Í­ÛÑC¯´ïZ¡ï;C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Í ª_Û­Cѯ´ïZ¡ï;SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberQ£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ f9adbd21c34946ee8a3984b2e32e211f@@@@@@@@@@@@Su  3Ho there! SÀ" RpM LY}=Ó*†M³(}³&Fá^C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜=}YL*ÓM†³(}³&Fá^SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberR£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ 8339b72a2ac6455abc3370f9c92162ce@@@@@@@@@@@@Su  3Hey there! SÀ" RpN .ÓWŽHÑvC­g ìç3,C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ŽWÓ.ÑHCv­g ìç3,SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberS£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ ce2f274feaec4f70b91d09eed3bddd19@@@@@@@@@@@@Su  3Hi there! SÀ" RpO š>NåÚÁC‚—ª[À¸›/C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜N>šÚåCÁ‚—ª[À¸›/SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberT£x-opt-locked-untilƒ`f¥…DSsÀ/ ¡ 653527ab84044d13a427e1baca67f3c0@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpP ¼å.MÏeF¾)•çr:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜M.å¼eÏF¾)•çr:SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ 519abdb61d7f420ba2f36e39bb3db0ef@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpQ Åx9|FRsG™Ï³xÓ¤C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜|9xÅRFGs™Ï³xÓ¤SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberV£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ fb5a0884a8c6441ea51718e0a661aaa0@@@@@@@@@@@@Su  3Hi there! SÀ" RpR r˜ÂÑH,°L¥ª–*xæiC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ñ˜r,HL°¥ª–*xæiSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberW£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ 07f8fb16fddd49c4b3c8f7c1ab22ade4@@@@@@@@@@@@Su  3Ho there! SÀ" RpS e³u­;*ºMŒƒæ9ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜­u³e*;MºŒƒæ9ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberX£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ 650f6d81885e4cdabb4b592e0646d34b@@@@@@@@@@@@Su  3Hey there! SÀ" RpT džI:?KŠï«ìÈâ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜I†Ç:K?Šï«ìÈâ SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberY£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ 75207c55e09f4beaa8c28a706ec232de@@@@@@@@@@@@Su  3Hi there! SÀ" RpU ôí® ìC­>'xbT C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜íô ®Cì­>'xbT SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberZ£x-opt-locked-untilƒ`f¥…¡SsÀ/ ¡ c47b6a35cc134e658f12aa37d88df884@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpV –¼‚ªÈÐB’lß_Ê~C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚¼–ȪBÐ’lß_Ê~SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number[£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ ebafb73a5f7e4ac4a1d51b30d17838c1@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpW ñ3ÀùÖËM²Ä} ¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜À3ñÖùM˲Ä} ¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number\£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ dafd5e6d798445819eed719630728f49@@@@@@@@@@@@Su  3Hi there! SÀ" RpX mÜmYYäD…Ã9×à¾?C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜YmÜmYDä…Ã9×à¾?SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number]£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ 9a476888f07c435eada3ab1fbc28f785@@@@@@@@@@@@Su  3Ho there! SÀ" RpY 0S³h%iH¥0¶Y´´ç…C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h³S0i%H¥0¶Y´´ç…SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number^£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ fb7ebd9baa234a43a3e57fc21ed19bf6@@@@@@@@@@@@Su  3Hey there! SÀ" RpZ ²ÂÞ©q@ºh%@trC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜²©Þ@qºh%@trSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number_£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ c56111cdf1914729b9b4d1d40a91100e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp[ ØÊ>"møC°îíǯmbC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜">ÊØmCø°îíǯmbSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number`£x-opt-locked-untilƒ`f¥…ðSsÀ/ ¡ 0482790c38bf4833b12b2964cefb8cd4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp\ H‚Îà0¾›H·â©”g j¡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜à΂H¾0H›·â©”g j¡SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbera£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ 2b4dbc3d4d0b4127a844cdb834072149@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp] ï@Ì=Ì»AŸˆv•}šAC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜=Ì@ïÌA»Ÿˆv•}šASrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberb£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ 91b6a4d551314d358d9f1a2fc9ead8cd@@@@@@@@@@@@Su  3Hi there! SÀ" Rp^ u a-¤:ñH¼‚yƒ±/7QC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜-a u:¤Hñ¼‚yƒ±/7QSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberc£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ 5bb798a0f56f407fb32f4aced9ab7b6b@@@@@@@@@@@@Su  3Ho there! SÀ" Rp_ @þA¾> H²âpʱÚ4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾Aþ@>H ²âpʱÚ4SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberd£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ 7e4da77629734338b421821736db8ccd@@@@@@@@@@@@Su  3Hey there! SÀ" Rp` ÿÝXIÌÐÅIŽe+™ÞùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜IXÝÿÐÌIÅŽe+™ÞùSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbere£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ ede20d5ad1e347599325619172beac8f@@@@@@@@@@@@Su  3Hi there! SÀ" Rpa Þ±l@‰è}M‹Ëòïkt@BC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@l±Þè‰M}‹Ëòïkt@BSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberf£x-opt-locked-untilƒ`f¥†MSsÀ/ ¡ a80a2c36a07d458e8bdfc5018418cc24@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpb Öÿ˜ÃíSO Í1H}C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜˜ÿÖíÃOS Í1H}SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberg£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ 4492376ecb1648efb9ee4b6893453099@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpc ¬Ìžú!ÔIµ©€“{˜²ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜žÌ¬!úIÔµ©€“{˜²ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberh£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ 3e1c68767862407e9a9e9d3870aa12f5@@@@@@@@@@@@Su  3Hi there! SÀ" Rpd Ã}4€îÀØE©D?Lš¶C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜€4}ÃÀîEØ©D?Lš¶SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberi£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ 68f57d9977eb4f8f8d65e0abea2fcaa6@@@@@@@@@@@@Su  3Ho there! SÀ" Rpe 7<—h¯»ÌH‹õ…äJëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h—<7»¯HÌ‹õ…äJëSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberj£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ c9aa539506a641d592f0f1692a6c4ac0@@@@@@@@@@@@Su  3Hey there! SÀ" Rpf MÙcÀƒþ§I¯Oò`˜Ø1C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÀcÙMþƒI§¯Oò`˜Ø1SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberk£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ d9c2ab8cf4f64518a275db31095e8c42@@@@@@@@@@@@Su  3Hi there! SÀ" Rpg û¬Ëÿ8:Lšïû—xC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ë¬û8ÿL:šïû—xSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberl£x-opt-locked-untilƒ`f¥†›SsÀ/ ¡ 5fe0bd2523664c5f87390a60a16e5080@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rph -”tCnÿNƒD õr-C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ct”-ÿnNƒD õr-SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberm£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ d577786be88e41c5bdb5ec6421544710@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpi  ¤¦ôþKG—[–…ß­ÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¦¤ þôGK—[–…ß­ÔSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbern£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ b893ca6baec74cafbf9d3889e8aa2509@@@@@@@@@@@@Su  3Hi there! SÀ" Rpj NCš8BüÙJ±?b±`yÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜8šCNüBJÙ±?b±`yÕSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbero£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ 426e348bd0b442b6aaf28349ec32488f@@@@@@@@@@@@Su  3Ho there! SÀ" Rpk YûÖwüÆêH¯pk¨›‰C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜wÖûYÆüHê¯pk¨›‰SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberp£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ aec5bbec59a64cabb871323b79fc912c@@@@@@@@@@@@Su  3Hey there! SÀ" Rpl ­a›cݸMˆ¹IÍ×lªC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜›a­ÝcM¸ˆ¹IÍ×lªSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberq£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ 6cf1d22a20cb44718704f632b663f760@@@@@@@@@@@@Su  3Hi there! SÀ" Rpm ÇB£>*7)K½ÌwlYC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>£BÇ7*K)½ÌwlYSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberr£x-opt-locked-untilƒ`f¥†êSsÀ/ ¡ 6d9988e933b34965bb6d4247fa5ac1c2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpn ¼0 ÄE|»Kž—¿è\¾0C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ä 0¼|EK»ž—¿è\¾0SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbers£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ cae36d3818a94ca0a12e5b9e4a9a1e73@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpo ä^•‹:ÙàN¨­Qà.ODÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‹•^äÙ:NਭQà.ODÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbert£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ a08aafd79c2745608b67419d0f9a842e@@@@@@@@@@@@Su  3Hi there! SÀ" Rpp ·èû ‘ñNm<uDêC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ûè·‘ Nñm<uDêSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberu£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ 6cc28418df78436faf166b756a90141c@@@@@@@@@@@@Su  3Ho there! SÀ" Rpq Ó¯¬sœ Mƒ›,¿9gÀ†C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¬¯ÓœsM ƒ›,¿9gÀ†SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberv£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ f1d50cdb4cdf46479dc40a37b95a1ad6@@@@@@@@@@@@Su  3Hey there! SÀ" Rpr …Ð?0EbkO¼âoNH©C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜0?Ð…bEOk¼âoNH©SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberw£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ edfea29f7c354106a353e2c20f55c4ca@@@@@@@@@@@@Su  3Hi there! SÀ" Rps ÏcÎ××1CƒdH²ÊÏÂC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜×ÎcÏ×C1ƒdH²ÊÏÂSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberx£x-opt-locked-untilƒ`f¥‡•SsÀ/ ¡ 31d831e3d1814f03be9903e7dbe8f86c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpt þÄOh>‹ìIšÁ¼Ø@>åC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hOÄþ‹>IìšÁ¼Ø@>åSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numbery£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 486b9a77939c46f4bcf89994c5bd520e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpu ”æ‹MF..M©ÆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”æM‹F..M©ÆSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-numberz£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 0969feee786c43aca37b2f0ec735d761@@@@@@@@@@@@Su  3Hi there! SÀ" Rpv ƒå:êú¤ E‰ÛŒË$qaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ê:僤úE ‰ÛŒË$qaSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number{£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 711e988fc2504fa5a52159c33f591804@@@@@@@@@@@@Su  3Ho there! SÀ" Rpw Ì*y‰•ŒUGˆî“SÖƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰y*ÌŒ•GUˆî“SÖƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number|£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ a693da10927c42478b528f385ccfd083@@@@@@@@@@@@Su  3Hey there! SÀ" Rpx Ñ„^!cCÄJºmG^ÃŽQ\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜!^„ÑCcJĺmG^ÃŽQ\SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number}£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 7af0c7c0d9ff48a1b7c95523cd35f4f0@@@@@@@@@@@@Su  3Hi there! SÀ" Rpy ÈkO1øK·o?Ž5vy‰C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜1OkÈKø·o?Ž5vy‰SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number~£x-opt-locked-untilƒ`f¥‡äSsÀ/ ¡ 680826af446243f89f9841b77509b6cb@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpz ƹ  5¦OŠzvC`6hC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ¹Æ5 O¦ŠzvC`6hSrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ 57cf557907214318883c9d73dd09598b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp{ ¤ÈÚ߸§»IžôPQÍÔy(C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ßÚȤ§¸I»žôPQÍÔy(SrÁ\£x-opt-enqueued-timeƒ`f¤‡+£x-opt-sequence-number€£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ 136ebcc72ced4412b4f84d2071498789@@@@@@@@@@@@Su  3Hi there! SÀ" Rp| ±žðU+FŠá†ÿ¯ÐCC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ðž±UF+Šá†ÿ¯ÐCSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ 6eaea7033c214f80a651e3b7defc4f83@@@@@@@@@@@@Su  3Ho there! SÀ" Rp} ÷8·ž>¬I¸ö¤¶§ÕgøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ž·8÷>I¬¸ö¤¶§ÕgøSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‚£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ b5cfe961723849318a07efdf536ec915@@@@@@@@@@@@Su  3Hey there! SÀ" Rp~ /p[W? K³ÄzÏ$^·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜[p/?WK ³ÄzÏ$^·SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberƒ£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ aed7595d2ce04c6e84c9f4b54154a1f7@@@@@@@@@@@@Su  3Hi there! SÀ" Rp #V˜„)O€8O2á÷C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜V#„˜O)€8O2á÷SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number„£x-opt-locked-untilƒ`f¥ˆ2SsÀ/ ¡ adc378acd37b4865b4043cccb49afcbf@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp€ FÓ}„ULLƒü¬­79C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜„}ÓFULLƒü¬­79SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number…£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ bfa9c37793954385bf685eb3e62e8dd1@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ÛÛ4\õLº¤­9–öºC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4ÛÛ\Lõº¤­9–öºSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number†£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ 69932e0b86b745799a607d88d3af732f@@@@@@@@@@@@Su  3Hi there! SÀ" Rp‚ „âJ—•ÝA¹98ž~~²µC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Jâ„•—Aݹ98ž~~²µSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‡£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ 39413c18102743658efe4351725c536d@@@@@@@@@@@@Su  3Ho there! SÀ" Rpƒ õ!N[;´G˜´à3üå¶,C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜N!õ;[G´˜´à3üå¶,SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberˆ£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ 4211d7eac992432c8d659e8dab039161@@@@@@@@@@@@Su  3Hey there! SÀ" Rp„ Ã4[Ïá+L¤c —OåR³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜[4ÃáÏL+¤c —OåR³SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‰£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ e0ac40ff8b764ca28024d8b6f4b3a39f@@@@@@@@@@@@Su  3Hi there! SÀ" Rp… Á×ÍÂØ+E¿÷5&ë1zC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÂÍ×ÁØE+¿÷5&ë1zSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberŠ£x-opt-locked-untilƒ`f¥ˆ€SsÀ/ ¡ 18d645d90b7e4527857c0106a25a009d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp† Ê0@KÃîþF©I TÓ€Q|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K@0ÊîÃFþ©I TÓ€Q|SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‹£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ 148c1ceb97b346d094f7ed6ff416a11a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp‡ ººÞð$©B…›m)`ä>“C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ðÞºº©$B…›m)`ä>“SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberŒ£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ 21e60487af14473cbd6ec54459cbbef4@@@@@@@@@@@@Su  3Hi there! SÀ" Rpˆ ØrcÂ}×Fˆ”`7r-ÖÇC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜crØ}ÂF׈”`7r-ÖÇSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ f23f39da000f46a0a8cb69abb87bc729@@@@@@@@@@@@Su  3Ho there! SÀ" Rp‰ ̽<Ù먩EºdòSÈZ˜LC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ù<½Ì¨ëE©ºdòSÈZ˜LSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberŽ£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ 06dbd3d95e8246b0a306e66b1ff07d25@@@@@@@@@@@@Su  3Hey there! SÀ" RpŠ '„—\¼D§GƒÞ#Z0fëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜\—„'D¼G§ƒÞ#Z0fëSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ 90bb8fe5e8664fa5b0c171ecf2385eed@@@@@@@@@@@@Su  3Hi there! SÀ" Rp‹ óØ&à?¿I‹pÀ˜vˆæC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜à&Øó?I¿‹pÀ˜vˆæSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ˆÞSsÀ/ ¡ d01da4c17d374fad82a7c093bdb0188b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpŒ ª~ó‚Æ-”BŸl_PK‡¦~C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚ó~ª-ÆB”Ÿl_PK‡¦~SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number‘£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ 912bbebe64334dd59e52ee9fef3310ab@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp œV”W§Ðà@”b¯8meRÆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜W”VœÐ§@à”b¯8meRÆSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number’£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ ef0f9d5850ff41ca850f1138a7c438be@@@@@@@@@@@@Su  3Hi there! SÀ" RpŽ æIxâÖP@œyUâÎÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜âxIæÖ@PœyUâÎÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number“£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ a85b88afa5584862a01e01675cc04c5e@@@@@@@@@@@@Su  3Ho there! SÀ" Rp l‹×]emC´î0ò’  HC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜×‹le]Cm´î0ò’  HSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number”£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ 3986c87884d04541bc63d8028dc3c13d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp b`(ÏMÊÜN™¨9d£?ÎC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ï(`bÊMNÜ™¨9d£?ÎSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number•£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ dcdf15688112471c88dc10f29aeb47b4@@@@@@@@@@@@Su  3Hi there! SÀ" Rp‘ ?–ðÕÙ+$OŒäD°ëxëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Õð–?+ÙO$ŒäD°ëxëSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number–£x-opt-locked-untilƒ`f¥‰,SsÀ/ ¡ e028991f81dd4be2a8a72990e2c76bc2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp’ ñOaú™D„æt+|-q–C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úaOñ™D„æt+|-q–SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number—£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 30edcf484c174e88bb8ea2ae3dd2e08b@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp“ –óþhVH'”±™zuTC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þó–hHV'”±™zuTSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number˜£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 50fd3fb4123e4dfd8b5e097a22d622c4@@@@@@@@@@@@Su  3Hi there! SÀ" Rp” »ð‡cá~B³Þ/¹‰"hìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‡ð»ácB~³Þ/¹‰"hìSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number™£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ a23bce9429f046399344be85403db60b@@@@@@@@@@@@Su  3Ho there! SÀ" Rp• MŸ¢ûv×›L¼ÑoUðšC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜û¢ŸM×vL›¼ÑoUðšSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberš£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 619549b376c3477a894023b18f3fd64e@@@@@@@@@@@@Su  3Hey there! SÀ" Rp– ðÅ»± ð½D¢ÿÙxy~.)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜±»Åðð D½¢ÿÙxy~.)SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number›£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 653c7dfa638c41eea352b9ce9511b159@@@@@@@@@@@@Su  3Hi there! SÀ" Rp— „¥{…¤H¦¼ßÒFÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{¥„…H¤¦¼ßÒFÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberœ£x-opt-locked-untilƒ`f¥‰zSsÀ/ ¡ 637c73f14bc0439c82068cea85f93d7a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp˜ Õ€9én-ûL™Œp¾²7šÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜é9€Õ-nLû™Œp¾²7šÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ c6b09cdbf84e4cdda2c12398bf2066c6@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp™ [xã>‚ÚbB®=øW鿳tC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>ãx[Ú‚Bb®=øW鿳tSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberž£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 31f48b62112e46719eca4ec904841e0b@@@@@@@@@@@@Su  3Hi there! SÀ" Rpš (æ7£rMC°Æ‚ –úC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜7æ(r£CM°Æ‚ –úSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberŸ£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 38045f42127c442c9d7291d059dca2b4@@@@@@@@@@@@Su  3Ho there! SÀ" Rp› pCßüQÖJH³ØãÄPáC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜üßCpÖQHJ³ØãÄPáSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number £x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 8893b6436fd74a5699a831de8c487dda@@@@@@@@@@@@Su  3Hey there! SÀ" Rpœ ¾BzfèN„ î[®ì=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜B¾fzNè„ î[®ì=SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¡£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 8bcea1a979f646f7aeba7c90cdbbc2c6@@@@@@@@@@@@Su  3Hi there! SÀ" Rp '"Á‚˜¼F˜[ß©,õaCC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Á"'˜‚F¼˜[ß©,õaCSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¢£x-opt-locked-untilƒ`f¥‰ØSsÀ/ ¡ 1927b14318714a1b9fa7d10ca8a0b887@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpž R ÉßNˆjÓz‚C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜É RN߈jÓz‚SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number££x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 4b92b23ff9ec4d6f891e3f3c24474a6f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpŸ @«ñÿ0ïE˜×7•3Ù#"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿñ«@0Eï˜×7•3Ù#"SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¤£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 631ec385bb0e49f4a3c44c3519b33e56@@@@@@@@@@@@Su  3Hi there! SÀ" Rp  >*\ÃôgAK†›OåââgôKA†›Oåââ<SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¥£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 85a8b774051d44aabeb4569da3f7edd1@@@@@@@@@@@@Su  3Ho there! SÀ" Rp¡ Ý"n—ðzËC¢Ÿ›QϺÃQC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜—n"ÝzðCË¢Ÿ›QϺÃQSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¦£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 2259ae44561b44efb84d622f9043d438@@@@@@@@@@@@Su  3Hey there! SÀ" Rp¢ Ê}ôjåD‡*ôHLRHC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜jô}ÊDå‡*ôHLRHSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number§£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 9ce5d4c86fdf4393b91a62cc07825c0c@@@@@@@@@@@@Su  3Hi there! SÀ" Rp£ Í/ˆÐ°ßHœa¼ Õ€LC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ðˆ/Íß°Hœa¼ Õ€LSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¨£x-opt-locked-untilƒ`f¥Š&SsÀ/ ¡ 30784821025d421b99c8e97b8a679553@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¤ ±zd¾‰ŒJ¦Lõ„Xo]°C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾dz±‰JŒ¦Lõ„Xo]°SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number©£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ 67b68a0da97b4f5d90e1b26ce46c6c5d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¥ ‚ƒqýæIF‹Ç[NV4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ýqƒ‚æFI‹Ç[NV4SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberª£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ f5f0d0d0c18a4b5892b2af14a4453e1f@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¦ VP0âfquCƒ†-Ù(0C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜â0PVqfCuƒ†-Ù(0SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number«£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ f69f253ce17e45a4a4ff31c07d1dba0e@@@@@@@@@@@@Su  3Ho there! SÀ" Rp§ Yíc4ÖÐrB½!•Yüo¢VC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜4cíYÐÖBr½!•Yüo¢VSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¬£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ 2b7666a039744898a6e4bba808e8b734@@@@@@@@@@@@Su  3Hey there! SÀ" Rp¨ ØpýüŒF§ŸVÍpÒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜üýpØFŒ§ŸVÍpÒSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number­£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ 0ef38c1f0dc24359be8732f10f5d0d9b@@@@@@@@@@@@Su  3Hi there! SÀ" Rp© P%x]&b`Mž;°Q]×»[C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜]x%Pb&M`ž;°Q]×»[SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number®£x-opt-locked-untilƒ`f¥Š…SsÀ/ ¡ 26e31930d6b145c9b50ef24070ae2c2b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpª ñ/ÊX¿Ü¬HŒáiŸÇ–C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜XÊ/ñÜ¿H¬ŒáiŸÇ–SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¯£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ 32baf8efe91e4bc29ee5624c417a156d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp« ¨€:^^î¼F… ƒâ`ÙðC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^:€¨î^F¼… ƒâ`ÙðSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number°£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ d94a25f8dee4474f99f116154a2cd125@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¬ ZA[¿’'J‹®1µeðû>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¿[AZ’J'‹®1µeðû>SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number±£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ 0abb27c1131c416e83def98954d97c79@@@@@@@@@@@@Su  3Ho there! SÀ" Rp­ ˆx>ý,½C¦´ ¨Öì°úC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ý>xˆ,C½¦´ ¨Öì°úSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number²£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ 8c441228f5fe4005bf5a843d90b76c2a@@@@@@@@@@@@Su  3Hey there! SÀ" Rp® “E ¤ G3Fi‘ÀíDå‡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤ E“G F3i‘ÀíDå‡SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number³£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ c66eaf951cf84a6b80bc83133e8b925d@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¯ ð¦D3&:eNš0øI1Z‚C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜3D¦ð:&Neš0øI1Z‚SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number´£x-opt-locked-untilƒ`f¥ŠÒSsÀ/ ¡ 9cd09b92ecb642fb834e0f1520f542d1@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp° ðY¦ZrsNœ¢<¤ýoùÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¦YðrZNsœ¢<¤ýoùÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberµ£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ 19afa46b9c9a4ff48e3b6188c2369751@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp±  óåüÇÌF©~xÿ²uLC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åó ÇüFÌ©~xÿ²uLSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¶£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ 4c7f79e936c74e319912e925bdc4ac2e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp² v[A2÷J‘]!kª†ÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜A[v2J÷‘]!kª†ÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number·£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ f4ab574d1bac428a8bba691a49bb5c90@@@@@@@@@@@@Su  3Ho there! SÀ" Rp³ Ê0@`þ™.Dš.tÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜`@0Ê™þD.š.tÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¸£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ d67fb17a7a6b435a830d8c7cdd7e371b@@@@@@@@@@@@Su  3Hey there! SÀ" Rp´ 8MòˆH± ‘>å)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜M8ˆòH± ‘>å)SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¹£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ 5189e604ff2b4fe8bd691a6edbcdf631@@@@@@@@@@@@Su  3Hi there! SÀ" Rpµ A\5 à¹G²Ì‹RrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5\Aà G¹²Ì‹RrSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberº£x-opt-locked-untilƒ`f¥‹ SsÀ/ ¡ 787c735ed44b47ba93b65cf28f052ccd@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¶ Œtx8ÞýB¤Šs™ñ¶ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜8xtŒýÞB¤Šs™ñ¶ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number»£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ 53645a6c3065425e9cf7e282f9fc9634@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp·  Éÿ±O¡ ºUr1ˆ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÿÉ O±¡ ºUr1ˆ SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¼£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ 25aa4e15f8d24a5d92498d2f4ec513c3@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¸ ¡šã¥LJ¶÷+ÿó¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãš¡L¥J¶÷+ÿó¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number½£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ acfa03ecfeec464cb3c39e2106c6a0fb@@@@@@@@@@@@Su  3Ho there! SÀ" Rp¹ » Æ„žgL£ |È‘©dC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Æ »ž„Lg£ |È‘©dSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¾£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ 7fc686d892a549ac99138901391ab851@@@@@@@@@@@@Su  3Hey there! SÀ" Rpº Ù'‘K0xÜJŒ÷”g°k{C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜K‘'Ùx0JÜŒ÷”g°k{SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number¿£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ 2211601696ee43b7ba46d44ef2791ab6@@@@@@@@@@@@Su  3Hi there! SÀ" Rp» Ë£!IÔºC­E3 úk²·C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜!£ËÔICº­E3 úk²·SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÀ£x-opt-locked-untilƒ`f¥‹~SsÀ/ ¡ c24f9c84dfac45dfbfa7d75f497d517a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¼ ×ç¾PEDÂ=‘‘ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾ç×PDEÂ=‘‘ SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÁ£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 6e0a51c71312468bbbd6a5a8ed86d62e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp½ åüCAáCˆÒ yxlC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ACüåCáˆÒ yxlSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 112333264d3a4102b19a6b1ca6fbcd3b@@@@@@@@@@@@Su  3Hi there! SÀ" Rp¾ UÒº‰ÛC­¡÷AWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰ºÒUÛC­¡÷AWSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberãx-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 8173360d7e594832aa4cb1fb7c20dedc@@@@@@@@@@@@Su  3Ho there! SÀ" Rp¿ Sé߈o£OŠ@Œ¹BÕ¨|C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ˆßéSoO£Š@Œ¹BÕ¨|SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÄ£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 114d1167ce3f420c9e2f26174d2db230@@@@@@@@@@@@Su  3Hey there! SÀ" RpÀ š³~üI+B›¿rìaÒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ü~³šIB+›¿rìaÒSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÅ£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 434eddca7b8342b9b54bb9bc41283095@@@@@@@@@@@@Su  3Hi there! SÀ" RpÁ uëÎvðE¨B˦r†;C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÎëuvEð¨B˦r†;SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÆ£x-opt-locked-untilƒ`f¥‹ÌSsÀ/ ¡ 37941aefbb0d4e289d610d722f6471e8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ÛPzúãi@¬éž‡ºÙ9ŒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úzPÛã@i¬éž‡ºÙ9ŒSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÇ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ 7ff35f4f34f04777861116499a408cdb@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpà" ©*¤†GŽÉKlŸ¨C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜© "¤*G†ŽÉKlŸ¨SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÈ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ 3b19c8f8e747458fa1ec3f697d842945@@@@@@@@@@@@Su  3Hi there! SÀ" RpÄ ºØjÅ;o€M‡ødãÝ—C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Åjغo;M€‡ødãÝ—SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÉ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ e2bfc1f634214a029f8aba5ac6645153@@@@@@@@@@@@Su  3Ho there! SÀ" RpÅ ¯ì ·cSO²Zá¥>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ì¯c·OS²Zá¥>SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÊ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ e908ef6c4376446f82a6446e81701321@@@@@@@@@@@@Su  3Hey there! SÀ" RpÆ  .ƒöˆÂO–ÿIvý+©C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ƒ. ˆöO–ÿIvý+©SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberË£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ c05fde47fa2747f0a56882cabf9e384a@@@@@@@@@@@@Su  3Hi there! SÀ" RpÇ èšj*suC¹øtÂ÷ª½UC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*jšèsCu¹øtÂ÷ª½USrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÌ£x-opt-locked-untilƒ`f¥Œ*SsÀ/ ¡ e43145ae5de74b029c05e4089b085e3d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÈ "TÖÛ-ïnM=šÁÓ”C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÛÖT"ï-Mn=šÁÓ”SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÍ£x-opt-locked-untilƒ`f¥ŒxSsÀ/ ¡ 8e58134ca46047d49dfaefe4b46c3a82@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÉ )·»G°~äK¢¬v±O|gC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜G»·)~°K䢬v±O|gSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberΣx-opt-locked-untilƒ`f¥ŒxSsÀ/ ¡ cf4b2bad521341e783e03118778c946e@@@@@@@@@@@@Su  3Hi there! SÀ" RpÊ çÖ¬í{N’SóºIã% C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¬ÖçíN{’SóºIã% SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÏ£x-opt-locked-untilƒ`f¥ŒxSsÀ/ ¡ a5ddaee4d0de4fb582258e6cccc829af@@@@@@@@@@@@Su  3Ho there! SÀ" RpË Š+) B´·©ëÖóC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+Š )B´·©ëÖóSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberУx-opt-locked-untilƒ`f¥ŒxSsÀ/ ¡ 86901e68368543c59ae709c82877ec2f@@@@@@@@@@@@Su  3Hey there! SÀ" RpÌ ÌÞ"¿<¶õG‘d7*YÒÎ.C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¿"Þ̶DŽVýÿ8ÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:Îë—KD>ŽVýÿ8ÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-number×£x-opt-locked-untilƒ`f¥ŒÆSsÀ/ ¡ 5faa1af76e394104bd5da79b0ef870cf@@@@@@@@@@@@Su  3Hi there! SÀ" RpÓ kTå Ï2F¥Ó|ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ åTkÏF2¥Ó|ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberØ£x-opt-locked-untilƒ`f¥ŒÆSsÀ/ ¡ d0ee55e08dc74998969f3714a68927dd@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÔ e^_þí%èDƒlûä¿9tC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þ_^e%íDèƒlûä¿9tSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÙ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ f714c31c7aba4896ad2349d8438c50dc@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÕ {¸ºäg|E·}¬åV&WÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜º¸{gäE|·}¬åV&WÞSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÚ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ d6c759f332d3400c82188804f8e5342e@@@@@@@@@@@@Su  3Hi there! SÀ" RpÖ ä«°y ÛµK¾¹TPQ.C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜y°«äÛ Kµ¾¹TPQ.SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÛ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 0ba4ac26561948ebbfdb2563704374c1@@@@@@@@@@@@Su  3Ho there! SÀ" Rp× lÕ2qþºÊD³E"G3¹LC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜q2ÕlºþDʳE"G3¹LSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÜ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 75e0d1c552cd4d6da23f92c3d712b94b@@@@@@@@@@@@Su  3Hey there! SÀ" RpØ 2Ord—øE‹ i‡ñLKÙC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜rO2—dEø‹ i‡ñLKÙSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÝ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 91bbd851652d42088ff7c7eb4f32879a@@@@@@@@@@@@Su  3Hi there! SÀ" RpÙ ¯5‡€JB O±Í‘Ñt›fC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜€‡5¯BJO ±Í‘Ñt›fSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberÞ£x-opt-locked-untilƒ`f¥$SsÀ/ ¡ 9aee763ce29040f19a222a9c0f19892a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÚ  $YÙì}Aš¹î÷ϪC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Y$ ìÙA}š¹î÷ϪSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberߣx-opt-locked-untilƒ`f¥rSsÀ/ ¡ 36e8111bd0554634a345071a49be9236@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÛ T²÷Þ]L«TgÊ{à=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜÷²TÞL]«TgÊ{à=SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberà£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ 6451dcc418404ed28a2bb7c57ecf350d@@@@@@@@@@@@Su  3Hi there! SÀ" RpÜ ‡DÉ‚¶‚eL¡`:ÁAÑ8•C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚ÉD‡‚¶Le¡`:ÁAÑ8•SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberá£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ a83ca419440a4a26bb2629e3c47a1817@@@@@@@@@@@@Su  3Ho there! SÀ" RpÝ ò&êRͺIŸÒ?%xC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Rê&òÍIºŸÒ?%xSrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberâ£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ 91d0d9bb627143ec984eda4c6a1cd97f@@@@@@@@@@@@Su  3Hey there! SÀ" RpÞ › Ddpƒ5MÔR˜­:£yC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜dD ›ƒpM5ÔR˜­:£ySrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberã£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ 9543e09285ee40a6b069f5f238d570ff@@@@@@@@@@@@Su  3Hi there! SÀ" Rpß „¿ÒL[Oš%ˆCêøq}C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ò¿„[LOš%ˆCêøq}SrÁ\£x-opt-enqueued-timeƒ`f¤‡;£x-opt-sequence-numberä£x-opt-locked-untilƒ`f¥rSsÀ/ ¡ b386990d8448445f908b6667c77866cf@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpà r›Íñߨ¦Aä¿—þ¶äØC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ñÍ›r¨ßA¦ä¿—þ¶äØSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberå£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ dbf16ba9d2c048ba8d1e5213e970da06@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpá Þêæó­3K³Ft˜“=»uC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜óæêÞ­K3³Ft˜“=»uSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberæ£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ c2f7b8b42387451f974c4fdbccaa321b@@@@@@@@@@@@Su  3Hi there! SÀ" Rpâ z|ôÑîNˆu‘g™üÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ô|zÑNîˆu‘g™üÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberç£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ f74767b1407d42aba1b34c1409fec9ae@@@@@@@@@@@@Su  3Ho there! SÀ" Rpã 6m¬Ì ut@˜ê<"DcP:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ì¬m6u @t˜ê<"DcP:SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberè£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ 33181aa960a54a7fb91fb08dd2d9fe8e@@@@@@@@@@@@Su  3Hey there! SÀ" Rpä ~†&Gz7QDˆ ^¡Ôš2%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜G&†~7zDQˆ ^¡Ôš2%SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberé£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ 5ee5b1c27443453a89d34566478ec4e9@@@@@@@@@@@@Su  3Hi there! SÀ" Rpå x¤ÓçèøaEƒ¦—Øe…þC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜çÓ¤xøèEaƒ¦—Øe…þSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberê£x-opt-locked-untilƒ`f¥ÀSsÀ/ ¡ d85b52a03640426881390f396a8c08d9@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpæ ýÀû È OŸ³|±¼6¸DC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ûÀýÈO Ÿ³|±¼6¸DSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberë£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ 3872c42ee15244d3b7277a0905311822@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpç  É»´T/I»µQ÷¨¯<-C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜»É T´I/»µQ÷¨¯<-SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberì£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ 4701cf5d70ed4dfc96b48266bf413ae0@@@@@@@@@@@@Su  3Hi there! SÀ" Rpè Ö¶ü $¢YO“e¹BŠ$'C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ü¶Ö¢$OY“e¹BŠ$'SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberí£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ f535c210ac0649d89437308ce6666dc1@@@@@@@@@@@@Su  3Ho there! SÀ" Rpé ^¿ÓåUl@Ÿ\æ>Î*pC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ó¿^Uå@lŸ\æ>Î*pSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberî£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ aacebdcbbbe04974907d8ad9724db662@@@@@@@@@@@@Su  3Hey there! SÀ" Rpê äÙV›¨HAˆÔ‰‚óa,C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜VÙ䨛AHˆÔ‰‚óa,SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberï£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ 267a5075eb894056b586b3bb043912cb@@@@@@@@@@@@Su  3Hi there! SÀ" Rpë ÔUìÊ¥«A“!™zåC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ìUÔ¥ÊA«“!™zåSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberð£x-opt-locked-untilƒ`f¥ŽSsÀ/ ¡ 043bad9c3fb4408d8273254b008bf440@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpì 7–gE~Æ[@–`¨ú…u‰%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Eg–7Æ~@[–`¨ú…u‰%SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberñ£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ e5f6c3a3befa4bd1b8c09657f96d24c1@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpí (õg‚Ù!F”çFÕùæÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜gõ(Ù‚F!”çFÕùæÕSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberò£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ a16979b0c7974d1e8722e7a2ac7327ba@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpî ðÕ ³ê©F¯·…s 2<þC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³ ÕðêF©¯·…s 2<þSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberó£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ 4ddc94209d2a48cd9d6fd9536b651a33@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpï ªõ!•ÂéA»¤Ë›Ç¦’C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜!õªÂ•A黤˛Ǧ’SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberô£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ 42e45d2ab986484b901217ddac1b5a9f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpð P&hŽÙC’È Î¬Ð(C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h&PŽCÙ’È Î¬Ð(SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberõ£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ 978d42eb59bf4033812830d4a39b6f22@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpñ ãj–¥¾nC†W3ý¹tûxC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜–jã¾¥Cn†W3ý¹tûxSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberö£x-opt-locked-untilƒ`f¥ŽlSsÀ/ ¡ 82fba79dd5bf4b249dd5dc9d79462dae@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpò G§¼£ìDF‡6݃¸{›@C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼§Gì£FD‡6݃¸{›@SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number÷£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 396da32c3a8947b79c8567daccf381c7@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpó ÓµDRË,F@Ž|I ïÇ.C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜RDµÓ,Ë@FŽ|I ïÇ.SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberø£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 9b01f868100645c4902e8fd5a0a6ca06@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpô ™g5g'ÓBª7±ˆ9œ«}C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜5g™'gBÓª7±ˆ9œ«}SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberù£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 137699977b1741eaa90c11444a53b3ed@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpõ aŸã:>GDžJ«ƒ¬àùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜:ãŸaG>DžJ«ƒ¬àùSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberú£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 4d82454b1c48436a9e262c89fea04ba7@@@@@@@@@@@@Su  3Hey there! SÀ" Rpö Q2À·mãL¦v_%Ýè=™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜À2Qm·Lã¦v_%Ýè=™SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberû£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 6dfa3af2e01740db83a1ea39a145a4f6@@@@@@@@@@@@Su  3Hi there! SÀ" Rp÷ ô·ÄÇFnC̯¸ÑÇúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ä·ôFÇCn̯¸ÑÇúSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberü£x-opt-locked-untilƒ`f¥Ž›SsÀ/ ¡ 599c4a5aa7b24994ba89e2c9b08da0c7@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpø Ò÷ò*ŒŒE«;Ëñx05=C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ò÷ÒŒ*EŒ«;Ëñx05=SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberý£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ c098c3ec9c12492f849ba7ee7aab3fb3@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpù ZÎ>ÆBž<‰ÀF{µ>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>ÎZÆBž<‰ÀF{µ>SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberþ£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ 4fd8bd1220c54d7e9230ac8d8d4d8aa2@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpú á€*÷¶K/)8öC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜€á÷*K¶/)8öSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberÿ£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ ea04628be1704c61964bb18d726ea2b7@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpû kVíVþE•âOüŒõOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜íVkVEþ•âOüŒõOSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ a608d9eab4ce48339bf3c4dbe8294aa7@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpü  dî†;)N™7 CJ¯!ßC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜îd ;†N)™7 CJ¯!ßSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ 0d0cb6fe5b2a4b44bd52a74f4c5833ec@@@@@@@@@@@@Su  3Hi there! SÀ" Rpý }i·(tèFŒK;£ZLðôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜·i}t(FèŒK;£ZLðôSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ŽÊSsÀ/ ¡ 5627c91b596148138186f4e9f3f4a135@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpþ 4üÝš;M„OøËŸ+ AC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜šÝü4;M„OøËŸ+ ASrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ 3268fe13af0948a8ba53ecf593426e39@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpÿ #Ià%YïH»ä†u4ÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜àI#Y%Hï»ä†u4ÝSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ e452d477fc4b476083f49abab999aab4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp a° KE™ lQçÅÒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ °aKE™ lQçÅÒSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ d0c98453c3ca40b1bec6f8a2922d68c9@@@@@@@@@@@@Su  3Ho there! SÀ" Rp ?¥ãÅ[A³,WÛ˜lC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ã¥?[ÅA³,WÛ˜lSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ 2fb1ea3796a8484c8769efbd9a2848de@@@@@@@@@@@@Su  3Hey there! SÀ" Rp Íšö±q¥‹Mœ_ƒÄƒÅªÖC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜±öšÍ¥qM‹œ_ƒÄƒÅªÖSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ 35149ed8b0c448b09d6cb3e415451b65@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ¨设ÿ@D­»—`”@­C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®è¨ÿ¾D@­»—`”@­SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥SsÀ/ ¡ 6465f8ad488a495490021a556063e111@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp füI€”ÅL˜©6vâ†j¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Iüf”€LŘ©6vâ†j¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ 38822eadef534447824d52f1df266d1a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp r«hЯAžÒݳÿU*jC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h«rÐA¯žÒݳÿU*jSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ e0d684eca51a4087a9977b81825a52e8@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp "ìr¯@#N‚Ý›Â>¿ÍÎC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜rì"@¯N#‚Ý›Â>¿ÍÎSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ 1ac84f73229f4680aab93e18fc6d877f@@@@@@@@@@@@Su  3Ho there! SÀ" Rp Ò?.Nª¥¿‚p±C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼¦î?ÒN.ª¥¿‚p±SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ abb1dfa8e0314b96a085f771719abd72@@@@@@@@@@@@Su  3Hey there! SÀ" Rp +µ nßÁªN¸‰_é!?“œC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜n µ+ÁßNª¸‰_é!?“œSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥GSsÀ/ ¡ 3e70a12d3ef142ab843869dd22b5ad2d@@@@@@@@@@@@Su  3Hi there! SÀ" Rp  wÓ‹4Í N¦|ö:NC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‹ÓwÍ4N ¦|ö:NSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥GSsÀ/ ¡ 1a55ccdb37324ee8957398fbb4394784@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  Lçá`Á[.M‡ùI°9·>‰C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜`áçL[ÁM.‡ùI°9·>‰SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ eba5cdc452c14ce7962baf283535de67@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp  ~íW4áøEž‡šö¦Ù¡?C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Wí~á4Eøž‡šö¦Ù¡?SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 59175d6c221d4f5d9d60933201ec32c8@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp  ä¥;?^­DŠ’kuR_z\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜?;¥ä­^DŠ’kuR_z\SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 462a7808b1524491818a1cba727e5456@@@@@@@@@@@@Su  3Ho there! SÀ" Rp  å´Ñ`ްG°4ž@–Ú,C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ñ´åŽ`G°°4ž@–Ú,SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ b94470eda6c5455fb3acf71935ece29f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ㈑¸hIYS¥ ™òC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ˆã¸‘IhYS¥ ™òSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ cc31aeb4f2a544eeaeac2223b749fb74@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ÚnjfyÚTJ‚EŽ@s›ÓC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜fjnÚÚyJT‚EŽ@s›ÓSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥vSsÀ/ ¡ 81d8460421774164ac95238b29713c0f@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ø÷;ôAC­Á襧{8C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜;÷øôCA­Á襧{8SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 5e64d56e674e44159f7a686e90afd438@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp 7‡Å?c·@º&ƒjº©ƒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Å‡7c?@·º&ƒjº©ƒSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 0de8b8399e54456e97d5ff34e85c9d6e@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ÍzŒã½síF“-kIgr¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãŒzÍs½Fí“-kIgr¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 3185b0909c7b48c8849274be34c5bce9@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp [žuÔʺ‹BÏÝqí˜öÒC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ôuž[ºÊB‹ÏÝqí˜öÒSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 0ed32855a83a4222a8689c1d85ff3a70@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ‘>,qxpHœˆV‰Ô+rC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜q,>‘pxHœˆV‰Ô+rSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ e1342725429b4f68b7242e41992f8954@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp  ÌÙIJ¿OH„ÑrÍ1þ©cC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÄÙÌ ¿²HO„ÑrÍ1þ©cSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 1921dbda02e441c096cbf41052ba5a99@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp j§1S,8dF¯2ÊSÀLP\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜S1§j8,Fd¯2ÊSÀLP\SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 3c4bed9995274187a5cac72c01774f0c@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp haTRiO³1=-F åC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜RTahOi³1=-F åSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 1e842fd3a601416aa677407f2f974403@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ª¦QÂéªsOŠë-œPôRFC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÂQ¦ªªéOsŠë-œPôRFSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 21a9ea597e384b7c93b9f194f3db5f6d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ZذšK_F­2ÝLBñ[C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°ØZKšF_­2ÝLBñ[SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ d55c6d181f1141759cb8ffe7cce1f0b0@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ¾’ÖhvßI®lUúÈã.C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜hÖ’¾ßvI®lUúÈã.SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 5ba349c406f54bb19766daa158be46e4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp 8a)W³lÓA‚¾ù—§ÃÖøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜W)a8l³AÓ‚¾ù—§ÃÖøSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number £x-opt-locked-untilƒ`f¥ÄSsÀ/ ¡ 70994474eaf34965be6d5ebfbf76d0c6@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ÑGôØžI´@Ù§ïC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜GÑØôIž´@Ù§ïSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number!£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 5f44931293c6433ba52e8d2fa7c501ca@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ~@½*òNI™*ÈÝ©ØìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*½@~NòI™*ÈÝ©ØìSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number"£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 176372ef59364c6394de20773fd28dc0@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ÆD®ýòšO©»nH-«eC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®DÆòýOš©»nH-«eSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number#£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 9a5ea7aa841c4889b34e36753f8ee47b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp qŽ~ lï@C ™ñÐ>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~Žql @ïC ™ñÐ>SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number$£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 83d206e1ffca49aeb6f0a585299f7e33@@@@@@@@@@@@Su  3Hey there! SÀ" Rp  §ýÕ)Ö>Ošéÿí½XkC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜)Õý§ÖO>šéÿí½XkSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number%£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 17f58b0657d74afa9e0ba8aac57f1419@@@@@@@@@@@@Su  3Hi there! SÀ" Rp! DnÁ;¿»OŸ(ª?¯ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÁnD¿;O»Ÿ(ª?¯ SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number&£x-opt-locked-untilƒ`f¥óSsÀ/ ¡ 1d988772ad7541eab0703b8904b6c065@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp" ÝH×awCbÌ»CóëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜HÝa×CwbÌ»CóëSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number'£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 70645150b3d64225a467d522b9a39638@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp# GÅ,„ùâOºÂ1ô>tÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜,ÅGù„OâºÂ1ô>tÔSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number(£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ ad1d09a6e57d41c887995628e39b6691@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp$ í}«·ôðT@”eƒ'üèC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜·«}íðô@T”eƒ'üèSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number)£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 1124737e583c479782e34c4879a2fcb6@@@@@@@@@@@@Su  3Ho there! SÀ" Rp% «·v*PÔmO–‚¬/A…C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*v·«ÔPOm–‚¬/A…SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number*£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 851c50b4e7994a7a8109939eaf8fc76d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp&  Ä/®ºCŽ>ŽØ!á/C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/Ä ®CºŽ>ŽØ!á/SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number+£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 04c81170b4da452a93abafefc697d332@@@@@@@@@@@@Su  3Hi there! SÀ" Rp' ᧃNNŽ"çßøŽÌOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ƒ§áNNŽ"çßøŽÌOSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number,£x-opt-locked-untilƒ`f¥"SsÀ/ ¡ 3414f7da4ef14f55908ea08a8ff3020d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp( ßÊ5Ï›_Kœ—G Ñ:EøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ï5Êß›K_œ—G Ñ:EøSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number-£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ f239c1f839f94a259496d0decb0dcb43@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp) Ú ôÃÅNœV^íïÊC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ô ÚÃNÅœV^íïÊSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number.£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ 9e950d61416c450796b3bde3e73d6ffe@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp* V™S/à¿ÑF€L•‘=ÖÈC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/S™V¿àFÑ€L•‘=ÖÈSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number/£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ fb6f3d8d5aa742a493ba84d2d21c2d03@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp+  •ƒ¾3ŒO´»P ­ùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾ƒ• Œ3O´»P ­ùSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number0£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ e6674f6f8536481f926d22b5fc7c1696@@@@@@@@@@@@Su  3Hey there! SÀ" Rp, šÕzµT«ˆEˆ0}LÖOÈC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜µzÕš«TEˆˆ0}LÖOÈSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number1£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ 53f32bc22ce34755858100a362eaf3af@@@@@@@@@@@@Su  3Hi there! SÀ" Rp- C§J¤ôÉJK‹˜#œ 9çYC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤J§CÉôKJ‹˜#œ 9çYSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number2£x-opt-locked-untilƒ`f¥PSsÀ/ ¡ f91075b702414b8e900dcf432e0aedd3@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp. Íá ±(UM¤È|vS1¦C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ áÍ(±MU¤È|vS1¦SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number3£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ c262a834095c4db883162c3bf2aa9302@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp/ ñxxw·G®$“\³åC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜xñwxG·®$“\³åSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number4£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ baa1950bbd56477b9a7cb701fa86f17e@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp0 ÛjÆã|”ÒL£:˜rL(XC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãÆjÛ”|LÒ£:˜rL(XSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number5£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ 6513a3af59af475497b4d0c7a02f85df@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp1 ¬òg5L§¾ ¸ÿyTC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜gò¬5L§¾ ¸ÿyTSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number6£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ 31f8fefb308f426b8890f5eeb1542602@@@@@@@@@@@@Su  3Hey there! SÀ" Rp2  X¯ï L½êÑà¹üÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯X ïL ½êÑà¹üÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number7£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ 680a03dc4285440ab798a07f8eff0c49@@@@@@@@@@@@Su  3Hi there! SÀ" Rp3 è¹,Jv6JQÜ´Å–4ÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜,¹èvJJ6QÜ´Å–4ÞSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number8£x-opt-locked-untilƒ`f¥pSsÀ/ ¡ 07bf5edfedbd468cbf4295c23a554d6c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp4 M„Cõ­êÇ@‘“LÂù–³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜õC„Mê­@Ç‘“LÂù–³SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number9£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ 9196724ef71042dba4f5f52efd6a83e7@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp5 ¥‰aÕõ –F±€NƒeôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Õa‰¥ õF–±€NƒeôSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number:£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ ad87afaec73841c49e00f5577163852c@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp6 Ÿý®ÇK¨D”XZõ9™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®ýŸKÇD¨”XZõ9™SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number;£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ 0a2909d7c3f6443093a3796960501cf6@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp7 >°MT™tI€Ä¤ÇëÀWC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜TM°>t™I€Ä¤ÇëÀWSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number<£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ 2bab5dcabc3841d780a05d687d156f36@@@@@@@@@@@@Su  3Hey there! SÀ" Rp8 R‰/º»E¼‡*™ deC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜º/‰R»E¼‡*™ deSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number=£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ ec0923c15f884fb9a063c39bc7896af5@@@@@@@@@@@@Su  3Hi there! SÀ" Rp9 ú(å¾2Ï`F«4¢ã`t™C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾å(úÏ2F`«4¢ã`t™SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number>£x-opt-locked-untilƒ`f¥ŸSsÀ/ ¡ 0a9cca7276e94b328bea8995a8e91e5f@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp: )ÈÉà4 ¯§èe†$L¾3KE,ÄC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜e觯†L$¾3KE,ÄSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberC£x-opt-locked-untilƒ`f¥ÍSsÀ/ ¡ 5f0e095098134f48a974395913b841bb@@@@@@@@@@@@Su  3Hi there! SÀ" Rp? B}o3gVÏE‰HõW¾ZávC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜äü Æ1J÷‚û6Œi²>vSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberS£x-opt-locked-untilƒ`f¥‘ÇSsÀ/ ¡ 023d483c72bd4ac9923b97747e129ddd@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpO  k‡.D§M¼£ê|YÂrC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‡k D.M§¼£ê|YÂrSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberT£x-opt-locked-untilƒ`f¥‘ÇSsÀ/ ¡ 697bf6094d06411ca4977a8aa032f6f2@@@@@@@@@@@@Su  3Hey there! SÀ" RpP Ÿxxþ| ŠJ„¤&øt _4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þxxŸ |JŠ„¤&øt _4SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberU£x-opt-locked-untilƒ`f¥‘ÇSsÀ/ ¡ 31b1a8546d7844f098b6c57c68e51ce1@@@@@@@@@@@@Su  3Hi there! SÀ" RpQ —h@’üÔšNž`ï’?lC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜’@h—ÔüNšž`ï’?lSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberV£x-opt-locked-untilƒ`f¥‘ÇSsÀ/ ¡ 4022a64c4ab84aba95ff6d7f3c3969a8@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpR ù®&nBûH­Þ^¢=g¼ëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜n&®ùBHû­Þ^¢=g¼ëSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberW£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ da8d8098270e416d933d44f2d82622c8@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpS 'ˆyýøBK‹ö!âOµ8JC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜yˆ'øýKB‹ö!âOµ8JSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberX£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ e0e59df5eab24a1b8553b42fb89edeed@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpT ÞÕFßÔC– cTtq&C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÕÞßFCÔ– cTtq&SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberY£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ a56c133cc8e94784a4bb045968a22469@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpU ,5¯‚3‘³J—é©Ne¨ŠC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‚¯5,‘3J³—é©Ne¨ŠSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberZ£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ 2ab51e0ea1274e199e12fe8a19dcf9a4@@@@@@@@@@@@Su  3Hey there! SÀ" RpV |¦˜×Í3D¢ðk¡ÕbêÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜˜¦|Í×D3¢ðk¡ÕbêÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number[£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ f7da4884b4f14b1793711fa2b997805d@@@@@@@@@@@@Su  3Hi there! SÀ" RpW ðMM›¸²ØO’ø” fn0+C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜›MMð²¸OØ’ø” fn0+SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number\£x-opt-locked-untilƒ`f¥‘öSsÀ/ ¡ ad1ed6c9c2534584a21fa614e1e55f66@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpX ÄÉPò SI¨ëÌséY]C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜PÉÄ òIS¨ëÌséY]SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number]£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ c6eecf4b353645ca81d79f9a3a991e2e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpY ûf–*8*8G˜ˆÁB ãT¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*–fû*8G8˜ˆÁB ãT¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number^£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ 21d241852eb144c69a7dbfee6ef91ee9@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpZ ^Úϯ™hMìG §ÓáC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¯ÏÚ^™MhìG §ÓáSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number_£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ 6dd03069fa82494ba90acf9ec6be0db2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp[ ÑùÁ8išøG½x[sù› [C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜8ÁùÑšiGø½x[sù› [SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number`£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ b565e556ffc149babe1eedd0693a601e@@@@@@@@@@@@Su  3Hey there! SÀ" Rp\ OË??{gAª!Õ*ÚéÂúC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜??ËO{Agª!Õ*ÚéÂúSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numbera£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ 3c874884cb1c49af9107671daf5b613e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp] Tüö{ŽEªtåë§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜{öüTŽEªtåë§SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberb£x-opt-locked-untilƒ`f¥’'SsÀ/ ¡ d8e3742d4ce7418992c2ce81fb9d0ab4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp^ 7&:PÐAfF¾•N«íx—C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜P:&7AÐFf¾•N«íx—SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberc£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ e2186f1259ff4e75902dc619cff6b887@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp_ ¡Z"ÝŸ ©@±Ô¯% Šx÷C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ý"Z¡ Ÿ@©±Ô¯% Šx÷SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberd£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ 92ffbb7f715e4e85aedc200d241c881d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp` '¤<­WG‘rêóŸÆ²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜<¤'­GW‘rêóŸÆ²SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numbere£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ 0aad1b6d001846e3af01fa070f1de177@@@@@@@@@@@@Su  3Ho there! SÀ" Rpa ;YVøÙ‹K¸? *°5C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜øVY;ÙK‹¸? *°5SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberf£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ ed67a0288c804e8086c059ab8e62baf7@@@@@@@@@@@@Su  3Hey there! SÀ" Rpb ‹Kγ5O´Èd$ÇjMêC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÎK‹³O5´Èd$ÇjMêSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberg£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ e4b868c6576b44508429299b360432da@@@@@@@@@@@@Su  3Hi there! SÀ" Rpc \áWSCªï^{nSC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜á\WCSªï^{nSSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberh£x-opt-locked-untilƒ`f¥’USsÀ/ ¡ 105030a7b49b4a7b8b431866ab26dbe1@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpd Æû ¨‹D˜–\öÌÕx_C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ûƨ D‹˜–\öÌÕx_SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberi£x-opt-locked-untilƒ`f¥’uSsÀ/ ¡ f1b4511895774d5799ccbd0caf9ab485@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpe ¨®ƒÌ)ÇI‰UUß´__C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ìƒ®¨Ç)I‰UUß´__SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-numberj£x-opt-locked-untilƒ`f¥’uSsÀ/ ¡ 85869c9156e340a890c57ff4316af570@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpf 9‚_~°Òê¾ðÐûB»^ éä„_C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ð¾ê>ûÐB»^ éä„_SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number|£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ 89659b61df2a47cbbd087714a8cee3c8@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpx #x~@O– 5}Y<ŸùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~x#@O– 5}Y<ŸùSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number}£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ e491a2cc42754accb4c23bfb477f4294@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpy ïèwˆ¿KL£pÕý79¤C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜wè￈LK£pÕý79¤SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number~£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ 072df25e914d4959830145d62ef3df9e@@@@@@@@@@@@Su  3Hey there! SÀ" Rpz UÛ-ï­q@­~´T™=¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ï-ÛU­@q­~´T™=¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ 55e1a7de4742450a98718d2baded449e@@@@@@@@@@@@Su  3Hi there! SÀ" Rp{ ¦¬BiYcB‹Úv¹÷ÑÕC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜B¬¦YiBc‹Úv¹÷ÑÕSrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number€£x-opt-locked-untilƒ`f¥“SsÀ/ ¡ fab93f675a5b4bb981527b54d2dda891@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp| üú†« N•4µ¸‘ ¸C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úü«†N •4µ¸‘ ¸SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ 4a0b8e2a2d054b3ebb4faa122637d0ae@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp} ÆâŒŠ¯åñMƒÜBƒÛB§C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ŠŒâÆå¯MñƒÜBƒÛB§SrÁ\£x-opt-enqueued-timeƒ`f¤‡K£x-opt-sequence-number‚£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ 2be88db13a074a61a4d001635dd389c6@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp~ ïÝÄìȽLH•*›ýÌ«ÕÐC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ìÄÝï½ÈHL•*›ýÌ«ÕÐSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberƒ£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ ddf5b88367a741ea8b34de072ff9285e@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp dbì@©¯»E¶wËVò¢ÏgC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜@ìbd¯©E»¶wËVò¢ÏgSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number„£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ a9a263676ca147a59b2ce05e49604bab@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp€ Þ>šquJ´òç ï±C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜>ÞqšJu´òç ï±SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number…£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ 7f976a1e527948e1811fad26b1e8fa48@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp [ô®ÇC È¡uÙoVC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜®ô[ÇC È¡uÙoVSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number†£x-opt-locked-untilƒ`f¥“!SsÀ/ ¡ 17488fef89a94cc6bddc87a47fd4105c@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp‚ ¥;PÞ}ŽL¶µîOOé9C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÞP;¥Ž}L¶µîOOé9SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number‡£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ 425502cd944049e28ae2b656e3644043@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpƒ ÍÄ QAF¼ÐÙ+·0¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ÄÍQFA¼ÐÙ+·0¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberˆ£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ 9d6a19c0d22d4a3fae447086670c459d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp„ ïl*‘HK„3B³ 7¸ìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*lï‘KH„3B³ 7¸ìSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number‰£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ f1163b7ddadb41d5894d93701e144efb@@@@@@@@@@@@Su  3Ho there! SÀ" Rp… sèN ýðK¾ZN,3ÞÆôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ NèsðýK¾ZN,3ÞÆôSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberŠ£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ 5392bd0956e040a9abb47c921913598d@@@@@@@@@@@@Su  3Hey there! SÀ" Rp† ù,ªÀF¤ŒCRN×ÊC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ª,ùÀF¤ŒCRN×ÊSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number‹£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ 6834000aa763487492852ccef6c15260@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp‡ Ò °þ vM‚%ùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜þ° Ò Mv‚%ùSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberŒ£x-opt-locked-untilƒ`f¥“PSsÀ/ ¡ d280da296ba6488eb20aec4c1708f636@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpˆ  ß 6·K¿&¥¸Qã½C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ß 6K·¿&¥¸Qã½SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ d0d6ded463034c19beaf00d763f033f7@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp‰ þP6ìÄýêC†,8ToóÿC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ì6PþýÄCê†,8ToóÿSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberŽ£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ 98dfea8d416d474fb39d5cc4690c341f@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpŠ Jµ^}í°­J¸F4<£)C½C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜}^µJ°íJ­¸F4<£)C½SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ 3159c9cc01b6417b88f84d885ae2ca37@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp‹ Õ‹¨_*,G’ä²>ûÿlC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¨‹Õ*_G,’ä²>ûÿlSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ ae5c4827585c4dab8321f14d86d2870f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpŒ E¹Î¤¿Å~M°[ÕâKÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤Î¹EÅ¿M~°[ÕâKÝSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number‘£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ 0691f33e4d684b32b1bf6b458d866ce4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ?éí¡¿–uM«Ú%»Ûîï­C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¡íé?–¿Mu«Ú%»Ûîï­SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number’£x-opt-locked-untilƒ`f¥“~SsÀ/ ¡ 4ffbbb94fa7442ff9103357e25a1642a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpŽ Ñ6ÍYoX @Ë[ûv*ãC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜YÍ6ÑXo@ Ë[ûv*ãSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number“£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ e904b86305f44a8b934a2158fe1a2033@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp Èþ³ cG¬êºGàËŽ*C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜³þÈ Gc¬êºGàËŽ*SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number”£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ 2f10faaac80741c3854f4212b8e99d64@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp ûsø¿õ¡A¤¡V ÕO‡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¿øsûõA¡¤¡V ÕO‡SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number•£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ e6565b5388f4423ead605b198eb20379@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp‘ Ôâg¬DñF— ¢¬–Q±ÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜gâÔD¬Fñ— ¢¬–Q±ÝSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number–£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ f447feed0fca424691464d80751259ac@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp’ × Μ(5§@Œqëëw][C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜œÎ ×5(@§Œqëëw][SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number—£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ aab4ecacb12940daba5a78d1feea585d@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp“  b뵂J™C'@F+ÈC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜b µëJ‚™C'@F+ÈSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number˜£x-opt-locked-untilƒ`f¥“­SsÀ/ ¡ e7b5dc7c9837457fbdde44655bb60265@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp” m,T¶báæLª‚‚æ C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¶T,mábL檂‚æ SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number™£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ b22ce84951094021b525d4dcb00fe719@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp• [}CUÖÑ5@ŠÎÔÀŸiOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜UC}[ÑÖ@5ŠÎÔÀŸiOSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberš£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ 3b59dfbe6a1a47849e926d283783c7f5@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp– Ö âHn(ŒE›\Ø4ShŽÁC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Hâ Ö(nEŒ›\Ø4ShŽÁSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number›£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ a1867a1aa7c64f6aae6eaae5db528c75@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp— Ƶ°ìe{zC˜Õ5u#ž C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ì°µÆ{eCz˜Õ5u#ž SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberœ£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ e22ca95313814b37895dcbd258b040a8@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp˜  àÔRÊ'AL’*ÁŠËßC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜RÔà 'ÊLA’*ÁŠËßSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ d3d1b161845d4e81b03bd9d035659265@@@@@@@@@@@@Su  3Hi there! SÀ" Rp™ 7aú/C^mB¿¾jBP #C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/úa7^CBm¿¾jBP #SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberž£x-opt-locked-untilƒ`f¥“ÜSsÀ/ ¡ 489f071dd43d4c88abe7bb1d483c1c72@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpš  Ñ#ãÊNM¡S(ÝÃOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ã#Ñ NÊM¡S(ÝÃOSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberŸ£x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 29c3defe62ca496bb190a49b6f949313@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp› rgbܭѬK·†õf“³6"C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÜbgrÑ­K¬·†õf“³6"SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number £x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 5a8201d5940c4635b2511ffd9d3a0b52@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpœ „•|”¦>ÒM°©!w4-ïÆC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”|•„>¦MÒ°©!w4-ïÆSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¡£x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 2892990673a7488995664a715f9941b2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp hT0wB£ú • Îh”C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜h0TBw£ú • Îh”SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¢£x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 663fc790cdf3401fbc4db9de7d632e4f@@@@@@@@@@@@Su  3Hey there! SÀ" Rpž c‰}‘]êI¢\«(þÇ÷EC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‘}‰cê]I¢\«(þÇ÷ESrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number££x-opt-locked-untilƒ`f¥” SsÀ/ ¡ 9f8188cc13bf492cb1427936a269ed25@@@@@@@@@@@@Su  3Hi there! SÀ" RpŸ ÁÞ&î„£yM‚Õ7J³kª¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜î&ÞÁ£„My‚Õ7J³kª¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¤£x-opt-locked-untilƒ`f¥” SsÀ/ ¡ b2969854a2674fa39be214c2bb2b68ec@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  (¡å«rZG¢¢Rå>BÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜«å¡(rGZ¢¢Rå>BÔSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¥£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ f7bbfd9e554d4a3f9bdea6db6889289d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¡ ^dÅ,A”ÀG™í> Š;ôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜,Åd^”AGÀ™í> Š;ôSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¦£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ d5d5f1e59ddb4b3d94012d743d2589fe@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¢ dñèfݬK±ìP‡"³C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜fèñdÝK¬±ìP‡"³SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number§£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ 66337d8b097948d4bf96a0be4558bcbd@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp£ ~˜öVõ*F›•jÍi½[„C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Vö˜~*õF›•jÍi½[„SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¨£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ d92af4e591034c8eb953dd0034e69144@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¤ ^Ú :ˆ—]G‘ï¢]š‰×ÛC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜: Ú^—ˆG]‘ï¢]š‰×ÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number©£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ 94fcbcf24c5743b39a9eb1c90a495de3@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¥ ›W\‚q»N­×XpéòçC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜\W›q‚N»­×XpéòçSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberª£x-opt-locked-untilƒ`f¥”:SsÀ/ ¡ d6707e7d644a43cdafe5bb1b3e680953@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¦ þ‡©è1E«–*ms g'C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‡þè©E1«–*ms g'SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number«£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ 01f24d5e6dc1459b8a3d2cdcf6e630f6@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp§ ÿ]Jk–eB—“Ïû¥1€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜kJ]ÿe–B—“Ïû¥1€SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¬£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ 8b6ad48a368f496a8ce8d9129ea8c8e4@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp¨  Xo°iãwB„®H½eC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜°oX ãiBw„®H½eSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number­£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ 70b9ab13d65a470c801aba222320497a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp© ÍS~©SÔC¸ׂJx•fC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~SÍS©CÔ¸ׂJx•fSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number®£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ c61aa096e0d945a886167d3ece46ec67@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpª Åx?!ïD·ç.,ìB C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜xÅ!?Dï·ç.,ìB SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¯£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ fffdf33f9f62410ea09ed3226aea14dd@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp« b‰ð!'xF¤þpsÐŒ§ØC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ð‰b'!Fx¤þpsÐŒ§ØSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number°£x-opt-locked-untilƒ`f¥”YSsÀ/ ¡ f44d0beb61204ea2a6ed35f7e244d423@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¬ S#l&ÜB•Á- ïûôC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜#S&lBÜ•Á- ïûôSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number±£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ 3cb74b14fbbc442ea33b1170f5436141@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp­ ’ eRãmO¢<ô|š#ÔìC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Re ’ãOm¢<ô|š#ÔìSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number²£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ 1b428482f3da45ec8e99a4a9bcac7f83@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp® kžXÖcqF•+ m C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÖXžkcFq•+ m SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number³£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ dd43e092b495423f913cbe5f6aa71659@@@@@@@@@@@@Su  3Ho there! SÀ" Rp¯ *²éñüG¥=:œC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜²*ñéGü¥=:œSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number´£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ 5db7c237020e44cb9b4a46f3f2844aff@@@@@@@@@@@@Su  3Hey there! SÀ" Rp° °œ+L)úJ´k5@X“ÇîC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜L+œ°ú)J´k5@X“ÇîSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberµ£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ 565d6d4e5af541f19104157697826ff8@@@@@@@@@@@@Su  3Hi there! SÀ" Rp± Ô+]ur)gF¸i©Môv5C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜u]+Ô)rFg¸i©Môv5SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¶£x-opt-locked-untilƒ`f¥”ˆSsÀ/ ¡ a5d1952ca7d4441c98b9e689960c3343@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp² ’¬¼=¢ŠtM¿tU«¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜=¼¬’Š¢Mt¿tU«¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number·£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ ba3c49feadf240938fe3a966a2fc811a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp³ cÙ€¢°ECºÆŒÈÀøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¢€Ùc°CEºÆŒÈÀøSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¸£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ 1e80fe3b126c47e7a6a5e9feddfb2a84@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp´ gÅë âs@¹_|4C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ ëÅgâ@s¹_|4SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¹£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ 65a7e870b5fe46f89f7a9dd1467dd4ce@@@@@@@@@@@@Su  3Ho there! SÀ" Rpµ hÊ%+Éû°O‰áÍ~ò®ivC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜+%ÊhûÉO°‰áÍ~ò®ivSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-numberº£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ 12b1d88797cc4e3aa9761ec4adc8f6a2@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¶ ’}j”¸ÜG¯eëáýãøC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜j}’¸”GܯeëáýãøSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number»£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ e628453574074820b0d7e2659790d664@@@@@@@@@@@@Su  3Hi there! SÀ" Rp· ”<FÎB²òXœ8%jC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜F<”BβòXœ8%jSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¼£x-opt-locked-untilƒ`f¥”·SsÀ/ ¡ c6917bc1bfcc42f8be9656f8d5e5e4ac@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¸ ºÂë¦ô—”Dƒ>õE½C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¦ëº—ôD”ƒ>õE½SrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number½£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 3c58df00f7d042f1a8f957842ed1cc6e@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¹ ÁÝq‡i¥B³ŽÅèA„ünC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜qÝÁi‡B¥³ŽÅèA„ünSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¾£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 7709e4bf90e64855bec1186a5be2088c@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpº jemé‚IC°Çi¼ÞóÔC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜émejI‚C°Çi¼ÞóÔSrÁ\£x-opt-enqueued-timeƒ`f¤‡Z£x-opt-sequence-number¿£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 8db6e73131a741c38a2b5470423d151a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp» s]ZY–êmBs6âøc ®C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜YZ]sê–Bms6âøc ®SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÀ£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 9aeba14b22004fed81b39b77c7848b79@@@@@@@@@@@@Su  3Hey there! SÀ" Rp¼ Â¥ÇÂßG’€‘ª^fC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ç¥ÂÂGß’€‘ª^fSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÁ£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ a2b7a5a8fc5a48b5ac7847148b24877c@@@@@@@@@@@@Su  3Hi there! SÀ" Rp½ ƒ|>€ñ%A¡ñ檥@ˆ†C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜€>|ƒñA%¡ñ檥@ˆ†SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥”æSsÀ/ ¡ 2715af4992484b9dbc49074b3a1f5a4b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp¾ W¿•‡ÁÛMJ”pÌ¥g`”C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‡•¿WÛÁJM”pÌ¥g`”SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberãx-opt-locked-untilƒ`f¥•SsÀ/ ¡ 717768a46be1427abe65804f4f2bc271@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp¿ 72< ×dI¨E®"x•àC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜<27× Id¨E®"x•àSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÄ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 4be9cfda917144f3b1a5e7d1345af706@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÀ ÀƒÔ”YhJ·SçÑ$ÖãËC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜”ÔƒÀhYJ·SçÑ$ÖãËSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÅ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 340ceb2d61f64511ad6fc668bbc4447a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÁ ´?ÐñzèùFºð¡V†¶ÀC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ñÐ?´èzFùºð¡V†¶ÀSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÆ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ ef4e44c7b43247c2af2df6e3aa3274ac@@@@@@@@@@@@Su  3Hey there! SÀ" Rp µèÖd»žL–¼×]]TOÿC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Öèµ»dLž–¼×]]TOÿSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÇ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 89b8ca99735c4cfca9c72e21c5bfc3b3@@@@@@@@@@@@Su  3Hi there! SÀ" Rpà¥Çpú?ÂðD¤Â·ËwOC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜úpÇ¥Â?Dð¤Â·ËwOSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÈ£x-opt-locked-untilƒ`f¥•SsÀ/ ¡ 5934c26da4bf49c8a0bd1cadb4966d1e@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÄ &xìË#ÒËN¼.Ž®ðñC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ëìx&Ò#N˼.Ž®ðñSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÉ£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ 0d6dd29ed44849c0abc95c36ad386ed3@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÅ ÁPÝãï‰ÝEžª;2BÝÖC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ãÝPÁ‰ïEÝžª;2BÝÖSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÊ£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ aa29211d04184741919e17beb65edd8f@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÆ ¦ð;Ú*D¨~lá2…‘‹C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜;ð¦ÚD*¨~lá2…‘‹SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberË£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ 2091c06408b64375aa26a99db0b3eed9@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÇ ¦T7j•¯L²ƒÀu˜òC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜7T¦•jL¯²ƒÀu˜òSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÌ£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ 96ef14d8ca1042d682230dbaa239724d@@@@@@@@@@@@Su  3Hey there! SÀ" RpÈ `§k@ÄL¾?#÷¥'ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜§`@kLľ?#÷¥'ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÍ£x-opt-locked-untilƒ`f¥•4SsÀ/ ¡ 8a60c2329c5d403a8430fc3185869dab@@@@@@@@@@@@Su  3Hi there! SÀ" RpÉ íâ;}:¥H˜IeZÚbBRC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜;âí:}H¥˜IeZÚbBRSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberΣx-opt-locked-untilƒ`f¥•4SsÀ/ ¡ d076ad6eac4540479bc510601eb87990@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÊ [¶š<Û¤I0;è©>C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜š¶[ÛSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÏ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ 83a7f2ec54b742c2804e9a99935ae489@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpË ¦u޼€åÒI…z;þ¶Ã½òC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼Žu¦å€IÒ…z;þ¶Ã½òSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberУx-opt-locked-untilƒ`f¥•cSsÀ/ ¡ f22da8c9c87b4cb786e9bfa085d1e634@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÌ ìÕO^kBûO”’Wø‘HÖC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜^OÕìBkOû”’Wø‘HÖSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÑ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ 00a939d662454514bb807f09039a8b7a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÍ 8³Êåú3@šÜˆl­å‡lC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åʳ83ú@šÜˆl­å‡lSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÒ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ bf3ccc1b9a6740378c2fb0a284e77f62@@@@@@@@@@@@Su  3Hey there! SÀ" RpΠÁ›™Þq“ K¢cÅx˜ÆdC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Þ™›Á“qK ¢cÅx˜ÆdSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÓ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ 8dbfb9fd75f04487bd7f572007aa3fd0@@@@@@@@@@@@Su  3Hi there! SÀ" RpÏ ðë€~Û>±J’øèDóZmoC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~€ëð>ÛJ±’øèDóZmoSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÔ£x-opt-locked-untilƒ`f¥•cSsÀ/ ¡ c6704fde073b4bd8a360f9a6ff4768f2@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpРª|Š1\A²I¸(þ »:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜1Š|ªA\I²¸(þ »:SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÕ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ e3bb9e63b0674176b3a6a2edf1e1ed2d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÑ ‚Æ ÏÛ¼‹E¦šaÄè¡¥C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ï Æ‚¼ÛE‹¦šaÄè¡¥SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÖ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ d754ba81e82a4fb593a5bedaab6e72b0@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÒ ÚˆëwæÇÂO’,÷šÁ½ –C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜wëˆÚÇæOÂ’,÷šÁ½ –SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number×£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ 7660d3d55d014f6fa3ea7a190d5b489a@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÓ χ)~–WEžp) ª$mC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜~)‡Ï–EWžp) ª$mSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberØ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ f97c3b4e480e47d9ba18d20fe8e4bab4@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" RpÔ +7ƒ‰'ëBåûm±C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰ƒ7+ë'Båûm±SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÙ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ b93d78b09ff34782aef9eda564603c27@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpÕ ½†9({DB ù²Å´¢›±C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜9†½{(BD ù²Å´¢›±SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÚ£x-opt-locked-untilƒ`f¥•’SsÀ/ ¡ a706f26ab0d846dd9f15918430a99732@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" RpÖ ÙÇ»NO GˆsóÅß"]ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜N»ÇÙOG ˆsóÅß"]ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÛ£x-opt-locked-untilƒ`f¥•ÁSsÀ/ ¡ 5e65abf215424d4cb0c91a5aadf17a5a@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp× ½jIɲA„G¤ )eNC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÉIj½A²G„¤ )eNSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÜ£x-opt-locked-untilƒ`f¥•ÁSsÀ/ ¡ 0b30d2807ca24b8486d4ba3beed87654@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" RpØ „eÛá™1äC·¼ÈV´-ÉC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÃÌ!¸æDªU>ÈV´-ÉSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberæ£x-opt-locked-untilƒ`f¥–SsÀ/ ¡ 0e7f712f8ac244b8b97bb47f0e7c5b8d@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpâ تN­(¹êM‘Y9ÿ$cŽC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜­NªØ¹(Mê‘Y9ÿ$cŽSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberç£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 20eaa9a4855d405d9b5e9b26d60f1d00@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpã ŽoèTøe E¼vôIC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜TèoŽeøE ¼vôISrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberè£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 6abee82d88384c10b1071778712c68b5@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpä ÙÍ…ÁNJCˆý»ÿ‡XhC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Á…ÍÙNCJˆý»ÿ‡XhSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberé£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 7c9cd21953394e3d89d6584cea623a02@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpå ©“ÈDÚ %G¢óUµÀ´œJC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜DÈ“© ÚG%¢óUµÀ´œJSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberê£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 1b443f5fa4ef4648a158b2036670073a@@@@@@@@@@@@Su  3Hey there! SÀ" Rpæ ÁK127F@¾1o,²C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜21KÁ7@F¾1o,²SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberë£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 4c49b0073da84f25a0244ca670efe72e@@@@@@@@@@@@Su  3Hi there! SÀ" Rpç òB{ÐÕÓJ¡b•Ë WÂC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ð{BòÕJÓ¡b•Ë WÂSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberì£x-opt-locked-untilƒ`f¥–/SsÀ/ ¡ 40fcbdb23f8d450d93891dc4ec3ec637@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpè çkû× t‘KŽã`b%¬×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜×ûkçt K‘Žã`b%¬×SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberí£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ 036046deb9774666aeaabf16eafa6ef5@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpé ›…çbyÑ[Nœô‡’( ÞC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜bç…›ÑyN[œô‡’( ÞSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberî£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ 99669e48e3a54f659fac27949a1f6769@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpê S•mS‚›F‘ ÀáºÍfÝC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜m•S‚SF›‘ ÀáºÍfÝSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberï£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ f2e8fbce0be3470586512a790d1a6830@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpë j[Åq4KEÄvœÒ‡C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Å[jqK4EÄvœÒ‡SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberð£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ da0ae1dd5dad4914aa11ef99de7abb2f@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpì )Ú¯µ©oLŒ<޹º¸è^C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜µ¯Ú)o©LŒ<޹º¸è^SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberñ£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ ae54458ff97a4c22b30f3230e2aa870a@@@@@@@@@@@@Su  3Hi there! SÀ" Rpí Œé¤æ°ÿAŠ»< U"3¨C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¤éŒ°æAÿŠ»< U"3¨SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberò£x-opt-locked-untilƒ`f¥–^SsÀ/ ¡ 2184a1504b6d490aa6a6e4b274e46d27@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpî Ad„Þ_ÿ’Iª}–ÁÏC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Þ„dAÿ_I’ª}–ÁÏSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberó£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ 9b91f6aacf70450bb36bf07cc9588dac@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpï oEO°`Eàfô¦µ“(C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜OEo°E`àfô¦µ“(SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberô£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ 9c42ff2a7d334c8e9a168e131369a297@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpð å Ú3d~C·?PD™Á­¹C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜3Ú å~dC·?PD™Á­¹SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberõ£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ e756b252dd8b45b89ac4614e6a7f8b91@@@@@@@@@@@@Su  3Ho there! SÀ" Rpñ ç&F´œ·B‘cÇGši8)C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜´F&çœB·‘cÇGši8)SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberö£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ 5d9e4fed9c8841f9ac856355206ae1e8@@@@@@@@@@@@Su  3Hey there! SÀ" Rpò zíèÕãEûF¡zâ÷ætC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ÕèízEãFû¡zâ÷ætSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number÷£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ a707996655e846078df696374be3200f@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpó ¦ÁÛ±WI®}×IL:C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜±ÛÁ¦IW®}×IL:SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberø£x-opt-locked-untilƒ`f¥–ŒSsÀ/ ¡ b423e35ac3e64217809b26daa95471d4@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpô üyÜú„¬Lˆ=s‡‚kaC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Üyü„úL¬ˆ=s‡‚kaSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberù£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ bc9490b246924d1f9425da265d8cf0d9@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpõ ^]æ/nòFH†lI×Lä+C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜/æ]^ònHF†lI×Lä+SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberú£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ 839c628a652e4810b07dd78a23f80964@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rpö ã pƒlÏÇF¼jÞ-ŸlÕJC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜ƒp ãÏlFǼjÞ-ŸlÕJSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberû£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ be39ea4945f3400589bd77a7820a40d0@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp÷ ¿A’¾ëzG¾¤[á%C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¾’A¿zëG¾¤[á%SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberü£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ 9ff1907d07af4966aa8f44bff9e6014e@@@@@@@@@@@@Su  3Hey there! SÀ" Rpø a:Ž—.%M··ãËjä×C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜—Ž:a.M%··ãËjä×SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberý£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ 4b7741a1fd574b4bbb714c32cbb0b501@@@@@@@@@@@@Su  3Hi there! SÀ" Rpù ƒ®šúë*A‹üsð•„C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜š®ƒëúA*‹üsð•„SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberþ£x-opt-locked-untilƒ`f¥–»SsÀ/ ¡ fdd88cd95d1b439ba28c642f268469e1@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rpú #6¶ÙÍ#ïB®wX¼Í×iûC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ù¶6##ÍBï®wX¼Í×iûSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-numberÿ£x-opt-locked-untilƒ`f¥–êSsÀ/ ¡ 7939b9854c6b46919e7cea62f3dc98d5@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rpû À¼' ¬M¥KCC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Á¤Ôü¯Já›ÊÇA>KCSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—SsÀ/ ¡ 296e6ba15ac74c51941e52378388e9ae@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp ë‰³+œKš4(H㱸]C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‰ë+³Kœš4(H㱸]SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ ba8a8f356f3d4240997deeaa42f7e5be@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp ¢“Œ[@ôòE²‰g‚êwÁC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜[Œ“¢ô@Eò²‰g‚êwÁSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ 025c69be6e5544de948f78c53cbf3cf0@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp rÂ³ÏØi_A¼²“DÚ€C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ï³ÂriØA_¼²“DÚ€SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number £x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ c15045efa07a483da00dc3355fc59711@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  gÆäžÏMª°I3å*EC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜äÆgÏžMª°I3å*ESrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ 4fae76a81a7f4e6e8e6263f480e15e32@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp  5§@$V2åAh„lÃïC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜$@§52VAåh„lÃïSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ 3050ba68f4154b349e21e5ea2a85e4e1@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp  í þåÉ $Hºš„±ëC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜åþ í ÉH$ºš„±ëSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—HSsÀ/ ¡ 3f51b158dd46453a9ce879f0c4846d70@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp  Š Ñ—µ±7A“ˆ‘n°éC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜—Ñ Š±µA7“ˆ‘n°éSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ c87d6b35f70949119c29833590b3ab1d@@@@@@@@@@@@Su  3Hey there!SPLIT  SÀ" Rp  Ð Ù*„ÃëM¶ÏR軨w\C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜*Ù ÐÄMë¶ÏR軨w\SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ ea25bd71c6ca43e0bcab9fc1b228a496@@@@@@@@@@@@Su  3Hi there!SPLIT  SÀ" Rp H`.R#MK¶á ½ †C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜.`H#RKM¶á ½ †SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ 843abd4414894823b6a59ce0f62fa429@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp T=dÛÎñšM k¾ Z‚C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Ûd=TñÎMš k¾ Z‚SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ 4c6e578d4e024e13916b9ad06a7b8f08@@@@@@@@@@@@Su  3Hey there! SÀ" Rp ñ;å‹E‚.D¥Øª&?z³ùC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜‹å;ñ‚ED.¥Øª&?z³ùSrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—gSsÀ/ ¡ 516987c6da1c443faacb27738c5bffbb@@@@@@@@@@@@Su  3Hi there! SÀ" Rp ¿ëXv*`I«Àiâ‹C@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜Xë¿*vI`«Àiâ‹SrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—wSsÀ/ ¡ 4906a1a0e0974c549ae3cf780faf1b1b@@@@@@@@@@@@Su  3Ho there!SPLIT  SÀ" Rp Vó¼šÓ®Mµ9¼ì " AC@B@@@@ASpÀ @PpH@CSqÁ$£x-opt-lock-token˜¼óVÓšM®µ9¼ì " ASrÁ\£x-opt-enqueued-timeƒ`f¤‡j£x-opt-sequence-number£x-opt-locked-untilƒ`f¥—–SsÀ/ ¡ 37695c45fc5d49b4b7d195177fcc1bdc@@@@@@@@@@@@Su  3Hey there!SPLIT e4063e48b335be243c64ab5c2436e69c79d65e24-3000066400000000000000000000013171454613650200347300ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJa ¿½ vzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb7-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineNamÿ€WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?e424101173ab9d77610c6e6278885f0ce1f4ee46-16000066400000000000000000000005201454613650200347270ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqï¿€Þ½ vzÿÿQrˆ@Þ¿½H VfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@e4a65d52f12ed51f48a4821a60dc43e2beaa222c-9000066400000000000000000000001441454613650200351730ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿×½ÿ¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ï½¿ïUB{XfLCB@P€(À ¡/@@@@@C€test@@@@@@@c@@@@@C€We65b7fdd32a475d1f7522c0e2313af9339147dd2-15000066400000000000000000000005201454613650200350540ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e114eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`Rp½ˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/¿ñ½¿ï½ï½@ï½Ûï¿ï½[]ï½@ï½Ûï¿ï½dwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@e7cb29b8b78bdf37c73ed63a009c04291f8a603c-3000066400000000000000000000001171454613650200351410ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR ”äYÃ?–?AƒÕðÔž‰6÷C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nlH£x-opt-sequence-number™£x-opt-locked-untilƒ[£ná‡SsÀH ¡$f5b39d65-785d-4f40-8106-52c089dab354@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ Ade9714837e540993ca2903e9fdb7d49b7deb7fb64-4000066400000000000000000000001441454613650200351160ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ïÝ?ï%Ue11½¿ïrUIY½¿ï½¿ï½¿ï½¿ïUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@e9c47402bb4ae2d0a027c9fc776e44bd5699cbd6-6000066400000000000000000000005201454613650200352260ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJa ¿è vzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@eb7d453a68a67a27d76c39c6552a668593ee37a3-6000066400000000000000000000001441454613650200347500ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ï½¿ï XhØ¿½Jð¿½ïǽDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@ecd626468439bf92d670b67d55650b32c385d43d-3000066400000000000000000000005201454613650200346540ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS@À ¡/test@@@@@@@@@@@@@C€@@@ed75d767c99d0fd439abc172d751ff9eabc2a457-5000066400000000000000000000000771454613650200353300ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?AS@À2à/³MSSBCBSYLIN  AE Lefb2c2171765ec68ef9075d38ea227499c7dd5ab-9000066400000000000000000000005201454613650200351660ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?@S@À2à/³MSSBCBSPLAIN ANOMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(Žžµa ¿ vzLXqz¿½]UIYv@�HYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@f18a90e5a3de96b36fcd5a80c089475463843d5b-11000066400000000000000000000005201454613650200350720ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(ŽžµÕ ¿è ½¿ï½¿ï½¿ïIÛvaIujDpHŽžµa ¿è fdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@f2075820bb0266586c3d1a1276684c23b2007c08-5000066400000000000000000000023261454613650200344020ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusIÖyT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT SPLIT !PLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`Rp@@@SPLIT dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-numbercomplex128x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-loc{ed-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Servsce Bus Explorer+@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC ="utf-8"?> Hi mate, how are you?SPLIT f272724428d4994193fd9ee58ab8b294a7145a56-15000066400000000000000000000005201454613650200346710ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿951_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT d¿dSÀW¡(pq*½¿ï/½¿ñ½¿½¿ñ½¿¿ï½¿ñ¿½¿ñ½¿½ïexeUBrVfäØCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@f29612a5be71d73a5ba05144ac9b0955fbdc5416-7000066400000000000000000000005201454613650200350440ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pq�ڼ��q�]UIYv@�HYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@f39410c5b9a4da906421e55444a7e0abc5913f26-12000066400000000000000000000001441454613650200347650ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀ¡(p½¿ï½ß¿ï½¿ï½¿ï½¿ïÿÿÿ€½¿ï½¿ï½¿BrXfdw`@CB@P`S(À ¡/test`@@@`€@@@@@`@C@@@@@@`@f3ba74c9ff1f1325d9a79671f2319316319b2406-5000066400000000000000000000005201454613650200345640ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJa ¿½ vzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@f5428f7743898514d1e9940eea643a9b0706bdb0-4000066400000000000000000000005201454613650200346540ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJa ¿½ vzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@f556bccfab4b9337e19ddd20a2cec12de10794c0-2000066400000000000000000000000101454613650200353260ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusSSSBCBSf566968ca39df58418becb6ff9e03beadc1c6272-5000066400000000000000000000000771454613650200353310ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?S@À2à/³MSSBCBSPLAIN ANONtMOYS" Uff6609ef31e8cfd0058d663115915ed9c165e9f28-4000066400000000000000000000001441454613650200347470ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ï½¿ï%UeXhØ¿½J�ïǽDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@f7991bc3dac2d71a4163b5c50350cae7b6ffffee-10000066400000000000000000000000771454613650200355160ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?AS@À2à/³MSSBCBSYLIN "êMMOYS"ääf7bd5d1c693735c6d0ef4968f1c17f36a2fbfed9-8000066400000000000000000000005201454613650200353300ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad79Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJaÿ½ vzLXqzQrr@Þ¿½HYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@f80a552cb6f7f810dbe9237a13e12686391d1ae9-8000066400000000000000000000001001454613650200347760ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus@S@À2à/#³MSSBCBSPLAIN ANONYMOUSb520e114ef92b6e344c580eef02c253d450efb40b9e1cada9-6000066400000000000000000000001441454613650200352710ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ï½?ï%Ue11½¿ïrUIY½¿ï½ï½ï½?ï%Ue1VfdwCB@PS(À ¡/testC@@@@@@@@@@@@C€@@@f9308b8c371bcb1c8d1861f4b6286ea49c4bcb15-2000066400000000000000000000013171454613650200351410ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀpqaJaBRgAvzLXqzRrrUIYv¡IujDpHYjxeUBrVfdwCB8PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH a$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?fc2f56081522af158f9ad639c26f8a9a47b54a5f-12000066400000000000000000000003461454613650200351600ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT S@`RpˆRRÿ@@@fcb31c6fa710a5beca970da7d5a8064543f28a56-7000066400000000000000000000000771454613650200352160ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus?/S@À2à/³MS PLAIN ANONtMOYS"  ffcc9811685bee9473199e083dc8f97f2d0237aa1-8000066400000000000000000000001331454613650200350300ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus[S@À2à/#³MSSBCBSPLAIN116415321826934814453125 ANONYMOUSb520e114eaa9fedf9d9e90b67fc3b6603654082a1ca71bd32309-8000066400000000000000000000005201454613650200350630ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaaSa0bcad76Ja ¿988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pqaJaÿ½ vzLdrr@�HYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@ff11ac326480df85bb20d7f3656e0a1889f13ce1-10000066400000000000000000000005201454613650200351270ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e114eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT ddSÀW¡(pq*½¿ï/½¿ï½¿ï½¿ï½¿ï½¿ï¿ï½¿ï½¿ïexeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€b@@@ff7183599dee169858f15e5a4b64266664f3555e-12000066400000000000000000000003461454613650200347140ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusAMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6ab520e11'eaaSa0bcad76Ja ¿981_G0@p`p©€@@@@@SPLIT S@`RpˆRRÿ@@@ffd20a11919dc1e6165229aa97ade206d14f8020-4000066400000000000000000000001441454613650200347570ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpusdSÀW¡(pqa½¿ï½?ï%Ue11½¿ïrUIY½¿ï½¿ï½¿ï½¿ïUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/s2-0.bin000066400000000000000000000000101454613650200305550ustar00rootroot00000000000000AMQPgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/s2-1.bin000066400000000000000000000000771454613650200305730ustar00rootroot00000000000000?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/s2-10.bin000066400000000000000000000005721454613650200306530ustar00rootroot00000000000000zSÀ CR ”äYÃ?–?AƒÕðÔž‰6÷C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nlH£x-opt-sequence-number™£x-opt-locked-untilƒ[£ná‡SsÀH ¡$f5b39d65-785d-4f40-8106-52c089dab354@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/s2-2.bin000066400000000000000000000000321454613650200305630ustar00rootroot00000000000000SDÀ P Welcome!golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/s2-3.bin000066400000000000000000000000101454613650200305600ustar00rootroot00000000000000AMQPgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/s2-4.bin000066400000000000000000000001061454613650200305670ustar00rootroot00000000000000FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/s2-5.bin000066400000000000000000000000371454613650200305730ustar00rootroot00000000000000SÀ`RpˆRRÿ@@@golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/s2-6.bin000066400000000000000000000001441454613650200305730ustar00rootroot00000000000000dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/s2-7.bin000066400000000000000000000005711454613650200306000ustar00rootroot00000000000000ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/s2-8.bin000066400000000000000000000005721454613650200306020ustar00rootroot00000000000000zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/s2-9.bin000066400000000000000000000005721454613650200306030ustar00rootroot00000000000000zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/s2.bin000066400000000000000000000034311454613650200304320ustar00rootroot00000000000000AMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSDÀ P Welcome!AMQPFSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SÀ`RpˆRRÿ@@@dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?zSÀ CR ”äYÃ?–?AƒÕðÔž‰6÷C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nlH£x-opt-sequence-number™£x-opt-locked-untilƒ[£ná‡SsÀH ¡$f5b39d65-785d-4f40-8106-52c089dab354@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/s3.bin000066400000000000000000000035251454613650200304370ustar00rootroot00000000000000AMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR ”äYÃ?–?AƒÕðÔž‰6÷C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nlH£x-opt-sequence-number™£x-opt-locked-untilƒ[£ná‡SsÀH ¡$f5b39d65-785d-4f40-8106-52c089dab354@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/conn/corpus/session1.bin000066400000000000000000000012541454613650200316530ustar00rootroot00000000000000AMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSDÀ P Welcome!AMQPGSÀ: ¡$83a29bedd884468ba2e37f3017eeab1d_G29@p`p©€@@@@@SÀ`RpˆRRÿ@@@dSÀW¡(oJnNPGsiuzytMOJPatwtPilfsfykSBGplhxtxVSGCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@ySÀ CC F>Æ\&úEœ¨Žçƒã;C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[œ_)Ñ£x-opt-sequence-numberx£x-opt-locked-untilƒ[œ_ŸSsÀH ¡$5e84053f-81c9-49fc-ae42-ff0ab353d998@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/000077500000000000000000000000001454613650200265725ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/000077500000000000000000000000001454613650200301055ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/0.bin000066400000000000000000000000101454613650200307250ustar00rootroot00000000000000AMQP0599ed0e0d15c60a61a5a72de5e4f25413131a69-1000066400000000000000000000000031454613650200353600ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusU-072eec62237447080a496a86c9e09b2e8b557483000066400000000000000000000000031454613650200350420ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus0957b28b299576cdf11b943b65ec8a5b086bd103-4000066400000000000000000000000031454613650200354110ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusp09cb1825f3363f3fa2d272f674dd14b09c2833a6-21000066400000000000000000000000141454613650200354600ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁ@@Q,q@Q,09fc99a59ae5e33c8a27a2e51ad4b897d28ea39e-7000066400000000000000000000370051454613650200357450ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSE19fa2641519e21293094e9d767ee1237f9e0715dc57172794867c3bbe2cb647f9b28a8d3f85c0ff557b91bad66f5ea16e0107757b0277fdd3ca05bf47c19bcb92a958a57e8c142a51af29bddb20af84377b6db65f77494e0dc4d2634a776b3a5d777319873bc0dacbbd4b9ebccfae849fa7e9769cdf54660ecca0d5cf4fa5190713726d54d02b3a3f21857125b8a808c0ca2f99d11dc430ed5113ee49ff8f00bcc08f0370dd510e8100e1285659a7b2c7457a6049f2af7786c4db1471ce5bd164e11c7a2165e83e03a135ae2b3429f82f677de044a067e99e0bda2d65a7270d629c00e1d528212d3aeb2896e58ee5145a93ed06a9c00705ad5c5988d3a192304c1d17661d45257c5d16799ef70771964435b12e3b2ee9d5b467c3b1992f45b7a59871b40d8daa1c280747ecb3d170257b91df1f549ce6d66455b5b6f60b7c6e95c92a67e20cffe8599ceb183de53f1dedfe19bae836447af8e053ba419660e0912cad064d6125b9e978e8d0d5f28f8a4e43ca3cdf2d4c0e9a11221d8184e9eb6c90761b0beac82d0d22793279aedb1c7db3632adbee323bc3bbde4801152694831abf5676979af26af7dcbadfba1cad1306b635840cbca76c558b37db0803b4c12befa27d16f21506b07ade4a838d6beba1816eb29ed5e3c4f132a752fc742747bd9ba879156e87e6c1584e911da9f796e1fa4a055e427272559e4bd6d0f54b8257100f8a55d84c27b702bb1fe2f995425c85fd48b0a0610db5b39f7a5031407a12dae9f508b21b1378f14952d1beb2dea81d016b2d9b7f1a67b814569b69c0e619adea02a8683242d63a11d3317d060e5b4d85df5ad73127541ba5314715d187990735aa81f438f8b94070ec506ba536274d98b766c1694e54367891a602b99e370425b47a70b819277a249fa429c5bbd0530267f987e6022f25030c30f3baeedc0d13c95f3d5e4b2b87465d179a3a23b9f9e76a42ceea55226ce072f9488392f40621289124d786109d2498e74fb37e2ef466fe8bf3016d96e34204c32978775765aa80461cac48518157f86d59f6187bad4ee62fba1ddbe166b29452f4a59af1e057300c353440644a8e40ae8171ea028be2fa315804abf518847c7945e8228b7766cfdb08d3a3116b59aab8e94b6d8c8c9ef442c2dc7f923bc2cd3e5c663baca7dded976bf191fe36da16948c89c385fe71434f4aa5dd15fe0e925d2459e3b068b9d82a9cc8b8f9786bd9f5fef9baaaf2d67027d9bfd58bb2c58ec7c746b747ab62f9242e4b53ed14d6fc75f5280eca0de23717c97a2293826e19cc8eb47f946421516c349dc4ba49225b91e4e868874bdebd373700df1f3792aaa140597e58b88f90e163397dbad3941705b53d754e3e0c9003df836a7fb8d23f40362fcb5f3947a4281b24240be4ee89aa8e917b194f94345eeca224df0adc15f22a617b6427f29410bc48ea3f92216163785723efc36301d23ed52780c6fd7924bcfaa03269b13582b7c7ea9c0e4a451f38a469fbdb585dcb7c81452da77945ebe27eb26ff6e8c7b2decea289aac5af74746dc257c9bea44a0847f02c4f586e1d76f39d5bf952355a0875f177a666d1d354ad86ce5ec0aba2c2b20cab050eaffd31095395132f5af80a2d2d53b77bda49f948bbb37bdf31c8a690476488e14e542ff6841e7fbfc2eb84795696562d079dc1612274b6dff362567084f793f0bc2dd8de23392d05aeeeeac6991c9f74387153a4b7da94790375e336a00c8293bad0fcef2dd1880e7094e2e53f738247c860780ebe308410ca02ae409ae720e841f48c9677acc6e7d4ccd18c219c400f8b7e1257f692e09eaef96802b17a1cb7d93eb81d3bfcbc7af4cdf05b98e22556b3d1a8b56d6d819fa2641519e21293094e9d767ee1237f9e0715dc57172794867c3bbe2cb647f9b28a8d3f85c0ff557b91bad66f5ea16e0107757b0277fdd3ca05bf47c19bcb92a958a57e8c142a51af29bddb20af84377b6db65f77494e0dc4d2634a776b3a5d777319873bc0dacbbd4b9ebccfae849fa7e9769cdf54660ecca0d5cf4fa5190713726d54d02b3a3f21857125b8a808c0ca2f99d11dc430ed5113ee49ff8f00bcc08f0370dd510e8100e1285659a7b2c7457a6049f2af7786c4db1471ce5bd164e11c7a2165e83e03a135ae2b3429f82f677de044a067e99e0bda2d65a7270d629c00e1d528212d3aeb2896e58ee5145a93ed06a9c00705ad5c5988d3a192304c1d17661d45257c5d16799ef70771964435b12e3b2ee9d5b467c3b1992f45b7a59871b40d8daa1c280747ecb3d170257b91df1f549ce6d66455b5b6f60b7c6e95c92a67e20cffe8599ceb183de53f1dedfe19bae836447af8e053ba419660e0912cad064d6125b9e978e8d0d5f28f8a4e43ca3cdf2d4c0e9a11221d8184e9eb6c90761b0beac82d0d22793279aedb1c7db3632adbee323bc3bbde4801152694831abf5676979af26af7dcbadfba1cad1306b635840cbca76c558b37db0803b4c12befa27d16f21506b07ade4a838d6beba1816eb29ed5e3c4f132a752fc747bd9ba879156e87e6c1584e911da9f796e1fa4a055e427272559e4bd6d0f54b8257100f8a55d84c27b702bb1fe2f995425c85fd48b0a0610db5b39f7a5031407a12dae9f508b21b1378f14952d1beb2dea81d016b2d9b7f1a67b814569b69c0e619adea02a8683242d63a11d3317d060e5b4d85df5ad73127541ba5314715d187990735aa81f438f8b94070ec506ba536274d98b766c1694e54367891a602b99e370425b47a70b819277a249fa429c5bbd0530267f987e6022f25030c30f3baeedc0d13c95f3d5e4b2b87465d179a3a23b9f9e76a42ceea55226ce072f9488392f40621289124d786109d2498e74fb37e2ef466fe8bf3016d96e34204c32978775765aa80461cac48518157f86d59f6187bad4ee62fba1ddbe166b29452f4a59af1e057300c353440644a8e40ae8171ea028be2fa315804abf518847c7945e8228b7766cfdb08d3a3116b59aab8e94b6d8c8c9ef442c2dc7f923bc2cd3e5c663baca7dded976bf191fe36da16948c89c385fe71434f4aa5dd15fe0e925d2459e3b068b9d82a9cc8b8f9786bd9f5fef9baaaf2d67027d9bfd58bb2c58ec7c746b747ab62f9242e4b53ed14d6fc75f5280eca0de23717c97a2293826e19cc8eb47f946421516c349dc4ba49225b91e4e868874bdebd373700df1f3792aaa140597e58b88f90e163397dbad3941705b53d754e3e0c9003df836a7fb8d23f40362fcb5f3947a4281b24240be4ee89aa8e917b194f94345eeca224df0adc15f22a617b6427f29410bc48ea3f92216163785723efc36301d23ed52780c6fd7924bcfaa03269b13582b7c7ea9c0e4a451f38a469fbdb585dcb7c81452da77945ebe27eb26ff6e8c7b2decea289aac5af74746dc257c9bea44a0847f02c4f586e1d76f39d5bf952355a0875f177a666d1d354ad86ce5ec0aba2c2b20cab050eaffd31095395132f5af80a2d2d53b77bda49f948bbb37bdf31c8a690476488e14e542ff6841e7fbfc2eb84795696562d079dc1612274b6dff362567084f793f0bc2dd8de23392d05aeeeeac6991c9f74387153a4b7da94790375e336a00c8293bad0fcef2dd1880e7094e2e53f738247c860780ebe308410ca02ae409ae720e841f48c9677acc6e7d4ccd18c219c400f8b7e1257f692e09eaef96802b17a1cb7d93eb81d3bfcbc7af4cdf05b98e22556b3d1a8b56d6d83bb5f5724696f8f329839dbe477483ec3c09fa2e0628faeba1bf285c224bea3f6cdc7bbd768133c6ef1da14f248cc3b819b196588811b073a7291817bd1e89c65760435d8d17cbf9423744a92143e0f956e2977b39c54fdead5a57f3a04a0facca01bbf44d3b1fb9c4fa83ae1046985e3f26aa0a437999004dd8adc04c5111759849f919b93558dbc559173a23b069b59f800096d9fcf077c7640f59170bb9a6fffe64778bac272365d27ea62aa956559e90edd3f6393cc8775597bcf7d91990ab9511973d948324a27261059e93f4b5dd2f70caf12e1a08e0493cb05588618764391f355379578cf94dd33e616136eea997ec11c0d4ff064ff51a767e5558433a2e3a9a74c232d8e187f47b8cca010709eb9fea0dac8f1ea53bf18822e154ecd929c83b0eac366e30fffbd5ba6a46d734f58d26e7f5df538e18b3d827884aa857a680823131bcf30a76f1a555bcabb17b02b53aefad96fe76f7312da69719434c580d3ff1bcdcd594e6375935003d5d732cc577e11ea2abb1d04259f50aed4c3af9866e8c4a52a09809046ee330f05c4403acbc297a9416c5208fadb31ed4eb7a3b01b87bf08c75cf44c2b0df84df30872d021d6567ea649859268e5e1b5b6405e1b41e350a32c1af13722959c17c01b52c42241313b26b25995a1c89a53e248488724d280647226195746901929501df36d1e94815d7fe6c4ca2731f3181293217f71b9d7f59c2474856972013924ae4796db4cbd22d8905a6043c959941ca6b556c53d1688c439036c715d33a47a7dfc2fe40e53424c5093020d2e85e4b04aa4c704ea5bfe5a2384878da38319c59d41d66b6add2a443d9ea11edd8d18fa41004251653857733b388b453943eb33df93dcd5d549757fa2967ef0f9a5105836c48826c47fcccb2d9bc349032b286962136b848632bdcf186a08cbeaa52d195efcfc3a440bac154971d11ff4994f293b14fb8c3214ebe7ab8b3d0f2fe0b03ed7b145fafd7730a173e3cc1847f0cdf2cf629f5ea81a07bef716b1a67dd9e3b7a52fea1aaa7a393f53b5bdb5988df78a57a9dad19a8253316835acab8a6b9a9fb42d97bf29b2443322f46de386fd82bd3453ed68e2370c6eac4497b1bde7b42d569c452f377bd38bd50fa5a6792ef5c9ec6c647001149b86fedb3e2f18d4271e9cc4801aa16ecddb31b6a795fecabc613bfbc8e4f5636d71e74595c841fd11b6a6bc7f169317c1added56b82a71fc36d774bb4d661685363e9da5fd2e1f357006dc5b5bbf8b42ee3f869e75a541586fba558a8f490d641b78c27368b9b4c2db046354e9358ae9140e91cd95ebeffc6c0d2676a3ff4ab10d463bf32bed97023a80a79df191ab9858c43537a03072a17c30b1bd99efbd361590ed6b7d5b0ec4e2326fa35904ab9a48596f44491cbbc0112890f9386ed04dec30126be359a05e99b2b77fa2c8f6b7460a6cd590d71c73b2a1b23312ff89306b6e41c76ddc0a099bfa79498e36ae5cf0c560b8854dff32d2b690ce0ac4aabfa723ac6f2e97ad1083235196b464ad67fdd649aec01695d55c8b4bb198f30630ca635aa5a1915f3718341bcfd8b522f764015fa5479004d28eceea7fe67df7ee24a97a9708d528b89589f1899f13242a0d00f7464c3cdfce213699340e754533b934f4a8410224e111f31cf8e54d7b5e90cd8c68bf96edbc8d183894deefdf4fcc1a83162a3f6341dcd9a9aecf171c0df28257a68b1af1b67c54c43c3cff27fed89cc64bc46e23a49ec74a9efbab7981d9f0a018247441e4f0f5b5f68ba9325582f92de4cca4a5f878a0c5c387581e64324e3246d8f3205c838a29f1abeea24446e496421f0e742d411adb55f70272ae4a992e825a3d327e44b8b3762b25aa451d07eb4eac0322b431fa676462632daba2aba7bdeee1b438f051d21d4b1897e2ac2f95ee7c23f9996a805de8fffb3b30b855cd6c5b84c011accf4bf94d304d944079f04b5cadf8fcd6751c22a0f9165ab98998b2d89e6514641f1f3b91b8c0bf057d69c3d893fc4e041e06a2229e2ee58082ffb58cb920972ede58483287d0ace94c1becef26a410b93e4ff402e61dcc574b790d49679f18f4e2004f8b7cc357faba34a80e56821bb5b883d1a8b49c6605002152f270bbc36bc79095644e29ab08cc988deda765d67e4fff12b726d5de135ff9d0cbd9d5f9d440e548836633b93a38330d638468b59a32642da3375cdf70b062d14b46a78569c24a706e179baa2058dcae5c61fb6cadd9e015b017f26e9dbe3e6366cf5f1ec839aa3bbb21dd6c9b8e910245fa95b09b7d6cbf08a4c6c84bef257a70389be962dad14d97a893c128b73bf6580689e540d004f21edf8403f36b1ad7c9a2e83ffceb141af59700c316c8c1e3347187f24819c2ff0c9f9a2360dce354f3374374eab1643d2d8831310a8e3ca6768200ea7759822b82f7027cd450479fcc7f6d04802b15735a137ad489f1e1ee78434a253a9dd16684ad58fc91960cde6754f82e8b38edd5e798fdbbbf8fc2e2380a4e21dd94f8c1c063b18f29d8cd8d89f65deac5640799d4ca2caa29c1e72ad8bc417490d11e4051d94956fbc74289857e5f8e9e87b9a2d83074a994de0b10bc7782f6650cfbdb8c835c81cd88bdce5f04ca939b3c5cd010d4dc5d51224fcacbca9851694b8bf55b22dead859d023eee5a7ad3436a912c3fc0284456d5d72ea5f1afa8545c856676ac2dd9a057028bd3ca0f50e7070fa74152f13997c95c1834c3e67504f1a4165d2b49a96919b88f72caed60f56ca7ab5a3204fb12ad3592c725fdebb048732fc189c7dfed185c6c184a626e07d7356860d00389862d5b9701eaa4e5f7889e6db0f54633369b8d26805c08471de8fc3f8fa1fb0b0711d9e015add5373f7f8b64abaddbac3399c756244b1b07c579d33e4967e5e0cf16de29cb8a7efad07ff9039ca305772a6e45c76bd9b77e24949556766a8b8425c5e595efb431bde4ee222f9eb3fc2d002a1e2d14db2b23135266c942eea33bffd30eb0218405373240e0cd3040436ca895093bf056fd001c00ba59d90502042e6e6c0167105051628895c8164c9ab959400898309cabafdef12be53604fa57df44e0a90a81bd63c331291a93bffefe809e80db0679568f6e94e0d8e2edec0087c35bcb3c4f4725e6013bcf197156cd9d90612423348123383e45c14d27d8833f56ddb04083c069fd6e282fe69c940840f5f747dfb72ad72fd8cf9f3ded15c9e2f4727fd60b4f40e95dbe77a89b47dde7d5326942600554905d9dade9d145ab6da802643f2081678392609c2fdd1b79dd8caec137cbed315374c6f05c0758070f3bb17e23d81ccc39c6aa89913897e487fde889c5aacd422278f8571641cc4f0a93d9768aef9e45d6bd187d1ba637ce0fbd3c573d6778cf7bf5188c00dcdf13be3fd599143952b376220283e34e014e83b214bd5f64eb0ecb098ae8bef883949907cc36e22ece60b893b963cfa73d120513e285aaf70ce5add34edbdac60b3aa7b385b90e339058fb9b3cf984b06f79788016035c5ce490f2de7995b98a8c1c9c80f29603ae2b7fc41886663163e604275cb085f8453b27f4d795b9bad19ade2f98a1c99b43a7581bd991e5d0e5e1a6e713acc522ba9fe8302658a9782558e35436e714ac6bc85ad1d3cd008f24106901fa954f5fefb61210d6f8dc9ff35c480f1d14e59c0e501917a31ee9d00c6bdb06a00af5a8b08c3928cc5f37476248223627cb77eaf0e96213cb0a13e97d3fe9b9814d462690e8d68d02655a32fc271ee73db4f88a33386ea88a5857e15a28d9b3e3a96f00c7cd85aa53f9282ab8c8ca6d6a8afed43aa87fe7fc1ad59b0f0db2dd25c20af96e8c282c19fc883ef01a4060398926a1c82f07bcd3bc314580d7636b623b7bad8ddba05850291a6344df0f346fa4a321a85ee3e9c3bb5f5724696f8f329839dbe477483ec3c09fa2e0628faeba1bf285c224bea3f6cdc7bbd768133c6ef1da14f248cc3b819b196588811b073a7291817bd1e89c65760435d8d17cbf9423744a92143e0f956e2977b39c54fdead5a57f3a04a0facca01bbf44d3b1fb9c4fa83ae1046985e3f26aa0a437999004dd8adc04c5111759849f919b93558dbc559173a23b069b59f800096d9fcf077c7640f59170bb9a6fffe64778bac272365d27ea62aa956559e90edd3f6393cc8775597bcf7d91990ab9511973d948324a27261059e93f4b5dd2f70caf12e1a08e0493cb05588618764391f355379578cf94dd33e616136eea997ec11c0d4ff064ff51a767e5558433a2e3a9a74c232d8e187f47b8cca010709eb9fea0dac8f1ea53bf18822e154ecd929c83b0eac366e30fffbd5ba6a46d734f58d26e7f5df538e18b3d827884aa857a680823131bcf30a76f1a555bcabb17b02b53aefad96fe76f7312da69719434c580d3ff1bcdcd594e6375935003d5d732cc577e11ea2abb1d04259f50aed4c3af9866e8c4a52a09809046ee330f05c4403acbc297a9416c5208fadb31ed4eb7a3b01b87bf08c75cf44c2b0df84df30872d021d6567ea649859268e5e1b5b6405e1b41e350a32c1af13722959c17c01b52c42241313b26b25995a1c89a53e248488724d280647226195746901929ÿÿf36d1e94815d7fe6c4ca2731f3181293217f71b9d7f59c2474856972013924ae4796db4cbd22d8905a6043c959941ca6b556c53d1688c439036c715d33a47a7dfc2fe40e53424c5093020d2e85e4b04aa4c704ea5bfe5a2384878da38319c59d41d66b6add2a443d9ea11edd8d18fa41004251653857733b388b453943eb33df93dcd5d549757fa2967ef0f9a5105836c48826c47fcccb2d9bc349032b286962136b848632bdcf186a08cbeaa52d195efcfc3a440bac154971d11ff4994f293b14fb8c3214ebe7ab8b3d0f2fe0b03ed7b145fafd7730a173e3cc1847f0cdf2cf629f5ea81a07bef716b1a67dd9e3b7a52fea1aaa7a393f53b5bdb5988df78a57a9dad19a8253316835acab8a6b9a9fb42d97bf29b2443322f46de386fd82bd34ÿed68e2370c6eac4497b1bde7b42d569c452f377bd38bd50fa5a6792ef5c9ec6c647001149b86fedb3e2f18d4271e9cc4801aa16ecddb31b6a795fecabc613bfbc8e4f5636d71e74595c841fd11b6a6bc7f169317c1added56b82a71fc36d774bb4d661685363e9da5fd2e1f357006dc5b5bbf8b42ee3f869e75a541586fba558a8f490d641b78c27368b9b4c2db046354e9358ae9140e91cd95ebeffc6c0d2676a3ff4ab10d463bf32bed97023a80a79df191ab9858c43537a03072a17c30b1bd99efbd361590ed6b7d5b0ec4e2326fa35904ab9a48596f44491cbbc0112890f9386ed04dec30126be359a05e99b2b77fa2c8f6b7460a6cd590d71c73b2a1b23312ff89306b6e41c76ddc0a099bfa79498e36ae5cf0c560b8854dff32d2b690ce0ac4aabfa723ac6f2e97ad1083235196b464ad67fdd649aec01695d55c8b4bb198f30630ca635aa5a1915f3718341bcfd8b522f764015fa5479004d28eceea7fe67df7ee24a97a9708d528b89589f1899f13242a0d00f7464c3cdfce213699340e754533b934f4a8410224e111f31cf8e54d7b5e90cd8c68bf96edbc8d183894deefdf4fcc1a83162a3f6341dcd9a9aecf171c0df28257a68b1af1b67c54c43c3cff27fed89cc64bc46e23a49ec74a9efbab7981d9f0a018247441e4f0f5b5f68ba9325582f92de4cca4a5f878a0c5c387581e64324e3246d8f3205c838a29f1abeea24446e496421f0e742d411adb55f70272ae4a992e825a3d327e44b8b3762b25aa451d07eb4eac0322b431fa676462632daba2aba7bdeee1b438f051d21d4b1897e2ac2f95ee7c23f9996a805de8fffb3b30b855cd6c5b84c011accf4bf94d304d944079f04b5cadf8fcd6751c22a0f9165ab98998b2d89e6514641f1f3b91b8c0bf057d69c3d893fc4e041e06a2229e2ee58082ffb58cb920972ede58483287d0ace94c1becef26a410b93e4ff402e61dcc574b790d49679f18f4e2004f8b7cc357faba34a80e56821bb5b883d1a8b49c6605002152f270bbc36bc79095644e29ab08cc988deda765d67e4fff12b726d5de135ff9d0cbd9d5f9d440e548836633b93a38330d638468b59a32642da3375cdf70b062d14b46a78569c24a706e179baa2058dcae5c61fb6cadd9e015b017f26e9dbe3e6366cf5f1ec839aa3bbb21dd6c9b8e910245fa95b09b7d6cbf08a4c6c84bef257a70389be962dad14d97a893c128b73bf6580689e540d004f21edf8403f36b1ad7c9a2e83ffceb141af59700c316c8c1e3347187f24819c2ff0c9f9a2360dce354f3374374eab1643d2d8831310a8e3ca6768200ea7759822b82f7027cd450479fcc7f6d04802b15735a137ad489f1e1ee78434a253a9dd16684ad58fc91960cde6754f82e8b38edd5e798fdbbbf8fc2e2380a4e21dd94f8c1c063b18f29d8cd8d89f65deac5640799d4ca2caa29c1e72ad8bc417490d11e4051d94956fbc74289857e5f8e9e87b9a2d83074a994de0b10bc7782f6650cfbdb8c835c81cd88bdce5f04ca939b3c5cd010d4dc5d51224fcacbca9851694b8bf55b22dead859d023eee5a7ad3436a912c3fc0284456d5d72ea5f1afa8545c856676ac2dd9a057028bd3ca0f50e7070fa74152f13997c95c1834c3e67504f1a4165d2b49a96919b88f72caed60f56ca7ab5a3204fb12ad3592c725fdebb048732fc189c7dfed185c6c184a626e07d7356860d00389862d5b9701eaa4e5f7889e6db0f54633369b8d26805c08471de8fc3f8fa1fb0b0711d9e015add5373f7f8b64abaddbac3399c756244b1b07c579d33e4967e5e0cf16de29cb8a7efad07ff9039ca305772a6e45c76bd9b77e24949556766a8b8425c5e595efb431bde4ee222f9eb3fc2d002a1e2d14db2b23135266c94@eea33bffd30eb0218405373240e0cd3040436ca895093bf056fd001c00ba59d90502042e6e6c0167105051628895c8164c9ab959400898309cabafdef12be53604fa57df44e0a90a81bd63c331291a93bffefe809e80db0679568f6e94e0d8e2edec0087c35bcb3c4f4725e6013bcf197156cd9d90612423348123383e45c14d27d8833f56ddb04083c069fd6e282fe69c940840f5f747dfb72ad72fd8cf9f3ded15c9e2f4727fd60b4f40e95dbe77a89b47dde7d5326942600554905d9dade9d145ab6da802643f2081678392609c2fdd1b79dd8caec137cbed315374c6f05c0758070f3bb17e23d81ccc39c6aa89913897e487fde889c5aacd422278f8571641cc4f0a93d9768aef9e45d6bd187d1ba637ce0fbd3c573d6778cf7bf5188c00dcdf13be3fd599143952b376220283e34e014e83b214bd5f64eb0ecb098ae8bef883949907cc36e22ece60b893b963cfa73d120513e285aaf70ce5add34edbdac60b3aa7b385b90e339058f0ac63d775948c95d5ce0029e0439cd0d1c96d104-7000066400000000000000000000000061454613650200354120ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁä`A0ae678d62015b218b412f2653363c6e0d2b944b2-4000066400000000000000000000000041454613650200352230ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusaA€0b7de1571ee1e2db2b56d1df8a9c1df4ce4c31e2-4000066400000000000000000000000041454613650200361070ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁä+0b91ff744f525abb88d3b74a29b82b3461601889-1000066400000000000000000000000021454613650200353300ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus¡golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/1.bin000066400000000000000000000000771454613650200307430ustar00rootroot00000000000000?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNAL163929b4a964023481ac6af02682a1f4e2162fca-1000066400000000000000000000000101454613650200353000ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusS%À@S166e65ff8bb553a9693ff30dff889756c3b23e4f-16000066400000000000000000000000071454613650200356750ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁq@€q18930cbfaea0374b28cd2a4cb9d973d432fe7da6-6000066400000000000000000000000051454613650200357640ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusp�.1a2c08c30eb554d9001adce2f8b7b3ccebfe8070-6000066400000000000000000000010051454613650200360210ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSEì+Inc7d4f8790e4c47d4daecbddf5939973521ddbf3b832e564afc66f03b5583c41c58bd956609dc3ae3c8f7c2213059575236168dba44e3044049f47c9e7840bbd0fd5036062d70e9f567ac1797056ee93c8476f6c959fa09a3ee854166c6fc36c34d6cca7adcb36f435f86db65f4c4a1793b974294914b377fd179e697751c5ac289243c65d8aca93732849c27483da083d4e218652d4fe5fec8cb953ee7f00070143dd6ece97f241b03c0424bfee2cfd2c4e738f2361df0ffe8863dcf763d408a7a167763959b7f985bc1e359a4b22c6899645ad0814bcf69d10c38474978d1c48e482723e3a6bb3f689f980c51c474eb28cfbba91a8a12eb964b32dfc303a1b761e591633b0a163cb3e9d21c8a42d6af591c3-17000066400000000000000000000002111454613650200355320ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁäD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@1c276d3c088886e01cebdfdf746a16c7efeda2d9000066400000000000000000000000031454613650200357170ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusAMQgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/2.bin000066400000000000000000000000321454613650200307330ustar00rootroot00000000000000SDÀ P Welcome!202e913794b9590657efe5dd791edeea94ec3704-11000066400000000000000000000000041454613650200355730ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁÁ2133e04a4706d2f86a3f482a3658d9598cd7cba4-11000066400000000000000000000000061454613650200354730ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁä@@22922a15f804723a972af133e9a30f542719ff81-14000066400000000000000000000001031454613650200352440ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sq22e138a449577c0903371e1d62938f7e560da497-5000066400000000000000000000000051454613650200351250ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁäBe2547cc736e951fa4919853c43ae890861a3b3264000066400000000000000000000000031454613650200350400ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus255a12cab622b4cd01dfe0b9325dd3205287abe2-7000066400000000000000000000170021454613650200355730ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus@228eabb5ad8b4ff13b10d13b27372bc2152dff149859ba47d9c89b741d4a5340d8fff5858a4576c55547007d7e2b3f94583ea8f0976237712bd2e5481c3988f5387e7ac2c3f18718388795b7b2d44b0a13f3faaa55311b800301c9203a511572cf8f349280bbabb9424070f415bbfe28aef8d20329ee842cef4d4c299e619b6ef1cf00718aab2accec9ac00155be2903b6fb07dfe98b0bd8d8580176b99ce4aa6be51cf59046c17ce1817d363fa63af5a241d48bcce064a438651af102ff9c6de4b86374fe24f1dfa66e16e51550dbb791af425d8fa601c70c1bb90e1a557bfe0dde730b0364eba9d2018ee751699ee219e13fa8874070935b29a1767e1d748bfbe796fe4b81a371922962349116906e823605d39fa4b5b885f4610c34d1a090fa4106785e7a035a629958ad1b00cb9d36d171d575268efa1bef064fc0a6dfbae8e532466035a0c2cef96fe9f93b872f0cf804811e927b39818189412868fb104e2d56ae62f77031f0df1ae91aa11826991ca7b8af22f130a47a72cce36ddc319b32dffd294f2e192e490249ea1a6f8437173ce6392d16dda888a98bf685bc91b89b8ee1eabdfb1806fd61f018d1744fe8b03521de4bff86d4a811ca2ecd5be668e9c752a6c26aacc0cc9dd89d112785c25ca6a0a7a5267b4e37457c04a0626c8a29be30ec28ddacf47a84918bab164d07bdedae62132ab04a6f2c4e108eba9ab878caa4a1a7509521d427ad7f3dfa86fae8345dfb5e0d46ce3a94dec84f7880c7422468ea74fe0b4825b8c762b34d5d9b82ba96e0c7dcae01718ccac0044a87476ff031e3ee3c2c13f5f375a841d243c38cd9a354b6525527de1fe7e36a6e2ad95e5bbc4c97e85f8cdcd5341da777e03451838807d5dd2eb4fd15976783c140e21cfc2eb3e58e40c16374de0aecbe3e3d41c64417a472cba18762080a2348ec3f441bf229a932ea0ca7c816938655d0c81b14dfbf86aa600d0c68172fb0046ef51f601ec89309d43ad1eacd583f9d205bb1ff1a37a97b44b5e35be4945f52897eb2a74645b01a7f82054cda44e9fa9f9af9bad1a235155718713bacd08d354f3fdd95858db0040fb551e9f93ae399d5dc53a67e88bcd5a02d104dfd9d824cdd5fe262ed9266fc47b7e640f2c9d9c7a62c6d24b429fa55560aa254a824a0858482e771144d6d5b05539cf71d75bec3a22be75655e1ababec4dff9472a019f6220067374dd49252282e4945a407084633ef9c88d14833bd95335107d36afdf56a642cb739bf0a61ed53a6915baed78e9d74166ebc492b517c7c594fe6564550bb7108f43012551e65fbafc0a9874e46fb64b5b7aee0082a5d617a43b8bf9473309c6761aebc7f13b72ed460b522a6b0875b67353c705f99d1d9dc899870fcc90c632aba1fa9ced6d7a2368dc4dd3d4b38a5807415e00de6b9ea70525a6c1b67d04521efeeefc6c591fc5256d990a1123522864a029430bb7ea00dd80d283fdd6d61cc5b509221e28f73386803d97a38fb0182fd95b3b91353c6eb60ef2b3d5c8c0ab8dc9cd9be2b4cf69450d00e88cb0f0bc9a4be82b71148a37237ceaf945ab94c365625f58171eb15c1bb244a87335550d813d28f241a3296520046e65aff3291555786d7c871ec8a2d10d4b44429041c3cd6ab60f0def742de3d28393c5aca92b150697ac15504ee66d8a2aa01a6c63d7c719d6d4f94af2ed1d8670e3231a0e481095e425e6231c43ad36e3b7a3478f6a61563f5aa13237beb8a891dbb29013c325f7f91c1b055fb83c436fdf8aef49ec457946e6ab7e955427373fd9c743acfd4b9609569b591ec79c7ea7276de103a35a4a8a05c91f59e04689ba1ddd570b18ed046f785d7e4ff9fce7115ac814fe126f781828877208ddfbb2ebc919e6d1f6eb417f38bfbf22ac9633f75e58e560b85d88d0e4fad9b2e68c9ebf9675819d50c30c8982bbbc2f41e02690390bf0e16979b24e648bf15b18800aaef58c3c465f38cfd1e47bf1266c17b69523b7868d2138cb95c4bce0dd3ceb7c2267b868b6e12888d5a489fc0091b295b56a1c328b54fe1119aaf1e6d7dd52fa450b52fbfc8b84c2200ebe209060b655cad288562786673121691809366af37b76567762d1fc24f1fad3128b43c8d10e9b6954b2efcbe40124fc0a5b670dd6dd544e30263a551825282aa06be3817a8eeacf31ca8b25cba011d60b78d3d2462810764e4acb566ff371005f5481c9d36c991527143af2c44cc8cfc59c920bb4a281f2ed4d494d30ba4d900edf59e23be2f763072255cb6f1e8b24ab1d305fbfb2429cff8bda303617c034e71a17230d0e860420dbcf9fea4ab48557e4d50797179496936ec6c97686fe6d9115809e14069244d251d4bc9c8931e47e06ec051e709ba1df526b55d959b37a6f3408833aaac80cfc9cb99915eb7d83e26998f0da2492b986fe0f5047b2cab6e6d33a117df21e6a8ec7f394a3712885dab176a4d6095e5cf75dbd3f0077e5e74b1ff8b902072380cf172562884de852ff5f07c55856224fb3df8eb44764ab9284944b86ab6f176a863cdd0e7ab5616a14692f6cbf41bc63113b27689fc2fb145736aaf2a5b26d2bef3a2a59ef8bb3f3e4d360a4251d0736482e9ed7e189fc48c0973b6649988228c2ac72b23826a61cfa06b11f13c8555be6e433d87e20113eb74c94f0e51719a7b38c59eba300089d06b9bc2a72017668e5aa3153ca4282718f1762642e7c1be1f865cd9b65c6387c8fe496f1e60d5acbb78c2f71cea1f35dc955b1e7d1cdc9ca339765995d9e05dd729cdf58aa2a1451b633c374e5b6c2af1c8486ee4250a875e80e1f359c15130eb1e2575c0c7badb2af61378527fa24347ebb12c10bbb36e3c94619556b2c641d0ebb691b2706cdd667f55b8fff8fb46e3ac72f3682661a4bac2391075ff5145eb07d69d77437adec2d096c1c89208ab3e7a9ea6a0ff4a5bc1846b3683bd7c6ec4520c3c95861a5856b0191e4221c9819c67273c66729728f6035e79c0dae8842df4c0c27ada1ad18b34efcd55b94ef120762e87e8c5afdec80d5788e83f0d1533cdd7aea8f27f33266e007b274f6d48c59bcfad607e8b298be2b17322be88558c60033452826778f167f318b660607bfb2f285cadb385399636acb8f5350d819511b5e7931c5f8483529d3ab3fdb5ae2dde0ada918f1327c6c0dfbbf5ed3c8afef171910dd0169022b3cad5b08084dd5e8eb8ef1ecb17e48bf69f80e3db0ae1cc7b73d94b89696e3c3443ecb4c7ca12568201744d1858d90ff759f2d264d49edf47772bd0e0990c14dcf8c8a4c2dafa44dc6e92f4c66b03bdc4f68f28ca2d0811a433e184cced99a8e5614ca83c46ec18b47e0c7ae91037ae06c6d6d0f3dee19711c21cddafb5869416d23c5219296acda7774891877f3f8d46155d39f43ed10500ede3afa26943b83b800b54a9752250ec6ae173e920002f365d692a9b3a2f9b27124ac97b8e81b70e8c0bb7022d07ee97e962810962b03fc019695b5399f77aab414327cfc5dedd51e99453179c42ae85a42f8e06e0cec6f937224dd019c77c5a0ba32ad08107216a9c758138b730bd5b5f4b613f192839514a8621634d9dbd5840e728c1ef4a2c8bbfadc376dd80d13dcb327ce55ab536a43b570789f5c5e135ac0af79b54232613d0e989ae695aeb358c671ae71d508b58a793e19c58c3d204cdc9a021ecc634bcb0bd6a1917554ea3bd688adab8163260a914fc01d7ce05a497a5c5836cf9401cb6aa35cd008470bdecfb97a511c905badd01bbb4d0c05867661debd2162beeccd52399d5a70a929405293916f33ed0d03f8b850f4bdd77b1fb6283118d71de629577383c81cad086f4099ce7476cb787f73c96431a0df4156f7826fce9045f7e7c97bbfd618b845595203cdc8df4638430fac74a07bc5f773486731d8ad29c06695704cbe2882077a85d543551b7ba81b181ccb93d2b3071b1a38f3c762b42df8246aa64cecbdc772830ac79e766fa99e8c65225f28297a32526df9b51227bd368253737f013ae18435a912bc18cc4a95216ce449865e8bd8bc759dce9d4af52f9e789eafa37023e91946952202dfb7243cab7db2f9f98bb66f19750c547a2bf2e2ba92862ab66f33fcf465ffc41d23f0b891a3b28b3f68ea48dde6ad4802902abd22b0d7d9101bd61471c5d88ee9d9477b7cf9f6ac52e0f520c79278da22938745446f1e647ae478ecba416b941aa31f979d0633efe72910bebb8988de1d0013616f31c5da163eb6c07022649ac57422627a5642618f53103adc9918f9992c5b085e10d2744f9934bfbb994a710d6cd387c325e94278f97d5582864f1bb29a1400aaf674ea8fb99a3b42e4ac50418fd804a5b1471eaac4642d4aa338fd3d5d0dd84372b2c32c5cfe7f319acf731a9787b048cedee3833300dde639cb1386c8fbca4bae8d67fb7bd72d1696a0212e27e166e6b04a79e34b47c98502ed0bdbd8d61777537f72df569fe5ed30071b57e8724e98ccb88c07f0458cf32298cefb6ed672b255e581ac756789b57e950d57174bffd3f47bdbe4b168e7e3f1a6df508d4202d327947facfbf9526a9e5fc1a5abb179902d4584deae6cb2900391e080d3f3540b87c3a873ccfaee5b4aaff0e6516a867ea00b4d5e680fee6b91defc65c240614a1409bdd0f49c2c4f3c1d258d77abfc17a749660f49547adb236730e5a7a22fbbabdd8ca079a8efa5b605332db12f455868ab67a1ffd27d1339bdf8d150189cfbf6199c6fc27c05788138a63267eb8ac086e27286b4ef99ee9d92cfedab5ce9916675f128f206a1733f47a597232067aa12da20c7b9cab6575d7634f8c31e9a29948b528681f3f9c13b9f585ebfbff8c28a299a43e4409b31b6c02a79eeb493734fe5f9c1d9e3830572eb54229b5cf525768f695acff48c76b4a6e0936b7406ab69f06d33d3f04946db9d7966ea6e8c50ede5abadda28149edef5223a6938d5c32933070d234043feddbd65c81be218f9d7c497a1ecac30bb9162e60a9bbbcdb4fec4b212050610e2b376aadf58b3c9207860d2650d0310ae6606a8f1b266b6a13b68c3306ed413224abdf19371bac3ea1b964f28996fc70f666ff118c6a7c9f2108d327f5145919c03832f754de35f5979ae72130e39126499037d6fbb3751cbb4843b05d9dc91dd5fc1429da491f72e3069313ea243933b47109af247fcbe0c70f9024ac5a41815655ab309fcaa282d03596ba59cfee0e40f7bd657689453e98d562442fa4c585f970b6983a581b0b8eb1c5e780b3f5c1abb326213c6b5fd440c2187066ddf55f4eabf88804139392c45979440c6f05b7222bd95e963832d7fa4a4760273cc075e8b8feeccb917e8feaf7d3f766d9ae880487e69bc01872ba62b91b8af5dbffdd93fdc95e8f47ed793fc070a5991f2e9ea61439662dab218257f3ff94b959f65e28d543de64396009e1a3bcc-8000066400000000000000000000000141454613650200355210ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSq@Sq@Sq@26c3f1a9fd06f219a7a29e58aa45a859adcbf10f-10000066400000000000000000000000341454613650200360430ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSq@Sq@Sq@Sq@Sq@Sq@Sq@26c41a5872eea0ee8313b8fecbddea819ce32695-15000066400000000000000000000001701454613650200360570ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁD@SÀint8 @D@D@D@D@D@aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab270b5503a45f1b04d3098ea381af8c4293a37443-1000066400000000000000000000000101454613650200352200ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusS%Àand283c7b995e4b678aa6f7e29d6a78e821ac56259c-9000066400000000000000000000000201454613650200355270ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpuspinpð“EÚnÚ2885ed49853cdecb539c92e20de29b2264531369-4000066400000000000000000000000051454613650200353470ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusq909429e2dcfbb16f63bb0254df7585a15bb6fb5e927d000066400000000000000000000000031454613650200356250ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus2b6ea826123947958906be7d62b18908ddb4f85a-8000066400000000000000000000360021454613650200353650ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus@228eabb5ad8b4ff13b10d13b27372bc2152dff149859ba47d9c89b741d4a5340d8fff5858a4576c55547007d7e2b3f94583ea8f0976237712bd2e5481c3988f5387e7ac2c3f18718388795b7b2d44b0a13f3faaa55311b800301c9203a511572cf8f349280bbabb9424070f415bbfe28aef8d20329ee842cef4d4c299e619b6ef1cf00718aab2accec9ac00155be2903b6fb07dfe98b0bd8d8580176b99ce4aa6be51cf59046c17ce1817d363fa63af5a241d48bcce064a438651af102ff9c6de4b86374fe24f1dfa66e16e51550dbb791af425d8fa601c70c1bb90e1a557bfe0dde730b0364eba9d2018ee751699ee219e13fa8874070935b29a1767e1d748bfbe796fe4b81a371922962349116906e823605d39fa4b5b885f4610c34d1a090fa4106785e7a035a629958ad1b00cb9d36d171d575268efa1bef064fc0a6dfbae8e532466035a0c2cef96fe9f93b872f0cf804811e927b39818189412868fb104e2d56ae62f77031f0df1ae91aa11826991ca7b8af22f130a47a72cce36ddc319b32dffd294f2e192e490249ea1a6f8437173ce6392d16dda888a98bf685bc91b89b8ee1eabdfb1806fd61f018d1744fe8b03521de4bff86d4a811ca2ecd5be668e9c752a6c26aacc0cc9dd89d112785c25ca6a0a7a5267b4e37457c04a0626c8a29be30ec28ddacf47a84918bab164d07bdedae62132ab04a6f2c4e108eba9ab878caa4a1a7509521d427ad7f3dfa86fae8345dfb5e0d46ce3a94dec84f7880c7422468ea74fe0b4825b8c762b34d5d9b82ba96e0c7dcae01718ccac0044a87476ff031e3ee3c2c13f5f375a841d243c38cd9a354b6525527de1fe7e36a6e2ad95e5bbc4c97e85f8cdcd5341da777e03451838807d5dd2eb4fd15976783c140e21cfc2eb3e58e40c16374de0aecbe3e3d41c64417a472cba18762080a2348ec3f441bf229a932ea0ca7c816938655d0c81b14dfbf86aa600d0c68172fb0046ef51f601ec89309d43ad1eacd583f9d205bb1ff1a37a97b44b5e35be4945f52897eb2a74645b01a7f82054cda44e9fa9f9af9bad1a235155718713bacd08d354f3fdd95858db0040fb551e9f93ae399d5dc53a67e88bcd5a02d104dfd9d824cdd5fe262ed9266fc47b7e640f2c9d9c7a62c6d24b429fa55560aa254a824a0858482e771144d6d5b05539cf71d75bec3a22be75655e1ababec4dff9472a019f6220067374dd49252282e4945a407084633ef9c88d14833bd95335107d36afdf56a642cb739bf0a61ed53a6915baed78e9d74166ebc492b517c7c594fe6564550bb7108f43012551e65fbafc0a9874e46fb64b5b7aee0082a5d617a43b8bf9473309c6761aebc7f13b72ed460b522a6b0875b67353c705f99d1d9dc899870fcc90c632aba1fa9ced6d7a2368dc4dd3d4b38a5807415e00de6b9ea70525a6c1b67d04521efeeefc6c591fc5256d990a1123522864a029430bb7ea00dd80d283fdd6d61cc5b509221e28f73386803d97a38fb0182fd95b3b91353c6eb60ef2b3d5c8c0ab8dc9cd9be2b4cf69450d00e88cb0f0bc9a4be82b71148a37237ceaf945ab94c365625f58171eb15c1bb244a87335550d813d28f241a3296520046e65aff3291555786d7c871ec8a2d10d4b44429041c3cd6ab60f0def742de3d28393c5aca92b150697ac15504ee66d8a2aa01a6c63d7c719d6d4f94af2ed1d8670e3231a0e481095e425e6231c43ad36e3b7a3478f6a61563f5aa13237beb8a891dbb29013c325f7f91c1b055fb83c436fdf8aef49ec457946e6ab7e955427373fd9c743acfd4b9609569b591ec79c7ea7276de103a35a4a8a05c91f59e04689ba1ddd570b18ed046f785d7e4ff9fce7115ac814fe126f781828877208ddfbb2ebc919e6d1f6eb417f38bfbf22ac9633f75e58e560b85d88d0e4fad9b2e68c9ebf9675819d50c30c8982bbbc2f41e02690390bf0e16979b24e648bf15b18800aaef58c3c465f38cfd1e47bf1266c17b69523b7868d2138cb95c4bce0dd3ceb7c2267b868b6e12888d5a489fc0091b295b56a1c328b54fe1119aaf1e6d7dd52fa450b52fbfc8b84c2200ebe209060b655cad288562786673121691809366af37b76567762d1fc24f1fad3128b43c8d10e9b6954b2efcbe40124fc0a5b670dd6dd544e30263a551825282aa06be3817a8eeacf31ca8b25cba011d60b78d3d2462810764e4acb566ff371005f5481c9d36c991527143af2c44cc8cfc59c920bb4a281f2ed4d494d30ba4d900edf59e23be2f763072255cb6f1e8b24ab1d305fbfb2429cff8bda303617c034e71a17230d0e860420dbcf9fea4ab48557e4d50797179496936ec6c97686fe6d9115809e14069244d251d4bc9c8931e47e06ec051e709ba1df526b55d959b37a6f3408833aaac80cfc9cb99915eb7d83e26998f0da2492b986fe0f5047b2cab6e6d33a117df21e6a8ec7f394a3712885dab176a4d6095e5cf75dbd3f0077e5e74b1ff8b902072380cf172562884de852ff5f07c55856224fb3df8eb44764ab9284944b86ab6f176a863cdd0e7ab5616a14692f6cbf41bc63113b27689fc2fb145736aaf2a5b26d2bef3a2a59ef8bb3f3e4d360a4251d0736482e9ed7e189fc48c0973b6649988228c2ac72b23826a61cfa06b11f13c8555be6e433d87e20113eb74c94f0e51719a7b38c59eba300089d06b9bc2a72017668e5aa3153ca4282718f1762642e7c1be1f865cd9b65c6387c8fe496f1e60d5acbb78c2f71cea1f35dc955b1e7d1cdc9ca339765995d9e05dd729cdf58aa2a1451b633c374e5b6c2af1c8486ee4250a875e80e1f359c15130eb1e2575c0c7badb2af61378527fa24347ebb12c10bbb36e3c94619556b2c641d0ebb691b2706cdd667f55b8fff8fb46e3ac72f3682661a4bac2391075ff5145eb07d69d77437adec2d096c1c89208ab3e7a9ea6a0ff4a5bc1846b3683bd7c6ec4520c3c95861a5856b0191e4221c9819c67273c66729728f6035e79c0dae8842df4c0c27ada1ad18b34efcd55b94ef120762e87e8c5afdec80d5788e83f0d1533cdd7aea8f27f33266e007b274f6d48c59bcfad607e8b298be2b17322be88558c60033452826778f167f318b660607bfb2f285cadb385399636acb8f5350d819511b5e7931c5f8483529d3ab3fdb5ae2dde0ada918f1327c6c0dfbbf5ed3c8afef171910dd0169022b3cad5b08084dd5e8eb8ef1ecb17e48bf69f80e3db0ae1cc7b73d94b89696e3c3443ecb4c7ca12568201744d1858d90ff759f2d264d49edf47772bd0e0990c14dcf8c8a4c2dafa44dc6e92f4c66b03bdc4f68f28ca2d0811a433e184cced99a8e5614ca83c46ec18b47e0c7ae91037ae06c6d6d0f3dee19711c21cddafb5869416d23c5219296acda7774891877f3f8d46155d39f43ed10500ede3afa26943b83b800b54a9752250ec6ae173e920002f365d692a9b3a2f9b27124ac97b8e81b70e8c0bb7022d07ee97e962810962b03fc019695b5399f77aab414327cfc5dedd51e99453179c42ae85a42f8e06e0cec6f937224dd019c77c5a0ba32a228eabb5ad8b4ff13b10d13b27372bc2152dff149859ba47d9c89b741d4a5340d8fff5858a4576c55547007d7e2b3f94583ea8f0976237712bd2e5481c3988f5387e7ac2c3f18718388795b7b2d44b0a13f3faaa55311b800301c9203a511572cf8f349280bbabb9424070f415bbfe28aef8d20329ee842cef4d4c299e619b6ef1cf00718aab2accec9ac00155be2903b6fb07dfe98b0bd8d8580176b99ce4aa6be51cf59046c17ce1817d363fa63af5a241d48bcce064a438651af102ff9c6de4b86374fe24f1dfa66e16e51550dbb791af425d8fa601c70c1bb90e1a557bfe0dde730b0364eba9d2018ee751699ee219e13fa8874070935b29a1767e1d748bfbe796fe4b81a71e823605d39fa4b5b885f4610c34d1a090fa4106785e7a035a629958ad1b00cb9d36d171d575268efa1bef064fc0a6dfbae8e532466035a0c2cef96fe9f93b872f0cf804811e927b39818189412868fb104e2d56ae62f77031f0df1ae91aa11826991ca7b8af22f130a47a72cce36ddc319b32dffd294f2e192e490249ea1a6f8437173ce6392d16dda888a98bf685bc91b89b8ee1eabdfb1806fd61f018d1744fe8b03521de4bff86d4a811ca2ecd5be668e9c752a6c26aacc0cc9dd89d112785c25ca6a0a7a5267b4e37457c04a0626c8a29be30ec28ddacf47a84918bab164d07bdedae62132ab04a6f2c4e108eba9ab878caa4a1a7509521d427ad7f3dfa86fae8345dfb5e0d46ce3a94dec84f7880c7422468ea74fe0b4825b8c762b34d5d9b82ba96e0c7dcae01718ccac0044a87476ff031e3ee3c2c13f5f375a841d243c38cd9a354b6525527de1fe7e36a6e2ad95e5bbc4c97e85f8cdcd5341da777e03451838807d5dd2eb4fd15976783c140e21cfc2eb3e58e40c16374de0aecbe3e3d41c64417a472cba18762080a2348ec3f441bf229a932ea0ca7c816938655d0c81b14dfbf86aa600d0c68172fb0046ef51f601ec89309d43ad1eacd583f9d205bb1ff1a37a97b44b5e35be4945f52897eb2a74645b01a7f82054cda44e9fa9f9af9bad1a235155718713bacd08d354f3fdd95858db0040fb551e9f93ae399d5dc53a67e88bcd5a02d104dfd9d824cdd5fe262ed9266fc47b7e640f2c9d9c7a62c6d24b429fa55560aa254a824a0858482e771144d6d5b05539cf71d75bec3a22be75655e1ababec4dff9472a019f6220067374dd49252282e4945a407084633ef9c88d14833bd95335107d36afdf56a642cb739bf0a61ed53a6915baed78e9d74166ebc492b517c7c594fe6564550bb7108f43012551e65fbafc0a9874e46fb64b5b7aee0082a5d617a43b8bf9473309c6761aebc7f13b72ed460b522a6b0875b67353c705f99d1d9dc899870fcc90c632aba1fa9ced6d7a2368dc4dd3d4b38a5807415e00de6b9ea70525a6c1b67d04521efeeefc6c591fc5256d990a1123522864a029430bb7ea00dd80d283fdd6d61cc5b509221e28f73386803d97a38fb0182fd95b3b91353c6eb60ef2b3d5c8c0ab8dc9cd9be2b4cf69450d00e88cb0f0bc9a4be82b71148a37237ceaf945ab94c365625f58171eb15c1bb244a87335550d813d28f241a3296520046e65aff3291555786d7c871ec8a2d10d4b44429041c3cd6ab60f0def742de3d28393c5aca92b150697ac15504ee66d8a2aa01a6c63d7c719d6d4f94af2ed1d8670e3231a0e481095e425e6231c43ad36e3b7a3478f6a61563f5aa13237beb8a891dbb29013c325f7f91c1b055fb83c436fdf8aef49ec457946e6ab7e955427373fd9c743acfd4b9609569b591ec79c7ea7276de103a35a4a8a05c91f59e04689ba1ddd570b18ed046f785d7e4ff9fce7115ac814fe126f781828877208ddfbb2ebc919e6d1f6eb417f38bfbf22ac9633f75e58e560b85d88d0e4fad9b2e68c9ebf9675819d50c30c8982bbbc2f41e02690390bf0e16979b24e648bf15b18800aaef58c3c465f38cfd1e47bf1266c17b69523b7868d2138cb95c4bce0dd3ceb7c2267b868b6e12888d5a489fc0091b295b56a1c328b54fe1119aaf1e6d7dd52fa450b52fbfc8b84c2200ebe209060b655cad288562786673121691809366af37b76567762d1fc24f1fad3128b43c8d10e9b6954b2efcbe40124fc0a5b670dd6dd544e30263a551825282aa06be3817a8eeacf31ca8b25cba011d60b78d3d2462810764e4acb566ff371005f5481c9d36c991527143af2c44cc8cfc59c920bb4a281f2ed4d494d30ba4d900edf59e23be2f763072255cb6f1e8b24ab1d305fbfb2429cff8bda303617c034e71a17230d0e860420dbcf9fea4ab48557e4d50797179496936ec6c97686fe6d9115809e14069244d251d4bc9c8931e47e06ec051e709ba1df526b55d959b37a6f3408833aaac80cfc9cb99915eb7d83e26998f0da2492b986fe0f5047b2cab6e6d33a117df21e6a8ec7f394a3712885dab176a4d6095e5cf75dbd3f0077e5e74b1ff8b902072380cf172562884de852ff5f07c55856224fb3df8eb44764ab9284944b86ab6f176a863cdd0e7ab5616a14692f6cbf41bc63113b27689fc2fb145736aaf2a5b26d2bef3a2a59ef8bb3f3e4d360a4251d0736482e9ed7e189fc48c0973b6649988228c2ac72b23826a61cfa06b11f13c8555be6e433d87e20113eb74c94f0e51719a7b38c59eba300089d06b9bc2a72017668e5aa3153ca4282718f1762642e7c1be1f865cd9b65c6387c8fe496f1e60d5acbb78c2f71cea1f35dc955b1e7d1cdc9ca339765995d9e05dd729cdf58aa2a1451b633c374e5b6c2af1c8486ee4250a875e80e1f359c15130eb1e2575c0c7badb2af61378527fa24347ebb12c10bbb36e3c94619556b2c641d0ebb691b2706cdd667f55b8fff8fb46e3ac72f3682661a4bac2391075ff5145eb07d69d77437adec2d096c1c89208ab3e7a9ea6a0ff4a5bc1846b3683bd7c6ec4520c3c95861a5856b0191e4221c9819c67273c66729728f6035e79c0dae8842df4c0c27ada1ad18b34efcd55b94ef120762e87e8c5afdec80d5788e83f0d1533cdd7aea8f27f33266e007b274f6d48c59bcfad607e8b298be2b17322be88558c60033452826778f167f318b660607bfb2f285cadb385399636acb8f5350d819511b5e7931c5f8483529d3ab3fdb5ae2dde0ada918f1327c6c0dfbbf5ed3c8afef171910dd0169022b3cad5b08084dd5e8eb8ef1ecb17e48bf69f80e3db0ae1cc7b73d94b8èe3c3443ecb4c7ca12568201744d1858d90ff759f2d264d49edf47772bd0e0990c14dcf8c8a4c2dafa44dc6e92f4c66b03bdc4f68f28ca2d0811a433e184cced99a8e5614ca83c46ec18b47e0c7ae91037ae06c6d6d0f3dee19711c21cddafb5869416d23c5219296acda7774891877f3f8d46155d39f43ed10500ede3afa26943b83b800b54a9752250ec6ae173e920002f365d692a9b3a2f9b27124ac97b8e81b70e8c0bb7022d07ee97e962810962b03fc019695b5399f77aab414327cfc5dedd51e99453179c42ae85a42f8e06e0cec6f937224dd019c77c5a0ba32ad08107216a9c758138b730bd5b5f4b613f192839514a8621634d9dbd5840e728c1ef4a2c8bbfadc376dd80d13dcb327ce55ab536a43b570789f5c5e135ac0af79b54232613d0e989ae695aeb358c671ae71d508b58a793e19c58c3d204cdc9a021ecc634bcb0bd6a1917554ea3bd688adab8163260a914fc01d7ce05a497a5c5836cf9401cb6aa35cd008470bdecfb97a511c905badd01bbb4d0c05867661debd2162beeccd52399d5a70a929405293916f33ed0d03f8b850f4bdd77b1fb6283118d71de629577383c81cad086f4099ce7476cb787f73c96431a0df4156f7826fce9045f7e7c97bbfd618b845595203cdc8df4638430fac74a07bc5f773486731d8ad29c06695704cbe2882077a85d543551b7ba81b181ccb93d2b3071b1a38f3c762b42df8246aa64cecbdc772830ac79e766fa99e8c65225f28297a32526df9b51227bd368253737f013ae18435a912bc18cc4a95216ce449865e8bd8bc759dce9d4af52f9e789eafa37023e91946952202dfb7243cab7db2f9f98bb66f19750c547a2bf2e2ba92862ab66f33fcf465ffc41d23f0b891a3b28b3f68ea48dde6ad4802902abd22b0d7d9101bd61471c5d88ee9d9477b7cf9f6ac52e0f520c79278da22938745446f1e647ae478ecba416b941aa31f979d0633efe72910bebb8988de1d0013616f31c5da163eb6c07022649ac57422627a5642618f53103adc9918f9992c5b085e10d2744f9934bfbb994a710d6cd387c325e94278f97d5582864f1bb29a1400aaf674ea8fb99a3b42e4ac50418fd804a5b1471eaac4642d4aa338fd3d5d0dd84372b2c32c5cfe7f319acf731a9787b048cedee3833300dde639cb1386c8fbca4bae8d67fb7bd72d1696a0212e27e166e6b04a79e34b47c98502ed0bdbd8d61777537f72df569fe5ed30071b57e8724e98ccb88c07f0458cf32298cefb6ed672b255e581ac756789b57e950d57174bffd3f47bdbe4b168e7e3f1a6df508d4202d327947facfbf9526a9e5fc1a5abb179902d4584deae6cb2900391e080d3f3540b87c3a873ccfaee5b4aaff0e6516a867ea00b4d5e680fee6b91defc65c240614a1409bdd0f49c2c4f3c1d258d77abfc17a749660f49547adb236730e5a7a22fbbabdd8ca079a8efa5b605332db12f455868ab67a1ffd27d1339bdf8d150189cfbf6199c6fc27c05788138a63267eb8ac086e27286b4ef99ee9d92cfedab5ce9916675f128f206a1733f47a597232067aa12da20c7b9cab6575d7634f8c31e9a29948b528681f3f9c13b9f585ebfbff8c28a299a43e4409b31b6c02a79eeb493734fe5f9c1d9e3830572eb54229b5cf525768f695acff48c76b4a6e0936b7406ab69f06d33d3f04946db9d7966ea6e8c50ede5abadda28149edef5223a6938d5c32933070d234043feddbd65c81be218f9d7c497a1ecac30bb9162e60a9bbbcdb4fec4b212050610e2b376aadf58b3c9207860d2650d0310ae6606a8f1b266b6a13b68c3306ed413224abdf19371bac3ea1b964f28996fc70f666ff118c6a7c9f2108d327f5145919c03832f754de35f5979ae72130e39126499037d6fbb3751cbb4843b05d9dc91dd5fc1429da491f72e3069313ea243933b47109af247fcbe0c70f9024ac5a41815655ab309fcaa282d03596ba59cfee0e40f7bd657689453e98d562442fa4c585f970b6983a581b0b8eb1c5e780b3f5c1abb326213c6b5fd440c2187066ddf55f4eabf88804139392c45979440c6f05b7222bd95e963832d7fa4a4760273cc075e8b8feeccb917e8feaf7d3f766d9ae880487e69bc01872ba62b91b8af5dbffdd93fdc95e8f47ed793fc070a5991f2e9ea61439662dab218f643c1959171937aa160008a548f51f87b58f2c4fae5aed556f26bb9cd1dc2b3518458e2f5ec5d974c6e11a0ed639958cc8c1db771cc8cc8bee8727bf6452f47c9782acf548856a0e67841c3dbdb1c98572a4fc8e6cc8195a504019b4930d302a90dc20d8628ae6c90e0206cbb3d05025744db4e115cd3b650e5519a1624acbf226ebca8875b05183b2584e65289f8b9cec3f7d010cb9671a0e80bb70ca8763f1722d79e8decb6b9023baf64b5981e745c06546cc1ed08107216a9c758138b730bd5b5f4b613f192839514a8621634d9dbd5840e728c1ef4a2c8bbfadc376dd80d13dcb327ce55ab536a43b570789f5c5e135ac0af79b54232613d0e989ae695aeb358c671ae71d508b58a793e19c58c3d204cdc9a021ecc634bcb0bd6a1917554ea3bd688adab8163260a914fc01d7ce05a497a5c5836cf9401cb6aa35cd008470bdecfb97a511c905badd01bbb4d0c05867661debd2162beeccd52399d5a70a929405293916f33ed0d03f8b850f4bdd77b1fb6283118d71de629577383c81cad086f4099ce7476cb787f73c96431a0df4156f7826fce9045f7e7c97bbfd618b845595203cdc8df4638430fac74a07bc5f773486731d8ad29c06695704cbe2882077a85d543551b7ba81b181ccb93d2b3071b1a38f3c762b42df8246aa64cecbdc772830ac79e766fa99e8c65225f28297a32526df9b51227bd368253737f013ae18435a912bc18cc4a95216ce449865e8bd8bc759dce9d4af52f9e789eafa37023e91946952202dfb7243cab7db2f9f98bb66f19750c547a2bf2e2ba92862ab66f33fcf465ffc41d23f0b891a3b28b3f68ea48dde6ad4802902abd22b0d7d9101bd61471c5d88ee9d9477b7cf9f6ac52e0f520c79278da22938745446f1e647ae478ecba416b941aa31f979d0633efe72910bebb8988de1d0013616f31c5da163eb6c07022649ac57422627a5642618f53103adc9918f9992c5b085e10d2744f9934bfbb994a710d6cd387c325e94278f97d5582864f1bb29a1400aaf674ea8fb99a3b42e4ac50418fd804a5b1471eaac4642d4aa338fd3d5d0dd84372b2c32c5cfe7f319acf731a9787b048cedee3833300dde639cb1386c8fbca4bae8d67fb7bd72d1696a0212e27e166e6b04a79e34b47c98502ed0bdbd8d61777537f72df569fe5ed30071b57e8724e98ccb88c07f0458cf32298cefb6ed672b255e581ac756789b57e950d57174bffd3f47bdbe4b168e7e3f1a6df508d4202d327947facfbf9526a9e5fc1a5abb179902d4584deae6cb2900391e080d3f3540b87c3a873ccfaee5b4aaff0e6516a867ea00b4d5e680fee6b91defc65c240614a1409bdd0f49c2c4f3c1d258d77abfc17a749660f49547adb236730e5a7a22fbbabdd8ca079a8efa5b605332db12f455868ab67a1ffd27d1339bdf8d150189cfbf6199c6fc27c05788138a63267eb8ac086e27286b4ef99ee9d92cfedab5ce9916675f128f206a1733f47a597232067aa12da20c7b9cab6575d7634f8c31e9a29948b528681f3f9c13b9f585ebfbff8c28a299a43e4409b31b6c02a79eeb493734fe5f9c1d9e3830572eb54229b5cf525768f695acff48c76b4a6e0936b7406ab69f06d33d3f04946db9d7966ea6e8c50ede5abadda28149edef5223a6938d5c32933070d234043feddbd65c81be218f9d7c497a1ecac30bb9162e60a9bbbcdb4fec4b212050610e2b376aadf58b3c9207860d2650d0310ae6606a8f1b266b6a13b68c3306ed413224abdf19371bac3ea1b964f28996fc70f666ff118c6a7c9f2108d327f5145919c03832f754de35f5979ae72130e39126499037d6fbb3751cbb4843b05d9dc91dd5fc1429da491f72e302bff074c12c17644315974e39b762d08015445ee-6000066400000000000000000000000051454613650200351700ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁä@Dgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/3.bin000066400000000000000000000000101454613650200307300ustar00rootroot00000000000000AMQP3301381edefd92364acf23b142eacbaf89b138ef000066400000000000000000000000021454613650200356070ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus˜332c730310eafb4b135aa5eb07f37b88bc7d11b1-5000066400000000000000000000000041454613650200355660ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusà`A€34554f02d418f5775ab0e98c967e8e569ea02f19-15000066400000000000000000000001311454613650200354420ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁä@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D350966ab41bc1a9351eab166ea37417b424e223e-2000066400000000000000000000000141454613650200353560ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSÀ @@@@@@37418f49d381af4441dc221adbfff7d5e4f2d693-15000066400000000000000000000000121454613650200357160ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁD@S@@3b8cd253e1fac4e0ec00187c6501e0bc37848e41-4000066400000000000000000000000031454613650200355220ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusTS3c0674059cb91986595ce7d40bf92e6eba956269-14000066400000000000000000000000711454613650200354500ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁä@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D3e8d2ef9ba27d09441cd9975702439e59b1dcb9d-16000066400000000000000000000002131454613650200356560ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁä@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@Dgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/4.bin000066400000000000000000000001071454613650200307400ustar00rootroot00000000000000GSÀ: ¡$83a29bedd884468ba2e37f3017eeab1d_G29@p`p©€@@@@@40b4f6efe755940d08028ad0df364cfb067431e3-19000066400000000000000000000000211454613650200355460ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁ@@Q,q@Q,q@€q42990cf46d875afc034e3e9ff31114eeab49c383-9000066400000000000000000000370021454613650200355730ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus@228eabb5ad8b4ff13b10d13b27372bc2152dff149859ba47d9c89b741d4a5340d8fff5858a4576c55547007d7e2b3f94583ea8f0976237712bd2e5481c3988f5387e7ac2c3f18718388795b7b2d44b0a13f3faaa55311b800301c9203a511572cf8f349280bbabb9424070f415bbfe28aef8d20329ee842cef4d4c299e619b6ef1cf00718aab2accec9ac00155be2903b6fb07dfe98b0bd8d8580176b99ce4aa6be51cf59046c17ce1817d363fa63af5a241d48bcce064a438651af102ff9c6de4b86374fe24f1dfa66e16e51550dbb791af425d8fa601c70c1bb90e1a557bfe0dde730b0364eba9d2018ee751699ee219e13fa8874070935b29a1767e1d748bfbe796fe4b81a371922962349116906e823605d39fa4b5b885f4610c34d1a090fa4106785e7a035a629958ad1b00cb9d36d171d575268efa1bef064fc0a6dfbae8e532466035a0c2cef96fe9f93b872f0cf804811e927b39818189412868fb104e2d56ae62f77031f0df1ae91aa11826991ca7b8af22f130a47a72cce36ddc319b32dffd294f2e192e490249ea1a6f8437173ce6392d16dda888a98bf685bc91b89b8ee1eabdfb1806fd61f018d1744fe8b03521de4bff86d4a811ca2ecd5be668e9c752a6c26aacc0cc9dd89d112785c25ca6a0a7a5267b4e37457c04a0626c8a29be30ec28ddacf47a84918bab164d07bdedae62132ab04a6f2c4e108eba9ab878caa4a1a7509521d427ad7f3dfa86fae8345dfb5e0d46ce3a94dec84f7880c7422468ea74fe0b4825b8c762b34d5d9b82ba96e0c7dcae01718ccac0044a87476ff031e3ee3c2c13f5f375a841d243c38cd9a354b6525527de1fe7e36a6e2ad95e5bbc4c97e85f8cdcd5341da777e03451838807d5dd2eb4fd15976783c140e21cfc2eb3e58e40c16374de0aecbe3e3d41c64417a472c‚a18762080a2348ec3f441bf229a932ea0ca7c816938655d0c81b14dfbf86aa600d0c68172fb0046ef51f601ec89309d43ad1eacd583f9d205bb1ff1a37a97b44b5e35be4945f52897eb2a74645b01a7f82054cda44e9fa9f9af9bad1a235155718713bacd08d354f3fdd95858db0040fb551e9f93ae399d5dc53a67e88bcd5a02d104dfd9d824cdd5fe262ed9266fc47b7e640f2c9d9c7a62c6d24b429fa55560aa254a824a0858482e771144d6d5b05539xf71d75bec3a22be75655e1ababec4dff9472a019f6220067374dd49252282e4945a407084633ef9c88d14833bd95335107d36afdf56a642cb739bf0a61ed53a6915baed78e9d74166ebc492b517c7c594fe6564550bb7108f43012551e65fbafc0a9874e46fb64b5b7aee0082a5d617a43b8bf9473309c6761aebc7f13b72ed460b522a6b0875b67353c705f99d1d9dc899870fcc90c632aba1fa9ced6d7a2368dc4dd3d4b38a5807415e00de6b9ea70525a6c1b67d04521efeeefc6c591fc5256d990a1123522864a029430bb7ea00dd80d283fdd6d61cc5b509221e28f73386803d97a38fb0182fd95b3b91353c6eb60ef2b3d5c8c0ab8dc9cd9be2b4cf69450d00e88cb0f0bc9a4be82b71148a37237ceaf945ab94c365625f58171eb15c1bb244a87335550d813d28f241a3296520046e65aff3291555786d7c871ec8a2d10d4b44429041c3cd6ab60f0def742de3d28393c5aca92b150697ac15504ee66d8a2aa01a6c63d7c719d6d4f94af2ed1d8670e3231a0e481095e425e6231c43ad36e3b7a3478f6a61563f5aa13237beb8a891dbb29013c325f7f91c1b055fb83c436fdf8aef49ec457946e6ab7e955427373fd9c743acfd4b9609569b591ec79c7ea7276de103a35a4a8a05c91f59e04689ba1ddd570b18ed046f785d7e4ff9fce7115ac814fe126f781828877208ddfbb2ebc919e6d1f6eb417f38bfbf22ac9633f75e58e560b85d88d0e4fad9b2e68c9ebf9675819d50c30c8982bbbc2f41e02690390bf0e16979b24e648bf15b18800aaef58c3c465f38cfd1e47bf1266c17b69523b7868d2138cb95c4bce0dd3ceb7c2267b868b6e12888d5a489fc0091b295b56a1c328b55fe1119aaf1e6d7dd52fa450b52fbfc8b84c2200ebe209060b655cad288562786673121691809366af37b76567762d1fc24f1fad3128b43c8d10e9b6954b2efcbe40124fc0a5b670dd6dd544e30263a551825282aa06be3817a8eeacf31ca8b25cba011d60b78d3d2462810764e4acb566ff371005f5481c9d36c991527143af2c44cc8cfc59c920bb4a281f2ed4d494d30ba4d900edf59e23be2f763072255cb6f1e8b24ab1d305fbfb2429cff8bda303617c034e71a17230d0e860420dbcf9fea4ab48557e4d50797179496936ec6c97686fe6d9115809e14069244d251d4bc9c8931e47e06ec051e709ba1df526b55d959b37a6f3408833aaac80cfc9cb99915eb7d83e26998f0da2492b986fe0f5047b2cab6e6d33a117df21e6a8ec7f394a3712885dab176a4d6095e5cf75dbd3f0077e5e74b1ff8b902072380cf172562884de852ff5f07c55856224fb3df8eb44764ab9284944b86ab6f176a863cdd0e7ab5616a14692f6cbf41bc63113b27689fc2fb145736aaf2a5b26d2bef3a2a59ef8bb3f3e4d360a4251d0736482e9ed7e189fc48c0973b6649988228c2ac72b23826a61cfa06b11f13c8555be6e433d87e20113eb74c94f0e51719a7b38c49eba300089d06b9bc2a72017668e5aa3153ca4282718f1762642e7c1be1f865cd9b65c6387c8fe496f1e60d5acbb78c2f71cea1f35dc955b1e7d1cdc9ca339765995d9e05dd729cdf58aa2a1451b633c374e5b6c2af1c8486ee4250a875e80e1f359c15130eb1e2575c0c7badb2af61378527fa24347ebb12c10bbb36e3c94619556b2c641d0ebb691b2706cdd667f55b8fff8fb46e3ac72f3682661a4bac2391075ff5145eb07d69d77437adec2d096c1c89208ab3e7a9ea6a0ff4a5bc1846b3683bd7c6ec4520c3c95861a5856b0191e4221c9819c67273c66729728f6035e79c0dae8842df4c0c27ada1ad18b34efcd55b94ef120762e87e8c5afdec80d5788e83f0d1533cdd7aea8f27f33266e007b274f6d48c59bcfad607e8b298be2b17322be88558c60033452826778f167f318b660607bfb2f285cadb385399636acb8f5350d819511b5e7931c5f8483529d3ab3fdb5ae2dde0ada918f1327c6c0dfbbf5ed3c8afef171910dd0169022b3cad5b08084dd5e8eb8ef1ecb17e48bf69f80e3db0ae1cc7b73d94b89696e3c3443ecb4c7ca12568201744d1858d90ff759f2d264d49edf47772bd0e0990c14dcf8c8a4c2dafa44dc6e92f687505005b03bdc4f68f28ca2d0811a433e184cced99a8e5614ca83c46ec18b47e0c7ae91037ae06c6d6d0f3dee19711c21cddafb5869416d23c5219296acda7774891877f3f8d46155d39f43ed10500ede3afa26943b83b800b54a9752250ec6ae173e920002f365d692a9b3a2f9b27124ac97b8e81b70e8c0bb7022d07ee97e962810962b03fc019695b5399f77aab414327cfc5dedd51e99453179c42ae85a42f8e06e0cec6f937224dd019c77c5a0ba32a228eabb5ad8b4ff13b10d13b27372bc2152dff149859ba47d9c89b741d4a5340d8fff5858a4576c55547007d7e2b3f94583ea8f0976237712bd2e5481c3988f5387e7ac2c3f18718388795b7b2d44b0a13f3faaa55311b800301c9203a511572cf8f349280bbabb9424070f415bbfe28aef8d20329ee842cef4d4c299e619b6ef1cf00718aab2accec9ac00155be2903b6fb07dfe98b0bd8d8580176b99ce4aa6be51cf59046c17ce1817d363fa63af5a241d48bcce064a438651af102ff9c6de4b86374fe24f1dfa66e16e51550dbb791af425d8fa601c70c1bb90e1a557bfe0dde730b0364eba9d2018ee751699ee219e13fa8874070935b29a1767e1d748bfbe796fe4b81a71e823605d39fa4b5b885f4610c34d1a090fa4106785e7a035a629958ad1b00cb9d36d171d575268efa1bef064fc0a6dfbae8e532466035a0c2cef96fe9f93b872f0cf804811e927b39818189412868fb104e2d56ae62f77031f0df1ae91aa11826991ca7b8af22f130a47a72cce36ddc319b32dffd294f2e192e490249ea1a6f8437173ce6392d16dda888a98bf685bc91b89b8ee1eabdfb1806fd61f018d1744fe8b03521de4bff86d4a811ca2ecd5be668e9c752a6c26aacc0cc9dd89d112785c25ca6a0a7a5267b4e37457c04a0626c8a29be30ec28ddacf47a84918bab164d07bdedae62132ab04a6f2c4e108eba9ab878caa4a1a7509521d427ad7f3dfa86fae8345dfb5e0d46ce3a94dec84f7880c7422468ea74fe0b4825b8c762b34d5d9b82ba96e0c7dcae01718ccac0044a87476ff031e3ee3c2c13f5f375a841d243c38cd9a354b6525527de1fe7e36a6e2ad95e5bbc4c97e85f8cdcd5341da777e03451838807d5dD2eb430d15976783c140e21cfc2eb3e58e40c16374de0aecbe3e3d41c64417a472cba18762080a2348ec3f441bf229a932ea0ca7c816938655d0c81b14dfbf86aa600d0c68172fb0046ef51f601ec89309d43ad1eacd583f9d205bb1ff1a37a97b44b5e35be4945f52897eb2a74645b01a7f82054cda44e9fa9f9af9bad1a235155718713bacd08d354f3fdd95858db0040fb551e9f93ae399d5dc53a67e88bcd5a02d104dfd9d824cdd5fe262ed9266fc47b7e640f2c9d9c7a62c6d24b429fa55560aa254a824a0858482e771144d6d5b05539cf71d75bec3a22be75655e1ababec4dff9472a019f6220067374dd49252282e4945a407084633ef9c88d14833bd95335107d36afdf56a642cb739bf0a61ed53a6915baed78e9d74166ebc492b517c7c594fe6564550bb7108f43012551e65fbafc0a9874e46fb64b5b7aee0082a5d617a43b8bf9473309c6761aebc7f13b72ed460b522a6b0875b67353c705f99d1d9dc899870fcc90c632aba1fa9ced6d7a2368dc4dd3d4b38a5807415e00de6b9ea70525a6c1b67d04521efeeefc6c591fc5256d990a1123522864a029430bb7ea00dd80d283fdd6d61cc5b509221e28f73386803d97a38fb0182fd95b3b91353c6eb60ef2b3d5c8c0ab8dc9cd9be2b4cf69450d00e88cb0f0bc9a4be82b71148a37237ceaf945ab94c365625f58171eb15c1bb244a87335550d813d28f241a3296520046e65aff3291555786d7c871ec8a2d10d4b44429041c3cd6ab60f0def742de3d28393c5aca92b150697ac15504ee66d8a2aa01a6c63d7c719d6d4f94af2ed1d8670e3231a0e481095e425e6231c43ad36e3b7a3478f6a61563f5aa13237beb8a891dbb29013c325f7f91c1b055fb83c436fdf8aef49ec457946e6ab7e955427373fd9c743acfd4b9609569b591ec79c7ea7276de103a35a4a8a05c91f59e04689ba1ddd570b18ed046f785d7e4ff9fce7115ac814fe126f781828877208ddfbb2ebc919e6d1f6eb417f38bfbf22ac9633f75e58e560b85d88d0e4fad9b2e68c9ebf9675819d50c30c8982bbbc2f41e02690390bf0e16979b24e648bf15b18800aaef58c3c465f38cfd1e47bf1266c17b69523b7868ba85e72af18cb5ba85a4a0d6c28b4ac1e5509a3a2fdb0e3255cbc559df5e6a661fc560c756a0264dd99b72c61c51a4b7ad56ca4c8ccb7e8edfc48ff3cceac5d1e8ac5fc87096adc4d0e9a27492857b17604c3a694cfe0e70b22df106c8f3c61f840bcd634964cdb571840e125e381e7dd3a0d97972e965f16f775fa4ce555124318290bf508beb7bd77e633042deb0e863631478fc3dc9122862b3c31264471bcce54e0b74040c8bafd481cf798f332e8940f1134d3027d6f28e771d15e154fc89c6c25fe18a5d312807cc2e623bb1bbb4f0b6ec71d009407eb54bb0759f03682f65d0da8812f84d8e97483f6a8d76a8417efcd9526444abba24288647609791578887ef49780b0b89f51b072cae81c5b5014463da3633dda105b82add0f9c2f065dca46eedd2928be2570493c79a996fa78ea6aec0996497fe2dc444432ade4eaa662ee2255f0f4b92d593288a8e3ffe7a15a10e9d33b0203af23f4c9fd2cfcb6160db63b52810869ff1e65423dbe2c4415884b9f8dec3c968e14cd74f323c89053a96111bc9ce59ec483832c49c53a648e5f0f797f53642ac60170c94b473f1f2e7d8a38e46460b81219b52081263027f74cbf63a75af3a7d2138cb95c4bce0dd3ceb7c2267b868b6e12888d5a489fc0091b295b56a1c328b54fe1119aaf1e6d7dd52fa450b52fbfc8b84c2200ebe209060b655cad288562786673121691809366af37b76567762d1fc24f1fad3128b43c8d10e9b6954b2efcbe40124fc0a5b670dd6dd544e30263a551825282aa06be3817a8eeacf31ca8b25cba011d60b78d3d2462810764e4acb566ff371005f5481c9d36c991527143af2c44cc8cfc59c920bb4a281f2ed4d494d30ba4d900edf59e23be2f763072255cb6f1e8b24ab1d305fbfb2429cff8bda303617c034e71a17230d0e860420dbcf9fea4ab48557e4d50797179496936ec6c97686fe6d9115809e14069244d251d4bc9c8931e47e06ec051e709ba1df526b55d959b37a6f3408833aaac80cfc9cb99915eb7d83e26998f0da2492b986fe0f5047b2cab6e6d33a117df21e6a8ec7f394a3712885dab176a4d6095e5cf75dbd3f0077e5e74b1ff8b902072380cf172562884de852ff5f07c55856224fb3df8eb44764ab9284944b86ab6f176a863cdd0e7ab5616a14692f6cbf41bc63113b27689fc2fb145736aaf2a5b26d2bef3a2a59ef8bb3f3e4d360a4251d0736482e9ed7e189fc48c0973b6649988228c2ac72b23826a61cfa06b11f13c8555be6e433d87e20113eb74c94f0e51719a7b38c59eba300089d06b9bc2a72017668e5aa3153ca4282718f1762642e7c1be1f865cd9b65c6387c8fe496f1e60d5acbb78c2f71cea1f35dc955b1e7d1cdc9ca339765995d9e05dd729cdf58aa2a1451b633c374e5b6c2af1c8486ee4250a875e80e1f359c15130eb1e2575c0c7badb2af61378527fa24347ebb12c10bbb36e3c94619556b2c641d0ebb691b2706cdd667f55b8fff8fb46e3ac72f3682661a4bac2391075ff5145eb07d69d77437adec2d096c1c89208ab3e7a9ea6a0ff4a5bc1846b3683bd7c6ec4520c3c95861a5856b0191e4221c9819c67273c66729728f6035e79c0dae8842df4c0c27ada1ad18b34efcd55b94ef120762e87e8c5afdec80d5788e83f0d1533cdd7aea8f27f33266e007b274f6d48c59bcfad607e8b298be2b17322be88558c60033452826778f167f318b660607bfb2f285cadb385399636acb8f5350d819511b5e7931c5f8483529d3ab3fdb5ae2dde0ada918f1327c6c0dfbbf5ed3c8afef171910dd0169022b3cad5b08084dd5e8eb8ef1ecb17e48bf69f80e3db0ae1cc7b73d94b8èe3c3443ecb4c7ca12568201744d1858d90ff759f2d264d49edf47772bd0e0990c14dcf8c8a4c2dafa44dc6e92f4c66b03bdc4f68f28ca2d0811a433e184cced99a8e5614ca83c46ec18b47e0c7ae91037ae06c6d6d0f3dee19711c21cddafb5869416d23c5219296acda7774891877f3f8d46155d39f43ed10500ede3afa26943b83b800b54a9752250ec6ae173e920002f365d692a9b3a2f9b27124ac97b8e81b70e8c0bb7022d07ee97e962810962b03fc019695b5399f77aab414327cfc5dedd51e99453179c42ae85a42f8e06e0cec6f937224dd019c77c5a0ba32ad08107216a9c758138b730bd5b5f4b613f192839514a8621634d9dbd5840e728c1ef4a2c8bbfadc376dd80d13dcb327ce55ab536a43b570789f5c5e135ac0af79b54232613d0e989ae695aeb358c671ae71d508b58a793e19c58c3d204cdc9a021ecc634bcb0bd6a1917554ea3bd688adab8163260a914fc01d7ce05a497a5c5836cf9401cb6aa35cd008470bdecfb97a511c905badd01bbb4d0c05867661debd2162beeccd52399d5a70a929405293916f33ed0d03f8b850f4bdd77b1fb6283118d71de629577383c81cad086f4099ce7476cb787f73c96431a0df4156f7826fce9045f7e7c97bbfd618b845595203cdc8df4638430fac74a07bc5f773486731d8ad29c06695704cbe2882077a85d543551b7ba81b181ccb93d2b3071b1a38f3c762b42df8246aa64cecbdc772830ac79e766fa99e8c65225f28297a32526df9b51227bd368253737f013ae18435a912bc18cc4a95216ce449865e8bd8bc759dce9d4af52f9e789eafa37023e91946952202dfb7243cab7db2f9f98bb66f19750c547a2bf2e2ba92862ab66f33fcf465ffc41d23f0b891a3b28b3f68ea48dde6ad4802902abd22b0d¼ ÉÒëÌÚ7d9101bd61471c5d88ee9d9477b7cf9f6ac52e0f520c79278da22938745446f1e647ae478ecba416b941aa31f979d0633efe72910bebb8988de1d0013616f31c5da163eb6c07022649ac57422627a5642618f53103adc9918f9992c5b085e10d2744f9934bfbb994a710d6cd387c325e94278f97d5582864f1bb29a1400aaf674ea8fb99a3b42e4ac50418fd804a5b1471eaac4642d4aa338fd3d5d0dd84372b2c32c5cfe7f319acf731a9787b048cedee3833300dde639cb1386c8fbca4bae8d67fb7bd72d1696a0212e27e166e6b04a79e34b47c98502ed0bdbd8d61777537f72df569fe5ed30071b57e8724e98ccb88c07f0458cf32298cefb6ed672b255e581ac756789b57e950d57174bffd3f47bdbe4b168e7e3f1a6df508d4202d327947facfbf9526a9e5fc1a5abb179902d4584deae6cb2900391e080d3f3540b87c3a873ccfaee5b4aaff0e6516a867ea00b4d5e680fee6b91defc65c240614a1409bdd0f49c2c4f3c1d258d77abfc17a749660f49547adb236730e5a7a22fbbabdd8ca079a8efa5b605332db12f455868ab67a1ffd27d1339bdf8d150189cfbf6199c6fc27c05788138a63267eb8ac086e27286b4ef99ee9d92cfedab5ce9916675f128f206a1733f47a597232067aa12da20c7b9cab6575d7634f8c31e9a29948b528681f3f9c13b9f585ebfbff8c28a299a43e4409b31b6c02a79eeb493734fe5f9c1d9e3830572eb54229b5cf525768f695acff48c76b4a6e0936b7406ab69f06d33d3f04946db9d7966ea6e8c50ede5abadda28149edef5223a6938d5c32933070d234043feddbd65c81be218f9d7c497a1ecac30bb9162e60a9bbbcdb4fec4b212050610e2b376aadf58b3c9207860d2650d0310ae6606a8f1b266b6a13b68c3306ed413224abdf19371bac3ea1b964f28996fc70f666ff118c6a7c9f2108d327f5145919c03832f754de35f5979ae72130e39126499037d6fbb3751cbb4843b05d9dc91dd5fc1429da491f72e3069313ea243933b47109af247fcbe0c70f9024ac5a41815655ab309fcaa282d03596ba59cfee0e40f7bd657689453e98d562442fa4c585f970b6983a581b0b8eb1c5e780b3f5c1abb326213c6b5fd440c2187066ddf55f4eabf88804139392c45979440c6f05b7222bd95e963832d7fa4a4760273cc075e8b8feeccb917e8feaf7d3f766d9ae880487e69bc01872ba62b91b8af5dbffdd93fdc95e8f47ed793fc070a5991f2e9ea61439662dab218f643c1959171937aa160008a548f51f87b58f2c4fae5aed556f26bb9cd1dc2b3518458e2f5ec5d974c6e11a0ed639958cc8c1db771cc8cc8bee8727bf6452f47c9782acf548856a0e67841c3dbdb1c98572a4fc8e6cc8195a504019b4930d302a90dc20d8628ae6c90e0206cbb3d05025744db4e115cd3b650e5519a1624acbf226ebca8875b05183b2584e65289f8b9cec3f7d010cb9671a0e80bb70ca8763f1722d79e8decb6b9023baf64b5981e745c06546cc1ed08107216a9c758138b730bd5b5f4b613f192839514a8621634d9dbd5840e728c1ef4a2c8bbfadc376dd80d13dcb327ce55ab536a43b570789f5c5e135ac0af79b54232613d0e989ae695aeb358c671ae71d508b58a793e19c58c3d204cdc9a021ecc634bcb0bd6a1917554ea3bd688adab8163260a914fc01d7ce05a497a5c5836cf9401cb6aa35cd008470bdecfb97a511c905badd01bbb4d0c05867661debd2162beeccd52399d5a70a929405293916f33ed0d03f8b850f4bdd77b1fb6283118d71de629577383c81cad086f4099ce7476cb787f73c96431a0df4156f7826fce9045f7e7c97bbfd618b845595203cdc8df4638430fac74a07bc5f773486731d8ad29c06695704cbe2882077a85d543551b7ba81b181ccb237528609834324530d2b3071b1a38f3c762b42df8246aa64cecbdc772830ac79e766fa99e8c65225f28297a32526df9b51227bd368253737f013ae18435a912bc18cc4a95216ce449865e8bd8bc759dce9d4af52f9e789eafa37023e91946952202dfb7243cab7db2f9f98bb66f19750c547a2bf2e2ba92862ab66f33fcf465ffc41d23f0b891a3b28b3f68ea48dde6ad4802902abd22b0d7d9101bd61471c5d88ee9d9477b7cf9f6ac52e0f520c79278da22938745446f1e647ae478ecba416b941aa31f979d0633efe72910bebb8988de1d0013616f31c5da163eb6c07022649ac57422627a5642618f53103adc9918f9992c5b085e10d2744f9934bfbb994a710d6cd387c325e94278f97d5582864f1bb29a1400aaf674ea8fb99a3b42e4ac50418fd804a5b1471eaac4642d4aa338fd3d5d0dd84372b2c32c5cfe7f319acf731a9787b048cedee3833300dde639cb1386c8fbca4bae8d67fb7bd72d1696a0212e27e166e6b04a79e34b47c98502ed0bdbd8d61777537f72df569fe5ed30071b57e8724e98ccb88c07f0458cf32298cefb6ed672b255e581ac756789b57e950d57174bffd3f47bdbe4b168e7e3f1a6df508d4202d327947facfbf9526a9e5fc1a5abb179902d4584deae6cb2900391e080d3f3540b87c3a873ccfaee5b4aaff0e6516a867ea00b4d5e680fee6b91defc65c240614a1409bdd0f49c2c4f3c1d258d77abfc17a749660f49547adb236730e5a7a22fbbabdd8ca079a8efa5b605332db12f455868ab67a1ffd27d1339bdf8d150189cfbf6199c6fc27c05788138a63267eb8ac086e27286b4ef99ee9d92cfedab5ce9916675f128f206a1733f47a597232067aa12da20c7b9cab6575d7634f8c31e9a29948b528681f3f9c13b9f585ebfbff8c28a299a43e4409b31b6c02a79eeb493734fe5f9c1d9e3830572e4376ac7f543a5006c36fde8d7dec2bf28c2be708-4000066400000000000000000000000121454613650200357100ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus€[invalid461af154178d0d89b3c799eaf481f974215ceeff000066400000000000000000000000121454613650200354330ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus, how are 4ae6a22e35c37e994f34e23da3076e0ec38dbef9-16000066400000000000000000000000071454613650200360010ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁq@QŽ4f775bcf41892a67cb5aea0faff0472ce7ca41c3-6000066400000000000000000000000041454613650200360420ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSq@golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/5.bin000066400000000000000000000000371454613650200307430ustar00rootroot00000000000000SÀ`RpˆRRÿ@@@516b9783fca517eecbd1d064da2d165310b19759-5000066400000000000000000000000011454613650200354570ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusp52a719f9d01e6a1882f97bc011e52c80f807e955-1000066400000000000000000000000011454613650200353320ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus˜52b7ac9a22e13b86d635851d1edeaa6215acbd11-13000066400000000000000000000000471454613650200357440ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁä@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D5683957601796f95183be89492678b7d97e9ddf5-3000066400000000000000000000000031454613650200352030ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus€[57b03af4df0b9364d43537f737e32c7102ccf744000066400000000000000000000000111454613650200352410ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus€# 58774030375abb97309a8a57287e02496a5e4200-7000066400000000000000000000000051454613650200350330ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁä@E5a62db195e8c5337f5e1d756c6ecd8de9b6d919b-2000066400000000000000000000000031454613650200357340ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpuse5b9fadac2364324470d5ace4b03981e61260083e-15000066400000000000000000000000061454613650200354520ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁq@q5ba93c9db0cff93f52b521d7420e43f6eda2784f-1000066400000000000000000000000011454613650200357030ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus5cad2d1149dc942b1055fa5d3485665ad883bd39-3000066400000000000000000000000041454613650200354660ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSET5cd09f4a246136595476ddb323d9ae56cd5ea763-1000066400000000000000000000000141454613650200354750ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSÀ @@@@@@5cfb32860db309c158de061a15fdce29eab8ab90-6000066400000000000000000000000111454613650200357510ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusexpected5d29996a9b4db0ae8fc29df31be0a9dcb04b1c2e-16000066400000000000000000000000171454613650200362070ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁD@S@@S@@5dc56b9aab61867257a3c1bd7c786c9410d38cd2-1000066400000000000000000000000031454613650200355450ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusage5f39f6b43caa855ad762a91e1ffa619cbe5b6fd4-1000066400000000000000000000000111454613650200360500ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÐkgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/6.bin000066400000000000000000000001441454613650200307430ustar00rootroot00000000000000dSÀW¡(oJnNPGsiuzytMOJPatwtPilfsfykSBGplhxtxVSGCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@6bf90a75389603c62b639c8ee32a0d03c33219dc000066400000000000000000000000041454613650200352400ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusàR6c813a94a24b9f9331d609c0affb05a7a9371169-1000066400000000000000000000000041454613650200354020ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusS%Hgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/7.bin000066400000000000000000000005711454613650200307500ustar00rootroot00000000000000ySÀ CC F>Æ\&úEœ¨Žçƒã;C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[œ_)Ñ£x-opt-sequence-numberx£x-opt-locked-untilƒ[œ_ŸSsÀH ¡$5e84053f-81c9-49fc-ae42-ff0ab353d998@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?774ca0da71dad75bf4de948bd9566e101fba9864-5000066400000000000000000000000051454613650200357220ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSEì7bba2afbdc74e849a7f865e9010a19c9fbb7cc7e-18000066400000000000000000000000141454613650200362260ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁ@@Q,q@€q7be8bf7673be7cb6755837e2afa0963c0491c2b5-5000066400000000000000000000000121454613650200355620ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus[invalrd7d49133d4c80a414f1f4e0f317bc508d4ccb987e-6000066400000000000000000000000211454613650200355460ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSÀ @`@@` @```@7e15bb5c01e7dd56499e37c634cf791d3a519aee-5000066400000000000000000000000011454613650200356400ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus`7ed13cc836d3e59f7f0559f8571de1ae3f6e699b-6000066400000000000000000000170051454613650200357020ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSE19fa2641519e21293094e9d767ee1237f9e0715dc57172794867c3bbe2cb647f9b28a8d3f85c0ff557b91bad66f5ea16e0107757b0277fdd3ca05bf47c19bcb92a958a57e8c142a51af29bddb20af84377b6db65f77494e0dc4d2634a776b3a5d777319873bc0dacbbd4b9ebccfae849fa7e9769cdf54660ecca0d5cf4fa5190713726d54d02b3a3f21857125b8a808c0ca2f99d11dc430ed5113ee49ff8f00bcc08f0370dd510e8100e1285659a7b2c7457a6049f2af7786c4db1471ce5bd164e11c7a2165e83e03a135ae2b3429f82f677de044a067e99e0bda2d65a7270d629c00e1d528212d3aeb2896e58ee5145a93ed06a9c00705ad5c5988d3a192304c1d17661d45257c5d16799ef70771964435b12e3b2ee9d5b467c3b1992f45b7a59871b40d8daa1c280747ecb3d170257b91df1f549ce6d66455b5b6f60b7c6e95c92a67e20cffe8599ceb183de53f1dedfe19bae836447af8e053ba419660e0912cad064d6125b9e978e8d0d5f28f8a4e43ca3cdf2d4c0e9a11221d8184e9eb6c90761b0beac82d0d22793279aedb1c7db3632adbee323bc3bbde4801152694831abf5676979af26af7dcbadfba1cad1306b635840cbca76c558b37db0803b4c12befa27d16f21506b07ade4a838d6beba1816eb29ed5e3c4f132a752fc742747bd9ba879156e87e6c1584e911da9f796e1fa4a055e427272559e4bd6d0f54b8257100f8a55d84c27b702bb1fe2f995425c85fd48b0a0610db5b39f7a5031407a12dae9f508b21b1378f14952d1beb2dea81d016b2d9b7f1a67b814569b69c0e619adea02a8683242d63a11d3317d060e5b4d85df5ad73127541ba5314715d187990735aa81f438f8b94070ec506ba536274d98b766c1694e54367891a602b99e370425b47a70b819277a249fa429c5bbd0530267f987e6022f25030c30f3baeedc0d13c95f3d5e4b2b87465d179a3a23b9f9e76a42ceea55226ce072f9488392f40621289124d786109d2498e74fb37e2ef466fe8bf3016d96e34204c32978775765aa80461cac48518157f86d59f6187bad4ee62fba1ddbe166b29452f4a59af1e057300c353440644a8e40ae8171ea028be2fa315804abf518847c7945e8228b7766cfdb08d3a3116b59aab8e94b6d8c8c9ef442c2dc7f923bc2cd3e5c663baca7dded976bf191fe36da16948c89c385fe71434f4aa5dd15fe0e925d2459e3b068b9d82a9cc8b8f9786bd9f5fef9baaaf2d67027d9bfd58bb2c58ec7c746b747ab62f9242e4b53ed14d6fc75f5280eca0de23717c97a2293826e19cc8eb47f946421516c349dc4ba49225b91e4e868874bdebd373700df1f3792aaa140597e58b88f90e163397dbad3941705b53d754e3e0c9003df836a7fb8d23f40362fcb5f3947a4281b24240be4ee89aa8e917b194f94345eeca224df0adc15f22a617b6427f29410bc48ea3f92216163785723efc36301d23ed52780c6fd7924bcfaa03269b13582b7c7ea9c0e4a451f38a469fbdb585dcb7c81452da77945ebe27eb26ff6e8c7b2decea289aac5af74746dc257c9bea44a0847f02c4f586e1d76f39d5bf952355a0875f177a666d1d354ad86ce5ec0aba2c2b20cab050eaffd31095395132f5af80a2d2d53b77bda49f948bbb37bdf31c8a690476488e14e542ff6841e7fbfc2eb84795696562d079dc1612274b6dff362567084f793f0bc2dd8de23392d05aeeeeac6991c9f74387153a4b7da94790375e336a00c8293bad0fcef2dd1880e7094e2e53f738247c860780ebe308410ca02ae409ae720e841f48c9677acc6e7d4ccd18c219c400f8b7e1257f692e09eaef96802b17a1cb7d93eb81d3bfcbc7af4cdf05b98e22556b3d1a8b56d6d83bb5f5724696f8f329839dbe477483ec3c09fa2e0628faeba1bf285c224bea3f6cdc7bbd768133c6ef1da14f248cc3b819b196588811b073a7291817bd1e89c65760435d8d17cbf9423744a92143e0f956e2977b39c54fdead5a57f3a04a0facca01bbf44d3b1fb9c4fa83ae1046985e3f26aa0a437999004dd8adc04c5111759849f919b93558dbc559173a23b069b59f800096d9fcf077c7640f59170bb9a6fffe64778bac272365d27ea62aa956559e90edd3f6393cc8775597bcf7d91990ab9511973d948324a27261059e93f4b5dd2f70caf12e1a08e0493cb05588618764391f355379578cf94dd33e616136eea997ec11c0d4ff064ff51a767e5558433a2e3a9a74c232d8e187f47b8cca010709eb9fea0dac8f1ea53bf18822e154ecd929c83b0eac366e30fffbd5ba6a46d734f58d26e7f5df538e18b3d827884aa857a680823131bcf30a76f1a555bcabb17b02b53aefad96fe76f7312da69719434c580d3ff1bcdcd594e6375935003d5d732cc577e11ea2abb1d04259f50aed4c3af9866e8c4a52a09809046ee330f05c4403acbc297a9416c5208fadb31ed4eb7a3b01b87bf08c75cf44c2b0df84df30872d021d6567ea649859268e5e1b5b6405e1b41e350a32c1af13722959c17c01b52c42241313b26b25995a1c89a53e248488724d280647226195746901929501df36d1e94815d7fe6c4ca2731f3181293217f71b9d7f59c2474856972013924ae4796db4cbd22d8905a6043c959941ca6b556c53d1688c439036c715d33a47a7dfc2fe40e53424c5093020d2e85e4b04aa4c704ea5bfe5a2384878da38319c59d41d66b6add2a443d9ea11edd8d18fa41004251653857733b388b453943eb33df93dcd5d549757fa2967ef0f9a5105836c48826c47fcccb2d9bc349032b286962136b848632bdcf186a08cbeaa52d195efcfc3a440bac154971d11ff4994f293b14fb8c3214ebe7ab8b3d0f2fe0b03ed7b145fafd7730a173e3cc1847f0cdf2cf629f5ea81a07bef716b1a67dd9e3b7a52fea1aaa7a393f53b5bdb5988df78a57a9dad19a8253316835acab8a6b9a9fb42d97bf29b2443322f46de386fd82bd34ÿed68e2370c6eac4497b1bde7b42d569c452f377bd38bd50fa5a6792ef5c9ec6c647001149b86fedb3e2f18d4271e9cc4801aa16ecddb31b6a795fecabc613bfbc8e4f5636d71e74595c841fd11b6a6bc7f169317c1added56b82a71fc36d774bb4d661685363e9da5fd2e1f357006dc5b5bbf8b42ee3f869e75a541586fba558a8f490d641b78c27368b9b4c2db046354e9358ae9140e91cd95ebeffc6c0d2676a3ff4ab10d463bf32bed97023a80a79df191ab9858c43537a03072a17c30b1bd99efbd361590ed6b7d5b0ec4e2326fa35904ab9a48596f44491cbbc0112890f9386ed04dec30126be359a05e99b2b77fa2c8f6b7460a6cd590d71c73b2a1b23312ff89306b6e41c76ddc0a099bfa79498e36ae5cf0c560b8854dff32d2b690ce0ac4aabfa723ac6f2e97ad1083235196b464ad67fdd649aec01695d55c8b4bb198f30630ca635aa5a1915f3718341bcfd8b522f764015fa5479004d28eceea7fe67df7ee24a97a9708d528b89589f1899f13242a0d00f7464c3cdfce213699340e754533b934f4a8410224e111f31cf8e54d7b5e90cd8c68bf96edbc8d183894deefdf4fcc1a83162a3f6341dcd9a9aecf171c0df28257a68b1af1b67c54c43c3cff27fed89cc64bc46e23a49ec74a9efbab7981d9f0a018247441e4f0f5b5f68ba9325582f92de4cca4a5f878a0c5c387581e64324e3246d8f3205c838a29f1abeea24446e496421f0e742d411adb55f70272ae4a992e825a3d327e44b8b3762b25aa451d07eb4eac0322b431fa676462632daba2aba7bdeee1b438f051d21d4b1897e2ac2f95ee7c23f9996a805de8fffb3b30b855cd6c5b84c011accf4bf94d304d944079f04b5cadf8fcd6751c22a0f9165ab98998b2d89e6514641f1f3b91b8c0bf057d69c3d893fc4e041e06a2229e2ee58082ffb58cb920972ede58483287d0ace94c1becef26a410b93e4ff402e61dcc574b790d49679f18f4e2004f8b7cc357faba34a80e56821bb5b883d1a8b49c6605002152f270bbc36bc79095644e29ab08cc988deda765d67e4fff12b726d5de135ff9d0cbd9d5f9d440e548836633b93a38330d638468b59a32642da3375cdf70b062d14b46a78569c24a706e179baa2058dcae5c61fb6cadd9e015b017f26e9dbe3e6366cf5f1ec839aa3bbb21dd6c9b8e910245fa95b09b7d6cbf08a4c6c84bef257a70389be962dad14d97a893c128b73bf6580689e540d004f21edf8403f36b1ad7c9a2e83ffceb141af59700c316c8c1e3347187f24819c2ff0c9f9a2360dce354f3374374eab1643d2d8831310a8e3ca6768200ea7759822b82f7027cd450479fcc7f6d04802b15735a137ad489f1e1ee78434a253a9dd16684ad58fc91960cde6754f82e8b38edd5e798fdbbbf8fc2e2380a4e21dd94f8c1c063b18f29d8cd8d89f65deac5640799d4ca2caa29c1e72ad8bc417490d11e4051d94956fbc74289857e5f8e9e87b9a2d83074a994de0b10bc7782f6650cfbdb8c835c81cd88bdce5f04ca939b3c5cd010d4dc5d51224fcacbca9851694b8bf55b22dead859d023eee5a7ad3436a912c3fc0284456d5d72ea5f1afa8545c856676ac2dd9a057028bd3ca0f50e7070fa74152f13997c95c1834c3e67504f1a4165d2b49a96919b88f72caed60f56ca7ab5a3204fb12ad3592c725fdebb048732fc189c7dfed185c6c184a626e07d7356860d00389862d5b9701eaa4e5f7889e6db0f54633369b8d26805c08471de8fc3f8fa1fb0b0711d9e015add5373f7f8b64abaddbac3399c756244b1b07c579d33e4967e5e0cf16de29cb8a7efad07ff9039ca305772a6e45c76bd9b77e24949556766a8b8425c5e595efb431bde4ee222f9eb3fc2d002a1e2d14db2b23135266c942eea33bffd30eb0218405373240e0cd3040436ca895093bf056fd001c00ba59d90502042e6e6c0167105051628895c8164c9ab959400898309cabafdef12be53604fa57df44e0a90a81bd63c331291a93bffefe809e80db0679568f6e94e0d8e2edec0087c35bcb3c4f4725e6013bcf197156cd9d90612423348123383e45c14d27d8833f56ddb04083c069fd6e282fe69c940840f5f747dfb72ad72fd8cf9f3ded15c9e2f4727fd60b4f40e95dbe77a89b47dde7d5326942600554905d9dade9d145ab6da802643f2081678392609c2fdd1b79dd8caec137cbed315374c6f05c0758070f3bb17e23d81ccc39c6aa89913897e487fde889c5aacd422278f8571641cc4f0a93d9768aef9e45d6bd187d1ba637ce0fbd3c573d6778cf7bf5188c00dcdf13be3fd599143952b376220283e34e014e83b214bd5f64eb0ecb098ae8bef883949907cc36e22ece60b893b963cfa73d120513e285aaf70ce5add34edbdac60b3aa7b385b90e339058fb9b3cf984b06f79788016035c5ce490f7edd1dd232a61b147151d657b4ad5080896f8f0d-2000066400000000000000000000000021454613650200354550ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusag853f1c8d54efb4a498c650505c4ff81dde4a9fad-5000066400000000000000000000000041454613650200360040ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus`A‘86f7e437faa5a7fce15d1ddcb9eaeaea377667b8-2000066400000000000000000000000011454613650200362200ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusa879474ee598b7accef91707c74022759de0d20a7000066400000000000000000000000021454613650200352700ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus˜8822f6511bf324bb7ebaceb8aa04d4c17810fdb7-12000066400000000000000000000000311454613650200360240ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁä@D@D@D@D@D@D@D@D@D@D@D8bf4c5e5b390603eb9e890caea38799e3e12187c000066400000000000000000000000131454613650200354260ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus€FŒ¡8cfd5ee8899bde3f13105b2941d996ff897a95ea-7000066400000000000000000000000101454613650200356760ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSq@Sq@8e00ceea262207a72b34a20d95db0f1739f08963-14000066400000000000000000000000071454613650200354550ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁq@Sq9033dbbe605e30bf2960c4aff017e1d3987d1d32-4000066400000000000000000000000041454613650200355320ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSE90f77072468c77dbeceddc7feb3058847a99cf61-4000066400000000000000000000000021454613650200356620ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus@ï9605e94e3e7328beb9a80104d8bb62ee2a1b29da-6000066400000000000000000000000041454613650200356240ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁBÁ961adf360afe4f75b2acf0bcde6053dac3527c9a-20000066400000000000000000000000211454613650200361660ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁ@@Q,q@Q,q@€€9a78211436f6d425ec38f5c4e02270801f3524f8-3000066400000000000000000000000011454613650200351640ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus@9a9f039d63a4615e06467b2977472477e869a0ff-6000066400000000000000000000000061454613650200352310ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusq€refgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/ArrayUByte.bin000066400000000000000000000000111454613650200326160ustar00rootroot00000000000000àPÿgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/Error.bin000066400000000000000000000001071454613650200316660ustar00rootroot00000000000000SÐ?£amqp:not-allowed¡foo descriptionÁ¡other¡info¡and`kgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/ErrorCondition.bin000066400000000000000000000000171454613650200335350ustar00rootroot00000000000000£ the conditiongolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/Message.bin000066400000000000000000000003571454613650200321700ustar00rootroot00000000000000SpÐAPêp'AR SqÁ Q*¡answerSrÁ Q*¡answerSsÐc ¡yo baz¡me¡sup?¡you€†Ñ£ text/plain£UTF-8ƒ`ïçÿXƒ`ïÞט¡fooGroupp\ì¡barGroupStÁ ¡baz¡fooSu A nice little data payload.SwP*SxÁ¡hash  " golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/MessageHeader.bin000066400000000000000000000000271454613650200332730ustar00rootroot00000000000000SpÐAPêp'AR MessageProperties.bin000066400000000000000000000001531454613650200341600ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSsÐc ¡yo baz¡me¡sup?¡you€†Ñ£ text/plain£UTF-8ƒ`ïçÿXƒ`ïÞט¡fooGroupp\ì¡barGroupReceiverSettleMode.bin000066400000000000000000000000021454613650200342420ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusPSenderSettleMode.bin000066400000000000000000000000021454613650200337160ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusPgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/UUID.bin000066400000000000000000000000211454613650200313360ustar00rootroot00000000000000˜ golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/[][]uint8.bin000066400000000000000000000000371454613650200324260ustar00rootroot00000000000000ð°FOOBARBAZgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/[]amqp.UUID.bin000066400000000000000000000000241454613650200325660ustar00rootroot00000000000000à˜ golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/[]amqp.symbol.bin000066400000000000000000000000371454613650200333310ustar00rootroot00000000000000ð³FOOBARBAZgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/[]bool.bin000066400000000000000000000000101454613650200320110ustar00rootroot00000000000000àVgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/[]float32.bin000066400000000000000000000000241454613650200323350ustar00rootroot00000000000000àr@IÛÀIÛÀÿÀgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/[]float64.bin000066400000000000000000000000441454613650200323440ustar00rootroot00000000000000à"‚@ !ûTD-À !ûTD-øÿøgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/[]int16.bin000066400000000000000000000000161454613650200320250ustar00rootroot00000000000000à aÿ€golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/[]int32.bin000066400000000000000000000000111454613650200320160ustar00rootroot00000000000000àT€golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/[]int64.bin000066400000000000000000000000111454613650200320230ustar00rootroot00000000000000àU€golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/[]int8.bin000066400000000000000000000000111454613650200317410ustar00rootroot00000000000000àQ€golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/[]interface {}.bin000066400000000000000000000000241454613650200334530ustar00rootroot00000000000000Ða¡helloBgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/[]string.bin000066400000000000000000000000371454613650200323750ustar00rootroot00000000000000ð±FOOBARBAZgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/[]time.Time.bin000066400000000000000000000000141454613650200327150ustar00rootroot00000000000000à ƒa8h\xgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/[]uint16.bin000066400000000000000000000000161454613650200322120ustar00rootroot00000000000000à `golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/[]uint32.bin000066400000000000000000000000111454613650200322030ustar00rootroot00000000000000àRÿgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/[]uint64.bin000066400000000000000000000000111454613650200322100ustar00rootroot00000000000000àSÿa04c69c48ffd03775fc4b53606e9b0861d08b334-5000066400000000000000000000000021454613650200354100ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus€6a285971c39ef438a8def5e0c33e1b2a49938c6c4-11000066400000000000000000000000211454613650200356410ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁä@D@D@D@D@D@D@Da56dd2390739cd45485da0e45311a726bff75666-5000066400000000000000000000000151454613650200353400ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus€[invÙliÀFabdd9eaf989b25b6ad7e6f7b01713ee82bdace4b-1000066400000000000000000000001221454613650200362670ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÐMÿSÐA£amqp:link:stolen¡foo descriptionÁ¡other¡info¡andqkb38b9fa324bf0f02a39cb12659826064db34897d-10000066400000000000000000000000171454613650200354700ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpuspin%ð“EÚnb5ed1ba201e255910771f9002cf0be7fdd72ddb5-5000066400000000000000000000000031454613650200356620ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus`b643d008cb1a1e378850c226216425146a32ba21-15000066400000000000000000000000071454613650200352070ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁq@Qqb647ab1320e430dd6efb7fb7f3b76ddccac1bb1e-13000066400000000000000000000000771454613650200363330ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sqb8ea9a51ff0f7a6239655fbf6751851c53991836-3000066400000000000000000000000211454613650200353550ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSÀ @`@@`@@``@@bb1c13a2597e7ba09941fc9f9e87d0cdabf183ac-8000066400000000000000000000000101454613650200360470ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁä@D@D´bb23c94674637c78d392dc89e8c7cbdb6e912f16-4000066400000000000000000000000021454613650200355750ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusTbf8b4530d8d246dd74ac53a13471bba17941dff7000066400000000000000000000000011454613650200354530ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/bool.bin000066400000000000000000000000011454613650200315210ustar00rootroot00000000000000Ac241e51763b893d7b762b0c14b3dc5f0f3b19d7c-4000066400000000000000000000020021454613650200355360ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus@f89c825ca43cae1ce3fbdee85c505edd1aabefe69a0f9efd740f027aa7dee48a91ad24e69ad061648f0a52b4afb19d7ffccdc21f4b4247dfd89f5f9f998cb3c02b226173fedb6f8770aceef9271e7236fefd19fb3b87d08a5c587ac7918e80aa4b477f22602189811e270d686bc4949137a41d11d95ec96ee9d26c6126f6e923ab37638b34d1538d2e46d6df6216da4f193a3cecb731e632e109ced643056a1673059355d2d1314df35ded8364efed7de490201090a6f2d1751748585f64d26041637ba3723cbc4b60e226f10a19699d223075bc1f27d82e7f560c0db630ea670b3f8a70a8950894af4d1c7b3f674a3fa00d19ee4cc2b6174c1d259a297424bf2c3943a29a16a9830ce11abaa79cd2eb77b53a02b365b1838e7bfd5ae1bd044ffc885c61c6b2186a357e8b8f732b7ab96517969aeb70c7b493bbaca9462a61815a3c6135c748bf9c8487ac0631807aa69243fa09cd3b8efb63f8d4e090ad30b6c2f08bf4e82f191cedfa5cbe2b42268d67ecd105918181e44fc9879efd642d20be84e6f74717e03fb94fcbaa6ed3b307431d2a9384b8a2b3e5825ffce8d99af48f177e43bb4272226d8a5edd37d53807f768feb9e0733b437a1d0f84779ab68a1804e92a5eecca56364f0fa6dca152203b249fdc8fbd950fdc37c1887596308a90ba3a5751c7096bfbd1cb177bb17847b33c4379b43938a67674459cd9a06e301c269c2662e8945eadedadd6476aaf9903b745871-11000066400000000000000000000000351454613650200356550ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSq@Sq@Sq@Sq@Sq@Sq@Sq@c5731234f7d1255e10b66fdfdf066acdca62bf3e-5000066400000000000000000000000211454613650200357530ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSÀ `@@` @`ÉŽDïc78ebd3c85a39a596d9f5cfd2b8d240bc1b9c125-3000066400000000000000000000000011454613650200357700ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus€ccc3f6e97c43cdc5c599dfb044bac53c26d237a8-6000066400000000000000000000000171454613650200360570ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpuspin®ð“EÚ-xpeccd1f808b0ed9ec81de203697dbf95841803a89c8-12000066400000000000000000000000051454613650200356510ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁä@cf52953767a8ac69f73855c47e479472e6c3b2eb-7000066400000000000000000000000141454613650200354520ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpuspin®ð“EÚ-xd0a2f39505c190a04d053918025d76be835255c6-17000066400000000000000000000000071454613650200352410ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁ@@S,d0c7c920cbd1d0653cbcca1b9925ade3ea10ad99-14000066400000000000000000000000251454613650200361620ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁD@SÀ @D@D@D@D@D@d1f9061fa8270ac8bd88791e0680399173c65c62-10000066400000000000000000000000171454613650200353460ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁä@D@D@D@D@DD´d651dfdba3562837df2076483bbaa5e891976b23-4000066400000000000000000000000231454613650200354760ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSÀ @`@@` @```@@@d7bb52bfd4bf54e5fcd9e5d9ab32b96a1e43f459-19000066400000000000000000000000141454613650200362270ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁ@@Q,q@€qd95162aa18a0556b713b94c600d00b0048adb11f-3000066400000000000000000000000021454613650200353350ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusTUda243c1773f0377450e88e14df6dac4dcb59556e-9000066400000000000000000000000241454613650200355640ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSq@Sq@Sq@Sq@Sq@da39a3ee5e6b4b0d3255bfef95601890afd80709-1000066400000000000000000000000001454613650200356220ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusde6cc2015adb798f785a362eb077a7bb149744db-5000066400000000000000000000070051454613650200356420ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSE689683c9e7aa9c48b9fda0cfffea0458ea0c3dedccd21efeb06126f1194780917c9f4f2f44b1daceec3f6b1f75506f4169bdacf12c1f65958784851056fe0b4b42a22aeb043ab35ca73747346ac58c550324c4b849a404c94b8860967b6fc58aff25dad0556f1952c045b91f56ec8eebf6f552c18b2a0641c037e6c6538b289601e1fd5a7bbe7b6e0b224124fec341bf77615183abafb52b3e30082a0abfc2cf224324338c132426011d9f800b382e6b834896ea48a8247f149d92ded7e69c7800096076cd2a729a1fe41c70dafb1f855ffa2ffc27b93e2f5f6827ade7118af60730033675d84de9cde6c260d3d615a945dfe0ed25f33b6cbd2c0e204ee919219d85c7536f4700f06fa61937f8dbbe9bda88db1f4ba8a8d195cd385eec62edd9ce673880800be9aa4430e5c10a5908f6dd349af70f32b32d8db38a7d73821af47b993b622bf168565082d07e88fc48231a440469adeca59263302438ece96d89de11cf8057454d1bfe8e4e36965a4d82618834a0847af39dd8776866d9558a5cff79a1cc9d1e3c22e050677e54ead68b3cf0094daa01330d41bb66708a8bbb8a196fae5c77dc6774629d38905e81d97c5b16d755182f687a8046e55d148419cf9c12139fee50c0533b0f04a805723ce1ea5595fca5b668e58f6b3b396f438308372489b640317cfa3a79392cf6d1afdd8c3359557a83790021a4eb418fa189ad15ba9be0f74182ac76076f102ec171117a3d16ca20b4d200e03e54f1f0ee6308e463a148c0c85aac3ccbe5781cf45b53a313f7c9975a45d1853ed9104a860c08634a8211b87500b5ffa3d8d9d56f22256d485b9b45b24d3873159adb8ae25966cc40f164f342519e88d1ead1e711e1b2bbd4be64c7e83f056f797c2d3a5cf7c5025f92be5637fa7738a1bbba55f761dcd1451ce4b1e85a6628b629a2f7917a86363b01516472c0f8614abe2ad1c9d5501b2a44a68e3eeeb34a64541125bf49138bcd15b7c82dfd40708414b85107d8b982c4f99783a03c707a37787a91a7198063f0e8a2d52dca61755105faaa09c063c7a0849570cba1aa7ddb3600eeba602c7e7c9b90ed00ec731d4d1d8e4bb42f9e9db21616c4aca48dc27b939428834404331288f03c2b5e887103c51748d0257519c3988f6492eb70cabbc2dd8a8a910d737a678d0970ec48bef3b81673bd10b687b37e11d49e7cf90c03c54826ecd833bfd9dbb8174274dd45b139d08371d5d248ee33298193194734c5863adf4bca92bc282bae2f47da5201fc240dd0710a22a8d922faf92c2071a7eede7ee17232d3b6ee5f3ebb1a8b230600b243c860968ab427a5f540912e5e7bfa0271201f288727f2bd5173539d5318e5c1c0a71cba4d9501b91c3bffa7bb61b3713f1751efe94a66e17d2b42da51d13c3df40f4db988dace42a6a1b9d138c4f590b7227990711afbf8f56fa63f2800cc019bbd4a7b3a0983c9b9e5f77562dcad6de96e3b2eb85cd99d28a021a10d6734400a91369236b48ed68528afc68f247d45c79318fc5d634ecb0f3ef8536d8ec2e877adc3308be906c5b96777d0e05970023e5c5dffed12310cc97249e4b95e32451c9acca8394fde699deda57e938bed7167e62e2cb62357f82fbe821ee73b4e09c6e2f512515412c2f27805762a8493e74a3d30bb409e499002a97354381318af28311ce484bdf7c39db53f08f73ca5793945e13fc8c66d503fa95506b37ce134ce2945d75b424ca6367ef4ed47b9cb8ba7de80e773279bf23ac888eb105385ea958b1b49b27c8db6b1e14a5c8ed5d28808a7d0b6bff1a58f24f9c57fd8b8f477a9d1365f89c698b8ba923896181299d474b93e05d3c915b10a69e61910761a6d8644933c593661b0828afeca590ca18e702322d9140d98fcf836c2f7a4f72b59eb529823a52ab05d919c3eee4db2cae1067213c5070450a160fd52fa44bc9bacc5c136701cd7adb1faf484da376477da08f6a4dcaa37af47c7b026c2da9d5fd0b30741357104cb2bc0d3cebd132b5fc7c873ebeceec5492aecab95ab393f35b93b923d2ca071e6bd8522c3ad8598a05e96646504f1620c045aa5734d665acbdda0ef73612be4ca4d95ba069041e042497f7b10445869989ce30f55206a1feb4e64890b7d1f7e9df2e88a352674a52ae4267c06592d425ed1d88101cf94588135892218ac11f3976ab2b47a27f02eb887696c94b13d48b4370eb11222274b5513a0fef905c66d0c1893832ffdb9b333178b65338fd8b81094d8f86f2e4e96a47e72032cd6fd47af87eec295c6e980f595b57f79abeb4654c4039fa03ade732b1e579551898b801ecd6e0fb1c5fd198335834b51673d074a8222640d2a969998f5b878bf897fdcf3426c4e24a7c599e5567643fa79ea5d20e7de581a873ee0181e3632a4e304f9dae09a81f882d4061ec17e588793b160c93a926874d5a8b78727f88de9bc125589a9562db5bb1c01012bbea1b2eeab68877871ce83455db43cc48455effbc71c436aebe362af22c6a319d134f65681cgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/describedType.bin000066400000000000000000000000601454613650200333610ustar00rootroot00000000000000€FŒ¡$amqp.annotation.x-opt-offset > '312'df02856140147d7acd2c32bfdbd34409d86ab8b5-12000066400000000000000000000000431454613650200356740ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSq@Sq@Sq@Sq@Sq@Sq@Sq@Sq@Sqdf3f9d49b60d94ff9d604f8031e8eeaf377b6c5e-7000066400000000000000000000000171454613650200360310ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpuspinpð“EÚ-x®ece92026e5dc3e5f2bc5e0df5da992059e1403032e-9000066400000000000000000000000111454613650200355400ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁä@D@D@´ecb283c546e6debe33935dc0645ecc43781d9fe7-2000066400000000000000000000000101454613650200357200ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusS+Àanded90d61f26b81e1f6016f4a982f6dfa1c584fb31-17000066400000000000000000000000221454613650200357140ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁDS@@S@@S@@ee12dc162c95a4d73eccfae94fbc97477ff73d8e-6000066400000000000000000000000071454613650200361610ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁä`A‘f0a1ea77e4023620d3dc3eb69cb65a7c35920074-4000066400000000000000000000070021454613650200354520ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus@689683c9e7aa9c48b9fda0cfffea0458ea0c3dedccd21efeb06126f1194780917c9f4f2f44b1daceec3f6b1f75506f4169bdacf12c1f65958784851056fe0b4b42a22aeb043ab35ca73747346ac58c550324c4b849a404c94b8860967b6fc58aff25dad0556f1952c045b91f56ec8eebf6f552c18b2a0641c037e6c6538b289601e1fd5a7bbe7b6e0b224124fec341bf77615183abafb52b3e30082a0abfc2cf224324338c132426011d9f800b382e6b834896ea48a8247f149d92ded7e69c7800096076cd2a729a1fe41c70dafb1f855ffa2ffc27b93e2f5f6827ade7118af60730033675d84de9cde6c260d3d615a945dfe0ed25f33b6cbd2c0e204ee919219d85c7536f4700f06fa61937f8dbbe9bda88db1f4ba8a8d195cd385eec62edd9ce673880800be9aa4430e5c10a5908f6dd349af70f32b32d8db38a7d73821af47b993b622bf168565082d07e88fc48231a440469adeca59263302438ece96d89de11cf8057454d1bfe8e4e36965a4d82618834a0847af39dd8776866d9558a5cff79a1cc9d1e3c22e050677e54ead68b3cf0094daa01330d41bb66708a8bbb8a196fae5c77dc6774629d38905e81d97c5b16d755182f687a8046e55d148419cf9c12139fee50c0533b0f04a805723ce1ea5595fca5b668e58f6b3b396f438308372489b640317cfa3a79392cf6d1afdd8c3359557a83790021a4eb418fa189ad15ba9be0f74182ac76076f102ec171117a3d16ca20b4d200e03e54f1f0ee6308e463a148c0c85aac3ccbe5781cf45b53a313f7c9975a45d1853ed9104a860c08634a8211b87500b5ffa3d8d9d56f22256d485b9b45b24d3873159adb8ae25966cc40f164f342519e88d1ead1e711e1b2bbd4be64c7e83f056f797c2d3a5cf7c5025f92be5637fa7738a1bbba55f761dcd1451ce4b1e85a6628b629a2f7917a86363b01516472c0f8614abe2ad1c9d5501b2a44a68e3eeeb34a64541125bf49138bcd15b7c82dfd40708414b85107d8b982c4f99783a03c707a37787a91a7198063f0e8a2d52dca61755105faaa09c063c7a0849570cba1aa7ddb3600eeba602c7e7c9b90ed00ec731d4d1d8e4bb42f9e9db21616c4aca48dc27b939428834404331288f03c2b5e887103c51748d0257519c3988f6492eb70cabbc2dd8a8a910d737a678d0970ec48bef3b81673bd10b687b37e11d49e7cf90c03c54826ecd833bfd9dbb8174274dd45b139d08371d5d248ee33298193194734c5863adf4bca92bc282bae2f47da5201fc240dd0710a22a8d922faf92c2071a7eede7ee17232d3b6ee5f3ebb1a8b230600b243c860968ab427a5f540912e5e7bfa0271201f288727f2bd5173539d5318e5c1c0a71cba4d9501b91c3bffa7bb61b3713f1751efe94a66e17d2b42da51d13c3df40f4db988dace42a6a1b9d138c4f590b7227990711afbf8f56fa63f2800cc019bbd4a7b3a0983c9b9e5f77562dcad6de96e3b2eb85cd99d28a021a10d6734400a91369236b48ed68528afc68f247d45c79318fc5d634ecb0f3ef8536d8ec2e877adc3308be906c5b96777d0e05970023e5c5dffed12310cc97249e4b95e32451c9acca8394fde699deda57e938bed7167e62e2cb62357f82fbe821ee73b4e09c6e2f512515412c2f27805762a8493e74a3d30bb409e499002a97354381318af28311ce484bdf7c39db53f08f73ca5793945e13fc8c66d503fa95506b37ce134ce2945d75b424ca6367ef4ed47b9cb8ba7de80e773279bf23ac888eb105385ea958b1b49b27c8db6b1e14a5c8ed5d28808a7d0b6bff1a58f24f9c57fd8b8f477a9d1365f89c698b8ba923896181299d474b93e05d3c915b10a69e61910761a6d8644933c593661b0828afeca590ca18e702322d9140d98fcf836c2f7a4f72b59eb529823a52ab05d919c3eee4db2cae1067213c5070450a160fd52fa44bc9bacc5c136701cd7adb1faf484da376477da08f6a4dcaa37af47c7b026c2da9d5fd0b30741357104cb2bc0d3cebd132b5fc7c873ebeceec5492aecab95ab393f35b93b923d2ca071e6bd8522c3ad8598a05e96646504f1620c045aa5734d665acbdda0ef73612be4ca4d95ba069041e042497f7b10445869989ce30f55206a1feb4e64890b7d1f7e9df2e88a352674a52ae4267c06592d425ed1d88101cf94588135892218ac11f3976ab2b47a27f02eb887696c94b13d48b4370eb11222274b5513a0fef905c66d0c1893832ffdb9b333178b65338fd8b81094d8f86f2e4e96a47e72032cd6fd47af87eec295c6e980f595b57f79abeb4654c4039fa03ade732b1e579551898b801ecd6e0fb1c5fd198335834b51673d074a8222640d2a969998f5b878bf897fdcf3426c4e24a7c599e5567643fa79ea5d20e7de581a873ee0181e3632a4e304f9dae09a81f882d4061ec17e588793b160c93a926874d5a8b78727f88de9bc125589a9562db5bb1c01012bbea1b2eeab68877871ce83455db43cc48455effbc71c436aebe362af22c6a319d134f65681cf25f2c3efd06722b08dddedad6d1a3237e0eeb35-5000066400000000000000000000000061454613650200361110ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpuspintf4311d83fee253dca26ad0598e1831d52e17e7ab-7000066400000000000000000000000061454613650200356240ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁä@D´f57dd92f707db9b0fa115eba1a1083c18ffae82f-3000066400000000000000000000000151454613650200360400ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSÀ @@@@@@@f8eb2da1a363df26dc65056b5c38d45fb94cbd2a-4000066400000000000000000000000221454613650200360370ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSÀ @`@@`@```@@@f92cc1f6b6b59db6a229be9af0ebbad1b3dd5a1b-4000066400000000000000000000000041454613650200363250ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSSEfb6c0a234a61bb6c236dcc374d5552d7d8712d08-4000066400000000000000000000000111454613650200355260ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus€61035156fc1f11f1c8f1ecd0bf85df1e4ff2b8befedd8a6c000066400000000000000000000000021454613650200363440ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus˜ffe232b3f8fe79a866d3f1f89b35af785c5a430b-5000066400000000000000000000000041454613650200357330ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSqEgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/float32.bin000066400000000000000000000000051454613650200320440ustar00rootroot00000000000000rÿÀgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/float64.bin000066400000000000000000000000111454613650200320460ustar00rootroot00000000000000‚ÿøgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/int16.bin000066400000000000000000000000031454613650200315310ustar00rootroot00000000000000a€golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/int32.bin000066400000000000000000000000051454613650200315310ustar00rootroot00000000000000q€golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/int64.bin000066400000000000000000000000111454613650200315330ustar00rootroot00000000000000€golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/int8.bin000066400000000000000000000000021454613650200314510ustar00rootroot00000000000000Q€golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/lifetimePolicy.bin000066400000000000000000000000041454613650200335470ustar00rootroot00000000000000S+Egolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/mapAnyAny.bin000066400000000000000000000000301454613650200324650ustar00rootroot00000000000000Áÿÿÿÿÿÿû.  " golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/mapStringAny.bin000066400000000000000000000000251454613650200332100ustar00rootroot00000000000000Á¡hash  " golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/mapSymbolAny.bin000066400000000000000000000000251454613650200332070ustar00rootroot00000000000000Á£hash  " map[amqp.symbol]interface {}.bin000066400000000000000000000000251454613650200362560ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁ£hash  " map[interface {}]interface {}.bin000066400000000000000000000000241454613650200364030ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁqÿÿû.  " map[string]interface {}.bin000066400000000000000000000000251454613650200353220ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusÁ¡hash  " golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/milliseconds.bin000066400000000000000000000000051454613650200332570ustar00rootroot00000000000000p'golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/performAttach.bin000066400000000000000000000005551454613650200334030ustar00rootroot00000000000000SÐe¡fooNamep§BPPS(Д ¡fooAddrR£ link-detachp{AÁ£lifetime-policyS+E£ some-modeÁ£ foo:filter¡ bar value@ð³amqp:accepted:listð³barCapS)ÐN¡fooAddrR£ link-detachp{AÁ£lifetime-policyS+Eð³barCapÁ¡fooDeliveryTagS$EAp p€(Ïð³fooCapð³barCapÁ £fooPropT-golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/performBegin.bin000066400000000000000000000001311454613650200332110ustar00rootroot00000000000000SÐQ`áp #p–´®pâ£p&ð³fooCapð³barCapÁ £fooPropT-golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/performClose.bin000066400000000000000000000001231454613650200332330ustar00rootroot00000000000000SÐKSÐ?£amqp:not-allowed¡foo descriptionÁ¡other¡info¡and`kgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/performDetach.bin000066400000000000000000000003431454613650200333620ustar00rootroot00000000000000SÐÛpASÐÉ£amqp:link:redirect@Á®¡hostname¡#redirected.myservicebus.example.org¡ network-host¡#redirected.myservicebus.example.org¡portp'¡address¡5amqps://redirected.myservicebus.example.org:5671/pathperformDisposition.bin000066400000000000000000000000351454613650200344150ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpusSÐBpV œp§AS&EAgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/performEnd.bin000066400000000000000000000001231454613650200326740ustar00rootroot00000000000000SÐKSÐ?£amqp:not-allowed¡foo descriptionÁ¡other¡info¡and`kgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/performFlow.bin000066400000000000000000000001041454613650200330740ustar00rootroot00000000000000SÐ< pbppMLpsý p6'pzmpÒp fñAAÁ £fooPropT-golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/performOpen.bin000066400000000000000000000002101454613650200330640ustar00rootroot00000000000000SЀ ¡foo¡bar.hostph` @ð³ fooLocaleð³ barLocaleð³fooCapð³barCapÁ £fooPropT-golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/performTransfer.bin000066400000000000000000000001141454613650200337520ustar00rootroot00000000000000SÐ. pˆ§p4 foo tagR"AAPS#ÐCDAAAvery important payloadgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/role.bin000066400000000000000000000000011454613650200315270ustar00rootroot00000000000000Agolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/s2-0.bin000066400000000000000000000000101454613650200312470ustar00rootroot00000000000000AMQPgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/s2-1.bin000066400000000000000000000000771454613650200312650ustar00rootroot00000000000000?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/s2-10.bin000066400000000000000000000005721454613650200313450ustar00rootroot00000000000000zSÀ CR ”äYÃ?–?AƒÕðÔž‰6÷C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nlH£x-opt-sequence-number™£x-opt-locked-untilƒ[£ná‡SsÀH ¡$f5b39d65-785d-4f40-8106-52c089dab354@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/s2-2.bin000066400000000000000000000000321454613650200312550ustar00rootroot00000000000000SDÀ P Welcome!golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/s2-3.bin000066400000000000000000000000101454613650200312520ustar00rootroot00000000000000AMQPgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/s2-4.bin000066400000000000000000000001061454613650200312610ustar00rootroot00000000000000FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/s2-5.bin000066400000000000000000000000371454613650200312650ustar00rootroot00000000000000SÀ`RpˆRRÿ@@@golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/s2-6.bin000066400000000000000000000001441454613650200312650ustar00rootroot00000000000000dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/s2-7.bin000066400000000000000000000005711454613650200312720ustar00rootroot00000000000000ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/s2-8.bin000066400000000000000000000005721454613650200312740ustar00rootroot00000000000000zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/s2-9.bin000066400000000000000000000005721454613650200312750ustar00rootroot00000000000000zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/s2.bin000066400000000000000000000034311454613650200311240ustar00rootroot00000000000000AMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSDÀ P Welcome!AMQPFSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SÀ`RpˆRRÿ@@@dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?zSÀ CR ”äYÃ?–?AƒÕðÔž‰6÷C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nlH£x-opt-sequence-number™£x-opt-locked-untilƒ[£ná‡SsÀH ¡$f5b39d65-785d-4f40-8106-52c089dab354@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/s3.bin000066400000000000000000000035251454613650200311310ustar00rootroot00000000000000AMQPSPLIT ?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSPLIT SDÀ P Welcome!SPLIT AMQPSPLIT FSÀ9 ¡#cc6abb520e114eaa9a0bcad796d3e988_G0@p`p©€@@@@@SPLIT SÀ`RpˆRRÿ@@@SPLIT dSÀW¡(pqaJaBRgAvzLXqzRrrUIYvaIujDpHYjxeUBrVfdwCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@SPLIT ySÀ CC ¦á¯§?ž²F¤ãô¸´ò#ŽC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£njc£x-opt-sequence-number–£x-opt-locked-untilƒ[£nߣSsÀH ¡$b2e797dc-88e5-4fb3-8bb7-df1af588b32b@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR +gÂw{¤@©’*ÇýÄDC@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nj²£x-opt-sequence-number—£x-opt-locked-untilƒ[£nßñSsÀH ¡$bde3e002-0ce0-413e-9a5b-0bbcba19ae5d@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR Öy‚ ØC µ™I€˜;¤C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nl £x-opt-sequence-number˜£x-opt-locked-untilƒ[£náISsÀH ¡$81a39e80-81df-46c0-ae1f-8294b2c8da75@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?SPLIT zSÀ CR ”äYÃ?–?AƒÕðÔž‰6÷C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[£nlH£x-opt-sequence-number™£x-opt-locked-untilƒ[£ná‡SsÀH ¡$f5b39d65-785d-4f40-8106-52c089dab354@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/saslChallenge.bin000066400000000000000000000000341454613650200333410ustar00rootroot00000000000000SBРBARCHALLENGEgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/saslInit.bin000066400000000000000000000000441454613650200323630ustar00rootroot00000000000000SAУFOO  BARRESPONSE¡megolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/saslMechanisms.bin000066400000000000000000000000531454613650200335470ustar00rootroot00000000000000S@Ð#ð³FOOBARBAZgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/saslOutcome.bin000066400000000000000000000000531454613650200330730ustar00rootroot00000000000000SDÐ#P here's some info for you...golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/saslResponse.bin000066400000000000000000000000331454613650200332540ustar00rootroot00000000000000SCР BARRESPONSEgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/session1.bin000066400000000000000000000012541454613650200323450ustar00rootroot00000000000000AMQP?S@À2à/³MSSBCBSPLAIN ANONYMOUSEXTERNALSDÀ P Welcome!AMQPGSÀ: ¡$83a29bedd884468ba2e37f3017eeab1d_G29@p`p©€@@@@@SÀ`RpˆRRÿ@@@dSÀW¡(oJnNPGsiuzytMOJPatwtPilfsfykSBGplhxtxVSGCB@PS(À ¡/test@@@@@@@@@@@@@C€@@@ySÀ CC F>Æ\&úEœ¨Žçƒã;C@B@@@@ASpÀ @@pH@CSrÁ\£x-opt-enqueued-timeƒ[œ_)Ñ£x-opt-sequence-numberx£x-opt-locked-untilƒ[œ_ŸSsÀH ¡$5e84053f-81c9-49fc-ae42-ff0ab353d998@@¡Service Bus Explorer@@@@@@@@@StÁ8¡ MachineName¡WIN-37U7RVPH3B1¡UserName¡ AdministratorSu P Hi mate, how are you?golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/source.bin000066400000000000000000000002341454613650200320760ustar00rootroot00000000000000S(Д ¡fooAddrR£ link-detachp{AÁ£lifetime-policyS+E£ some-modeÁ£ foo:filter¡ bar value@ð³amqp:accepted:listð³barCapgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/stateAccepted.bin000066400000000000000000000000041454613650200333420ustar00rootroot00000000000000S$Egolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/stateModified.bin000066400000000000000000000000441454613650200333560ustar00rootroot00000000000000S'ÐAAÁ£more¡ annotationsgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/stateReceived.bin000066400000000000000000000000271454613650200333650ustar00rootroot00000000000000S#ÐRê€# golang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/stateRejected.bin000066400000000000000000000001251454613650200333630ustar00rootroot00000000000000S%ÐMSÐA£amqp:link:stolen¡foo descriptionÁ¡other¡info¡andqkgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/stateReleased.bin000066400000000000000000000000041454613650200333560ustar00rootroot00000000000000S&Egolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/symbol.bin000066400000000000000000000000121454613650200320750ustar00rootroot00000000000000£a symbolgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/target.bin000066400000000000000000000001261454613650200320640ustar00rootroot00000000000000S)ÐN¡fooAddrR£ link-detachp{AÁ£lifetime-policyS+Eð³barCapgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/uint16.bin000066400000000000000000000000031454613650200317160ustar00rootroot00000000000000`ÿÿgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/uint32.bin000066400000000000000000000000051454613650200317160ustar00rootroot00000000000000pÿÿÿÿgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/uint64.bin000066400000000000000000000000111454613650200317200ustar00rootroot00000000000000€ÿÿÿÿÿÿÿÿgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/uint8.bin000066400000000000000000000000021454613650200316360ustar00rootroot00000000000000Pÿgolang-github-azure-go-amqp-1.0.2/internal/encoding/testdata/fuzz/marshal/corpus/unsettled.bin000066400000000000000000000000271454613650200326050ustar00rootroot00000000000000Á¡fooDeliveryTagS$Egolang-github-azure-go-amqp-1.0.2/internal/encoding/types.go000066400000000000000000001343451454613650200240410ustar00rootroot00000000000000package encoding import ( "encoding/binary" "encoding/hex" "errors" "fmt" "math" "reflect" "time" "unicode/utf8" "github.com/Azure/go-amqp/internal/buffer" ) type AMQPType uint8 // Type codes const ( TypeCodeNull AMQPType = 0x40 // Bool TypeCodeBool AMQPType = 0x56 // boolean with the octet 0x00 being false and octet 0x01 being true TypeCodeBoolTrue AMQPType = 0x41 TypeCodeBoolFalse AMQPType = 0x42 // Unsigned TypeCodeUbyte AMQPType = 0x50 // 8-bit unsigned integer (1) TypeCodeUshort AMQPType = 0x60 // 16-bit unsigned integer in network byte order (2) TypeCodeUint AMQPType = 0x70 // 32-bit unsigned integer in network byte order (4) TypeCodeSmallUint AMQPType = 0x52 // unsigned integer value in the range 0 to 255 inclusive (1) TypeCodeUint0 AMQPType = 0x43 // the uint value 0 (0) TypeCodeUlong AMQPType = 0x80 // 64-bit unsigned integer in network byte order (8) TypeCodeSmallUlong AMQPType = 0x53 // unsigned long value in the range 0 to 255 inclusive (1) TypeCodeUlong0 AMQPType = 0x44 // the ulong value 0 (0) // Signed TypeCodeByte AMQPType = 0x51 // 8-bit two's-complement integer (1) TypeCodeShort AMQPType = 0x61 // 16-bit two's-complement integer in network byte order (2) TypeCodeInt AMQPType = 0x71 // 32-bit two's-complement integer in network byte order (4) TypeCodeSmallint AMQPType = 0x54 // 8-bit two's-complement integer (1) TypeCodeLong AMQPType = 0x81 // 64-bit two's-complement integer in network byte order (8) TypeCodeSmalllong AMQPType = 0x55 // 8-bit two's-complement integer // Decimal TypeCodeFloat AMQPType = 0x72 // IEEE 754-2008 binary32 (4) TypeCodeDouble AMQPType = 0x82 // IEEE 754-2008 binary64 (8) TypeCodeDecimal32 AMQPType = 0x74 // IEEE 754-2008 decimal32 using the Binary Integer Decimal encoding (4) TypeCodeDecimal64 AMQPType = 0x84 // IEEE 754-2008 decimal64 using the Binary Integer Decimal encoding (8) TypeCodeDecimal128 AMQPType = 0x94 // IEEE 754-2008 decimal128 using the Binary Integer Decimal encoding (16) // Other TypeCodeChar AMQPType = 0x73 // a UTF-32BE encoded Unicode character (4) TypeCodeTimestamp AMQPType = 0x83 // 64-bit two's-complement integer representing milliseconds since the unix epoch TypeCodeUUID AMQPType = 0x98 // UUID as defined in section 4.1.2 of RFC-4122 // Variable Length TypeCodeVbin8 AMQPType = 0xa0 // up to 2^8 - 1 octets of binary data (1 + variable) TypeCodeVbin32 AMQPType = 0xb0 // up to 2^32 - 1 octets of binary data (4 + variable) TypeCodeStr8 AMQPType = 0xa1 // up to 2^8 - 1 octets worth of UTF-8 Unicode (with no byte order mark) (1 + variable) TypeCodeStr32 AMQPType = 0xb1 // up to 2^32 - 1 octets worth of UTF-8 Unicode (with no byte order mark) (4 +variable) TypeCodeSym8 AMQPType = 0xa3 // up to 2^8 - 1 seven bit ASCII characters representing a symbolic value (1 + variable) TypeCodeSym32 AMQPType = 0xb3 // up to 2^32 - 1 seven bit ASCII characters representing a symbolic value (4 + variable) // Compound TypeCodeList0 AMQPType = 0x45 // the empty list (i.e. the list with no elements) (0) TypeCodeList8 AMQPType = 0xc0 // up to 2^8 - 1 list elements with total size less than 2^8 octets (1 + compound) TypeCodeList32 AMQPType = 0xd0 // up to 2^32 - 1 list elements with total size less than 2^32 octets (4 + compound) TypeCodeMap8 AMQPType = 0xc1 // up to 2^8 - 1 octets of encoded map data (1 + compound) TypeCodeMap32 AMQPType = 0xd1 // up to 2^32 - 1 octets of encoded map data (4 + compound) TypeCodeArray8 AMQPType = 0xe0 // up to 2^8 - 1 array elements with total size less than 2^8 octets (1 + array) TypeCodeArray32 AMQPType = 0xf0 // up to 2^32 - 1 array elements with total size less than 2^32 octets (4 + array) // Composites TypeCodeOpen AMQPType = 0x10 TypeCodeBegin AMQPType = 0x11 TypeCodeAttach AMQPType = 0x12 TypeCodeFlow AMQPType = 0x13 TypeCodeTransfer AMQPType = 0x14 TypeCodeDisposition AMQPType = 0x15 TypeCodeDetach AMQPType = 0x16 TypeCodeEnd AMQPType = 0x17 TypeCodeClose AMQPType = 0x18 TypeCodeSource AMQPType = 0x28 TypeCodeTarget AMQPType = 0x29 TypeCodeError AMQPType = 0x1d TypeCodeMessageHeader AMQPType = 0x70 TypeCodeDeliveryAnnotations AMQPType = 0x71 TypeCodeMessageAnnotations AMQPType = 0x72 TypeCodeMessageProperties AMQPType = 0x73 TypeCodeApplicationProperties AMQPType = 0x74 TypeCodeApplicationData AMQPType = 0x75 TypeCodeAMQPSequence AMQPType = 0x76 TypeCodeAMQPValue AMQPType = 0x77 TypeCodeFooter AMQPType = 0x78 TypeCodeStateReceived AMQPType = 0x23 TypeCodeStateAccepted AMQPType = 0x24 TypeCodeStateRejected AMQPType = 0x25 TypeCodeStateReleased AMQPType = 0x26 TypeCodeStateModified AMQPType = 0x27 TypeCodeSASLMechanism AMQPType = 0x40 TypeCodeSASLInit AMQPType = 0x41 TypeCodeSASLChallenge AMQPType = 0x42 TypeCodeSASLResponse AMQPType = 0x43 TypeCodeSASLOutcome AMQPType = 0x44 TypeCodeDeleteOnClose AMQPType = 0x2b TypeCodeDeleteOnNoLinks AMQPType = 0x2c TypeCodeDeleteOnNoMessages AMQPType = 0x2d TypeCodeDeleteOnNoLinksOrMessages AMQPType = 0x2e ) // Durability Policies const ( // No terminus state is retained durably. DurabilityNone Durability = 0 // Only the existence and configuration of the terminus is // retained durably. DurabilityConfiguration Durability = 1 // In addition to the existence and configuration of the // terminus, the unsettled state for durable messages is // retained durably. DurabilityUnsettledState Durability = 2 ) // Durability specifies the durability of a link. type Durability uint32 func (d *Durability) String() string { if d == nil { return "" } switch *d { case DurabilityNone: return "none" case DurabilityConfiguration: return "configuration" case DurabilityUnsettledState: return "unsettled-state" default: return fmt.Sprintf("unknown durability %d", *d) } } func (d Durability) Marshal(wr *buffer.Buffer) error { return Marshal(wr, uint32(d)) } func (d *Durability) Unmarshal(r *buffer.Buffer) error { return Unmarshal(r, (*uint32)(d)) } // Expiry Policies const ( // The expiry timer starts when terminus is detached. ExpiryLinkDetach ExpiryPolicy = "link-detach" // The expiry timer starts when the most recently // associated session is ended. ExpirySessionEnd ExpiryPolicy = "session-end" // The expiry timer starts when most recently associated // connection is closed. ExpiryConnectionClose ExpiryPolicy = "connection-close" // The terminus never expires. ExpiryNever ExpiryPolicy = "never" ) // ExpiryPolicy specifies when the expiry timer of a terminus // starts counting down from the timeout value. // // If the link is subsequently re-attached before the terminus is expired, // then the count down is aborted. If the conditions for the // terminus-expiry-policy are subsequently re-met, the expiry timer restarts // from its originally configured timeout value. type ExpiryPolicy Symbol func ValidateExpiryPolicy(e ExpiryPolicy) error { switch e { case ExpiryLinkDetach, ExpirySessionEnd, ExpiryConnectionClose, ExpiryNever: return nil default: return fmt.Errorf("unknown expiry-policy %q", e) } } func (e ExpiryPolicy) Marshal(wr *buffer.Buffer) error { return Symbol(e).Marshal(wr) } func (e *ExpiryPolicy) Unmarshal(r *buffer.Buffer) error { err := Unmarshal(r, (*Symbol)(e)) if err != nil { return err } return ValidateExpiryPolicy(*e) } func (e *ExpiryPolicy) String() string { if e == nil { return "" } return string(*e) } // Sender Settlement Modes const ( // Sender will send all deliveries initially unsettled to the receiver. SenderSettleModeUnsettled SenderSettleMode = 0 // Sender will send all deliveries settled to the receiver. SenderSettleModeSettled SenderSettleMode = 1 // Sender MAY send a mixture of settled and unsettled deliveries to the receiver. SenderSettleModeMixed SenderSettleMode = 2 ) // SenderSettleMode specifies how the sender will settle messages. type SenderSettleMode uint8 func (m SenderSettleMode) Ptr() *SenderSettleMode { return &m } func (m *SenderSettleMode) String() string { if m == nil { return "" } switch *m { case SenderSettleModeUnsettled: return "unsettled" case SenderSettleModeSettled: return "settled" case SenderSettleModeMixed: return "mixed" default: return fmt.Sprintf("unknown sender mode %d", uint8(*m)) } } func (m SenderSettleMode) Marshal(wr *buffer.Buffer) error { return Marshal(wr, uint8(m)) } func (m *SenderSettleMode) Unmarshal(r *buffer.Buffer) error { n, err := ReadUbyte(r) *m = SenderSettleMode(n) return err } // Receiver Settlement Modes const ( // Receiver will spontaneously settle all incoming transfers. ReceiverSettleModeFirst ReceiverSettleMode = 0 // Receiver will only settle after sending the disposition to the // sender and receiving a disposition indicating settlement of // the delivery from the sender. ReceiverSettleModeSecond ReceiverSettleMode = 1 ) // ReceiverSettleMode specifies how the receiver will settle messages. type ReceiverSettleMode uint8 func (m ReceiverSettleMode) Ptr() *ReceiverSettleMode { return &m } func (m *ReceiverSettleMode) String() string { if m == nil { return "" } switch *m { case ReceiverSettleModeFirst: return "first" case ReceiverSettleModeSecond: return "second" default: return fmt.Sprintf("unknown receiver mode %d", uint8(*m)) } } func (m ReceiverSettleMode) Marshal(wr *buffer.Buffer) error { return Marshal(wr, uint8(m)) } func (m *ReceiverSettleMode) Unmarshal(r *buffer.Buffer) error { n, err := ReadUbyte(r) *m = ReceiverSettleMode(n) return err } type Role bool const ( RoleSender Role = false RoleReceiver Role = true ) func (rl Role) String() string { if rl { return "Receiver" } return "Sender" } func (rl *Role) Unmarshal(r *buffer.Buffer) error { b, err := readBool(r) *rl = Role(b) return err } func (rl Role) Marshal(wr *buffer.Buffer) error { return Marshal(wr, (bool)(rl)) } type SASLCode uint8 // SASL Codes const ( CodeSASLOK SASLCode = iota // Connection authentication succeeded. CodeSASLAuth // Connection authentication failed due to an unspecified problem with the supplied credentials. CodeSASLSysPerm // Connection authentication failed due to a system error that is unlikely to be corrected without intervention. ) func (s SASLCode) Marshal(wr *buffer.Buffer) error { return Marshal(wr, uint8(s)) } func (s *SASLCode) Unmarshal(r *buffer.Buffer) error { n, err := ReadUbyte(r) *s = SASLCode(n) return err } // DeliveryState encapsulates the various concrete delivery states. // http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-messaging-v1.0-os.html#section-delivery-state // TODO: http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-transactions-v1.0-os.html#type-declared type DeliveryState interface { deliveryState() // marker method } type Unsettled map[string]DeliveryState func (u Unsettled) Marshal(wr *buffer.Buffer) error { return writeMap(wr, u) } func (u *Unsettled) Unmarshal(r *buffer.Buffer) error { count, err := readMapHeader(r) if err != nil { return err } m := make(Unsettled, count/2) for i := uint32(0); i < count; i += 2 { key, err := ReadString(r) if err != nil { return err } var value DeliveryState err = Unmarshal(r, &value) if err != nil { return err } m[key] = value } *u = m return nil } type Filter map[Symbol]*DescribedType func (f Filter) Marshal(wr *buffer.Buffer) error { return writeMap(wr, f) } func (f *Filter) Unmarshal(r *buffer.Buffer) error { count, err := readMapHeader(r) if err != nil { return err } m := make(Filter, count/2) for i := uint32(0); i < count; i += 2 { key, err := ReadString(r) if err != nil { return err } var value DescribedType err = Unmarshal(r, &value) if err != nil { return err } m[Symbol(key)] = &value } *f = m return nil } // peekMessageType reads the message type without // modifying any data. func PeekMessageType(buf []byte) (uint8, uint8, error) { if len(buf) < 3 { return 0, 0, errors.New("invalid message") } if buf[0] != 0 { return 0, 0, fmt.Errorf("invalid composite header %02x", buf[0]) } // copied from readUlong to avoid allocations t := AMQPType(buf[1]) if t == TypeCodeUlong0 { return 0, 2, nil } if t == TypeCodeSmallUlong { if len(buf[2:]) == 0 { return 0, 0, errors.New("invalid ulong") } return buf[2], 3, nil } if t != TypeCodeUlong { return 0, 0, fmt.Errorf("invalid type for uint32 %02x", t) } if len(buf[2:]) < 8 { return 0, 0, errors.New("invalid ulong") } v := binary.BigEndian.Uint64(buf[2:10]) return uint8(v), 10, nil } func tryReadNull(r *buffer.Buffer) bool { if r.Len() > 0 && AMQPType(r.Bytes()[0]) == TypeCodeNull { r.Skip(1) return true } return false } // Annotations keys must be of type string, int, or int64. // // String keys are encoded as AMQP Symbols. type Annotations map[any]any func (a Annotations) Marshal(wr *buffer.Buffer) error { return writeMap(wr, a) } func (a *Annotations) Unmarshal(r *buffer.Buffer) error { count, err := readMapHeader(r) if err != nil { return err } m := make(Annotations, count/2) for i := uint32(0); i < count; i += 2 { key, err := ReadAny(r) if err != nil { return err } value, err := ReadAny(r) if err != nil { return err } m[key] = value } *a = m return nil } // ErrCond is one of the error conditions defined in the AMQP spec. type ErrCond string func (ec ErrCond) Marshal(wr *buffer.Buffer) error { return (Symbol)(ec).Marshal(wr) } func (ec *ErrCond) Unmarshal(r *buffer.Buffer) error { s, err := ReadString(r) *ec = ErrCond(s) return err } /* */ // Error is an AMQP error. type Error struct { // A symbolic value indicating the error condition. Condition ErrCond // descriptive text about the error condition // // This text supplies any supplementary details not indicated by the condition field. // This text can be logged as an aid to resolving issues. Description string // map carrying information about the error condition Info map[string]any } func (e *Error) Marshal(wr *buffer.Buffer) error { return MarshalComposite(wr, TypeCodeError, []MarshalField{ {Value: &e.Condition, Omit: false}, {Value: &e.Description, Omit: e.Description == ""}, {Value: e.Info, Omit: len(e.Info) == 0}, }) } func (e *Error) Unmarshal(r *buffer.Buffer) error { return UnmarshalComposite(r, TypeCodeError, []UnmarshalField{ {Field: &e.Condition, HandleNull: func() error { return errors.New("Error.Condition is required") }}, {Field: &e.Description}, {Field: &e.Info}, }...) } func (e *Error) String() string { if e == nil { return "*Error(nil)" } return fmt.Sprintf("*Error{Condition: %s, Description: %s, Info: %v}", e.Condition, e.Description, e.Info, ) } func (e *Error) Error() string { return e.String() } /* */ type StateReceived struct { // When sent by the sender this indicates the first section of the message // (with section-number 0 being the first section) for which data can be resent. // Data from sections prior to the given section cannot be retransmitted for // this delivery. // // When sent by the receiver this indicates the first section of the message // for which all data might not yet have been received. SectionNumber uint32 // When sent by the sender this indicates the first byte of the encoded section // data of the section given by section-number for which data can be resent // (with section-offset 0 being the first byte). Bytes from the same section // prior to the given offset section cannot be retransmitted for this delivery. // // When sent by the receiver this indicates the first byte of the given section // which has not yet been received. Note that if a receiver has received all of // section number X (which contains N bytes of data), but none of section number // X + 1, then it can indicate this by sending either Received(section-number=X, // section-offset=N) or Received(section-number=X+1, section-offset=0). The state // Received(section-number=0, section-offset=0) indicates that no message data // at all has been transferred. SectionOffset uint64 } func (sr *StateReceived) deliveryState() {} func (sr *StateReceived) Marshal(wr *buffer.Buffer) error { return MarshalComposite(wr, TypeCodeStateReceived, []MarshalField{ {Value: &sr.SectionNumber, Omit: false}, {Value: &sr.SectionOffset, Omit: false}, }) } func (sr *StateReceived) Unmarshal(r *buffer.Buffer) error { return UnmarshalComposite(r, TypeCodeStateReceived, []UnmarshalField{ {Field: &sr.SectionNumber, HandleNull: func() error { return errors.New("StateReceiver.SectionNumber is required") }}, {Field: &sr.SectionOffset, HandleNull: func() error { return errors.New("StateReceiver.SectionOffset is required") }}, }...) } /* */ type StateAccepted struct{} func (sr *StateAccepted) deliveryState() {} func (sa *StateAccepted) Marshal(wr *buffer.Buffer) error { return MarshalComposite(wr, TypeCodeStateAccepted, nil) } func (sa *StateAccepted) Unmarshal(r *buffer.Buffer) error { return UnmarshalComposite(r, TypeCodeStateAccepted) } func (sa *StateAccepted) String() string { return "Accepted" } /* */ type StateRejected struct { Error *Error } func (sr *StateRejected) deliveryState() {} func (sr *StateRejected) Marshal(wr *buffer.Buffer) error { return MarshalComposite(wr, TypeCodeStateRejected, []MarshalField{ {Value: sr.Error, Omit: sr.Error == nil}, }) } func (sr *StateRejected) Unmarshal(r *buffer.Buffer) error { return UnmarshalComposite(r, TypeCodeStateRejected, UnmarshalField{Field: &sr.Error}, ) } func (sr *StateRejected) String() string { return fmt.Sprintf("Rejected{Error: %v}", sr.Error) } /* */ type StateReleased struct{} func (sr *StateReleased) deliveryState() {} func (sr *StateReleased) Marshal(wr *buffer.Buffer) error { return MarshalComposite(wr, TypeCodeStateReleased, nil) } func (sr *StateReleased) Unmarshal(r *buffer.Buffer) error { return UnmarshalComposite(r, TypeCodeStateReleased) } func (sr *StateReleased) String() string { return "Released" } /* */ type StateModified struct { // count the transfer as an unsuccessful delivery attempt // // If the delivery-failed flag is set, any messages modified // MUST have their delivery-count incremented. DeliveryFailed bool // prevent redelivery // // If the undeliverable-here is set, then any messages released MUST NOT // be redelivered to the modifying link endpoint. UndeliverableHere bool // message attributes // Map containing attributes to combine with the existing message-annotations // held in the message's header section. Where the existing message-annotations // of the message contain an entry with the same key as an entry in this field, // the value in this field associated with that key replaces the one in the // existing headers; where the existing message-annotations has no such value, // the value in this map is added. MessageAnnotations Annotations } func (sr *StateModified) deliveryState() {} func (sm *StateModified) Marshal(wr *buffer.Buffer) error { return MarshalComposite(wr, TypeCodeStateModified, []MarshalField{ {Value: &sm.DeliveryFailed, Omit: !sm.DeliveryFailed}, {Value: &sm.UndeliverableHere, Omit: !sm.UndeliverableHere}, {Value: sm.MessageAnnotations, Omit: sm.MessageAnnotations == nil}, }) } func (sm *StateModified) Unmarshal(r *buffer.Buffer) error { return UnmarshalComposite(r, TypeCodeStateModified, []UnmarshalField{ {Field: &sm.DeliveryFailed}, {Field: &sm.UndeliverableHere}, {Field: &sm.MessageAnnotations}, }...) } func (sm *StateModified) String() string { return fmt.Sprintf("Modified{DeliveryFailed: %t, UndeliverableHere: %t, MessageAnnotations: %v}", sm.DeliveryFailed, sm.UndeliverableHere, sm.MessageAnnotations) } // symbol is an AMQP symbolic string. type Symbol string func (s Symbol) Marshal(wr *buffer.Buffer) error { l := len(s) switch { // Sym8 case l < 256: wr.Append([]byte{ byte(TypeCodeSym8), byte(l), }) wr.AppendString(string(s)) // Sym32 case uint(l) < math.MaxUint32: wr.AppendByte(uint8(TypeCodeSym32)) wr.AppendUint32(uint32(l)) wr.AppendString(string(s)) default: return errors.New("too long") } return nil } type Milliseconds time.Duration func (m Milliseconds) Marshal(wr *buffer.Buffer) error { writeUint32(wr, uint32(m/Milliseconds(time.Millisecond))) return nil } func (m *Milliseconds) Unmarshal(r *buffer.Buffer) error { n, err := readUint(r) *m = Milliseconds(time.Duration(n) * time.Millisecond) return err } // mapAnyAny is used to decode AMQP maps who's keys are undefined or // inconsistently typed. type mapAnyAny map[any]any func (m mapAnyAny) Marshal(wr *buffer.Buffer) error { return writeMap(wr, map[any]any(m)) } func (m *mapAnyAny) Unmarshal(r *buffer.Buffer) error { count, err := readMapHeader(r) if err != nil { return err } mm := make(mapAnyAny, count/2) for i := uint32(0); i < count; i += 2 { key, err := ReadAny(r) if err != nil { return err } value, err := ReadAny(r) if err != nil { return err } // https://golang.org/ref/spec#Map_types: // The comparison operators == and != must be fully defined // for operands of the key type; thus the key type must not // be a function, map, or slice. switch reflect.ValueOf(key).Kind() { case reflect.Slice, reflect.Func, reflect.Map: return errors.New("invalid map key") } mm[key] = value } *m = mm return nil } // mapStringAny is used to decode AMQP maps that have string keys type mapStringAny map[string]any func (m mapStringAny) Marshal(wr *buffer.Buffer) error { return writeMap(wr, map[string]any(m)) } func (m *mapStringAny) Unmarshal(r *buffer.Buffer) error { count, err := readMapHeader(r) if err != nil { return err } mm := make(mapStringAny, count/2) for i := uint32(0); i < count; i += 2 { key, err := ReadString(r) if err != nil { return err } value, err := ReadAny(r) if err != nil { return err } mm[key] = value } *m = mm return nil } // mapStringAny is used to decode AMQP maps that have Symbol keys type mapSymbolAny map[Symbol]any func (m mapSymbolAny) Marshal(wr *buffer.Buffer) error { return writeMap(wr, map[Symbol]any(m)) } func (m *mapSymbolAny) Unmarshal(r *buffer.Buffer) error { count, err := readMapHeader(r) if err != nil { return err } mm := make(mapSymbolAny, count/2) for i := uint32(0); i < count; i += 2 { key, err := ReadString(r) if err != nil { return err } value, err := ReadAny(r) if err != nil { return err } mm[Symbol(key)] = value } *m = mm return nil } // UUID is a 128 bit identifier as defined in RFC 4122. type UUID [16]byte // String returns the hex encoded representation described in RFC 4122, Section 3. func (u UUID) String() string { var buf [36]byte hex.Encode(buf[:8], u[:4]) buf[8] = '-' hex.Encode(buf[9:13], u[4:6]) buf[13] = '-' hex.Encode(buf[14:18], u[6:8]) buf[18] = '-' hex.Encode(buf[19:23], u[8:10]) buf[23] = '-' hex.Encode(buf[24:], u[10:]) return string(buf[:]) } func (u UUID) Marshal(wr *buffer.Buffer) error { wr.AppendByte(byte(TypeCodeUUID)) wr.Append(u[:]) return nil } func (u *UUID) Unmarshal(r *buffer.Buffer) error { un, err := readUUID(r) *u = un return err } type LifetimePolicy uint8 const ( DeleteOnClose = LifetimePolicy(TypeCodeDeleteOnClose) DeleteOnNoLinks = LifetimePolicy(TypeCodeDeleteOnNoLinks) DeleteOnNoMessages = LifetimePolicy(TypeCodeDeleteOnNoMessages) DeleteOnNoLinksOrMessages = LifetimePolicy(TypeCodeDeleteOnNoLinksOrMessages) ) func (p LifetimePolicy) Marshal(wr *buffer.Buffer) error { wr.Append([]byte{ 0x0, byte(TypeCodeSmallUlong), byte(p), byte(TypeCodeList0), }) return nil } func (p *LifetimePolicy) Unmarshal(r *buffer.Buffer) error { typ, fields, err := readCompositeHeader(r) if err != nil { return err } if fields != 0 { return fmt.Errorf("invalid size %d for lifetime-policy", fields) } *p = LifetimePolicy(typ) return nil } type DescribedType struct { Descriptor any Value any } func (t DescribedType) Marshal(wr *buffer.Buffer) error { wr.AppendByte(0x0) // descriptor constructor err := Marshal(wr, t.Descriptor) if err != nil { return err } return Marshal(wr, t.Value) } func (t *DescribedType) Unmarshal(r *buffer.Buffer) error { b, err := r.ReadByte() if err != nil { return err } if b != 0x0 { return fmt.Errorf("invalid described type header %02x", b) } err = Unmarshal(r, &t.Descriptor) if err != nil { return err } return Unmarshal(r, &t.Value) } func (t DescribedType) String() string { return fmt.Sprintf("DescribedType{descriptor: %v, value: %v}", t.Descriptor, t.Value, ) } // SLICES // ArrayUByte allows encoding []uint8/[]byte as an array // rather than binary data. type ArrayUByte []uint8 func (a ArrayUByte) Marshal(wr *buffer.Buffer) error { const typeSize = 1 writeArrayHeader(wr, len(a), typeSize, TypeCodeUbyte) wr.Append(a) return nil } func (a *ArrayUByte) Unmarshal(r *buffer.Buffer) error { length, err := readArrayHeader(r) if err != nil { return err } type_, err := readType(r) if err != nil { return err } if type_ != TypeCodeUbyte { return fmt.Errorf("invalid type for []uint16 %02x", type_) } buf, ok := r.Next(length) if !ok { return fmt.Errorf("invalid length %d", length) } *a = append([]byte(nil), buf...) return nil } type arrayInt8 []int8 func (a arrayInt8) Marshal(wr *buffer.Buffer) error { const typeSize = 1 writeArrayHeader(wr, len(a), typeSize, TypeCodeByte) for _, value := range a { wr.AppendByte(uint8(value)) } return nil } func (a *arrayInt8) Unmarshal(r *buffer.Buffer) error { length, err := readArrayHeader(r) if err != nil { return err } type_, err := readType(r) if err != nil { return err } if type_ != TypeCodeByte { return fmt.Errorf("invalid type for []uint16 %02x", type_) } buf, ok := r.Next(length) if !ok { return fmt.Errorf("invalid length %d", length) } aa := (*a)[:0] if int64(cap(aa)) < length { aa = make([]int8, length) } else { aa = aa[:length] } for i, value := range buf { aa[i] = int8(value) } *a = aa return nil } type arrayUint16 []uint16 func (a arrayUint16) Marshal(wr *buffer.Buffer) error { const typeSize = 2 writeArrayHeader(wr, len(a), typeSize, TypeCodeUshort) for _, element := range a { wr.AppendUint16(element) } return nil } func (a *arrayUint16) Unmarshal(r *buffer.Buffer) error { length, err := readArrayHeader(r) if err != nil { return err } type_, err := readType(r) if err != nil { return err } if type_ != TypeCodeUshort { return fmt.Errorf("invalid type for []uint16 %02x", type_) } const typeSize = 2 buf, ok := r.Next(length * typeSize) if !ok { return fmt.Errorf("invalid length %d", length) } aa := (*a)[:0] if int64(cap(aa)) < length { aa = make([]uint16, length) } else { aa = aa[:length] } var bufIdx int for i := range aa { aa[i] = binary.BigEndian.Uint16(buf[bufIdx:]) bufIdx += 2 } *a = aa return nil } type arrayInt16 []int16 func (a arrayInt16) Marshal(wr *buffer.Buffer) error { const typeSize = 2 writeArrayHeader(wr, len(a), typeSize, TypeCodeShort) for _, element := range a { wr.AppendUint16(uint16(element)) } return nil } func (a *arrayInt16) Unmarshal(r *buffer.Buffer) error { length, err := readArrayHeader(r) if err != nil { return err } type_, err := readType(r) if err != nil { return err } if type_ != TypeCodeShort { return fmt.Errorf("invalid type for []uint16 %02x", type_) } const typeSize = 2 buf, ok := r.Next(length * typeSize) if !ok { return fmt.Errorf("invalid length %d", length) } aa := (*a)[:0] if int64(cap(aa)) < length { aa = make([]int16, length) } else { aa = aa[:length] } var bufIdx int for i := range aa { aa[i] = int16(binary.BigEndian.Uint16(buf[bufIdx : bufIdx+2])) bufIdx += 2 } *a = aa return nil } type arrayUint32 []uint32 func (a arrayUint32) Marshal(wr *buffer.Buffer) error { var ( typeSize = 1 TypeCode = TypeCodeSmallUint ) for _, n := range a { if n > math.MaxUint8 { typeSize = 4 TypeCode = TypeCodeUint break } } writeArrayHeader(wr, len(a), typeSize, TypeCode) if TypeCode == TypeCodeUint { for _, element := range a { wr.AppendUint32(element) } } else { for _, element := range a { wr.AppendByte(byte(element)) } } return nil } func (a *arrayUint32) Unmarshal(r *buffer.Buffer) error { length, err := readArrayHeader(r) if err != nil { return err } aa := (*a)[:0] type_, err := readType(r) if err != nil { return err } switch type_ { case TypeCodeUint0: if int64(cap(aa)) < length { aa = make([]uint32, length) } else { aa = aa[:length] for i := range aa { aa[i] = 0 } } case TypeCodeSmallUint: buf, ok := r.Next(length) if !ok { return errors.New("invalid length") } if int64(cap(aa)) < length { aa = make([]uint32, length) } else { aa = aa[:length] } for i, n := range buf { aa[i] = uint32(n) } case TypeCodeUint: const typeSize = 4 buf, ok := r.Next(length * typeSize) if !ok { return fmt.Errorf("invalid length %d", length) } if int64(cap(aa)) < length { aa = make([]uint32, length) } else { aa = aa[:length] } var bufIdx int for i := range aa { aa[i] = binary.BigEndian.Uint32(buf[bufIdx : bufIdx+4]) bufIdx += 4 } default: return fmt.Errorf("invalid type for []uint32 %02x", type_) } *a = aa return nil } type arrayInt32 []int32 func (a arrayInt32) Marshal(wr *buffer.Buffer) error { var ( typeSize = 1 TypeCode = TypeCodeSmallint ) for _, n := range a { if n > math.MaxInt8 { typeSize = 4 TypeCode = TypeCodeInt break } } writeArrayHeader(wr, len(a), typeSize, TypeCode) if TypeCode == TypeCodeInt { for _, element := range a { wr.AppendUint32(uint32(element)) } } else { for _, element := range a { wr.AppendByte(byte(element)) } } return nil } func (a *arrayInt32) Unmarshal(r *buffer.Buffer) error { length, err := readArrayHeader(r) if err != nil { return err } aa := (*a)[:0] type_, err := readType(r) if err != nil { return err } switch type_ { case TypeCodeSmallint: buf, ok := r.Next(length) if !ok { return errors.New("invalid length") } if int64(cap(aa)) < length { aa = make([]int32, length) } else { aa = aa[:length] } for i, n := range buf { aa[i] = int32(int8(n)) } case TypeCodeInt: const typeSize = 4 buf, ok := r.Next(length * typeSize) if !ok { return fmt.Errorf("invalid length %d", length) } if int64(cap(aa)) < length { aa = make([]int32, length) } else { aa = aa[:length] } var bufIdx int for i := range aa { aa[i] = int32(binary.BigEndian.Uint32(buf[bufIdx:])) bufIdx += 4 } default: return fmt.Errorf("invalid type for []int32 %02x", type_) } *a = aa return nil } type arrayUint64 []uint64 func (a arrayUint64) Marshal(wr *buffer.Buffer) error { var ( typeSize = 1 TypeCode = TypeCodeSmallUlong ) for _, n := range a { if n > math.MaxUint8 { typeSize = 8 TypeCode = TypeCodeUlong break } } writeArrayHeader(wr, len(a), typeSize, TypeCode) if TypeCode == TypeCodeUlong { for _, element := range a { wr.AppendUint64(element) } } else { for _, element := range a { wr.AppendByte(byte(element)) } } return nil } func (a *arrayUint64) Unmarshal(r *buffer.Buffer) error { length, err := readArrayHeader(r) if err != nil { return err } aa := (*a)[:0] type_, err := readType(r) if err != nil { return err } switch type_ { case TypeCodeUlong0: if int64(cap(aa)) < length { aa = make([]uint64, length) } else { aa = aa[:length] for i := range aa { aa[i] = 0 } } case TypeCodeSmallUlong: buf, ok := r.Next(length) if !ok { return errors.New("invalid length") } if int64(cap(aa)) < length { aa = make([]uint64, length) } else { aa = aa[:length] } for i, n := range buf { aa[i] = uint64(n) } case TypeCodeUlong: const typeSize = 8 buf, ok := r.Next(length * typeSize) if !ok { return errors.New("invalid length") } if int64(cap(aa)) < length { aa = make([]uint64, length) } else { aa = aa[:length] } var bufIdx int for i := range aa { aa[i] = binary.BigEndian.Uint64(buf[bufIdx : bufIdx+8]) bufIdx += 8 } default: return fmt.Errorf("invalid type for []uint64 %02x", type_) } *a = aa return nil } type arrayInt64 []int64 func (a arrayInt64) Marshal(wr *buffer.Buffer) error { var ( typeSize = 1 TypeCode = TypeCodeSmalllong ) for _, n := range a { if n > math.MaxInt8 { typeSize = 8 TypeCode = TypeCodeLong break } } writeArrayHeader(wr, len(a), typeSize, TypeCode) if TypeCode == TypeCodeLong { for _, element := range a { wr.AppendUint64(uint64(element)) } } else { for _, element := range a { wr.AppendByte(byte(element)) } } return nil } func (a *arrayInt64) Unmarshal(r *buffer.Buffer) error { length, err := readArrayHeader(r) if err != nil { return err } aa := (*a)[:0] type_, err := readType(r) if err != nil { return err } switch type_ { case TypeCodeSmalllong: buf, ok := r.Next(length) if !ok { return errors.New("invalid length") } if int64(cap(aa)) < length { aa = make([]int64, length) } else { aa = aa[:length] } for i, n := range buf { aa[i] = int64(int8(n)) } case TypeCodeLong: const typeSize = 8 buf, ok := r.Next(length * typeSize) if !ok { return errors.New("invalid length") } if int64(cap(aa)) < length { aa = make([]int64, length) } else { aa = aa[:length] } var bufIdx int for i := range aa { aa[i] = int64(binary.BigEndian.Uint64(buf[bufIdx:])) bufIdx += 8 } default: return fmt.Errorf("invalid type for []uint64 %02x", type_) } *a = aa return nil } type arrayFloat []float32 func (a arrayFloat) Marshal(wr *buffer.Buffer) error { const typeSize = 4 writeArrayHeader(wr, len(a), typeSize, TypeCodeFloat) for _, element := range a { wr.AppendUint32(math.Float32bits(element)) } return nil } func (a *arrayFloat) Unmarshal(r *buffer.Buffer) error { length, err := readArrayHeader(r) if err != nil { return err } type_, err := readType(r) if err != nil { return err } if type_ != TypeCodeFloat { return fmt.Errorf("invalid type for []float32 %02x", type_) } const typeSize = 4 buf, ok := r.Next(length * typeSize) if !ok { return fmt.Errorf("invalid length %d", length) } aa := (*a)[:0] if int64(cap(aa)) < length { aa = make([]float32, length) } else { aa = aa[:length] } var bufIdx int for i := range aa { bits := binary.BigEndian.Uint32(buf[bufIdx:]) aa[i] = math.Float32frombits(bits) bufIdx += typeSize } *a = aa return nil } type arrayDouble []float64 func (a arrayDouble) Marshal(wr *buffer.Buffer) error { const typeSize = 8 writeArrayHeader(wr, len(a), typeSize, TypeCodeDouble) for _, element := range a { wr.AppendUint64(math.Float64bits(element)) } return nil } func (a *arrayDouble) Unmarshal(r *buffer.Buffer) error { length, err := readArrayHeader(r) if err != nil { return err } type_, err := readType(r) if err != nil { return err } if type_ != TypeCodeDouble { return fmt.Errorf("invalid type for []float64 %02x", type_) } const typeSize = 8 buf, ok := r.Next(length * typeSize) if !ok { return fmt.Errorf("invalid length %d", length) } aa := (*a)[:0] if int64(cap(aa)) < length { aa = make([]float64, length) } else { aa = aa[:length] } var bufIdx int for i := range aa { bits := binary.BigEndian.Uint64(buf[bufIdx:]) aa[i] = math.Float64frombits(bits) bufIdx += typeSize } *a = aa return nil } type arrayBool []bool func (a arrayBool) Marshal(wr *buffer.Buffer) error { const typeSize = 1 writeArrayHeader(wr, len(a), typeSize, TypeCodeBool) for _, element := range a { value := byte(0) if element { value = 1 } wr.AppendByte(value) } return nil } func (a *arrayBool) Unmarshal(r *buffer.Buffer) error { length, err := readArrayHeader(r) if err != nil { return err } aa := (*a)[:0] if int64(cap(aa)) < length { aa = make([]bool, length) } else { aa = aa[:length] } type_, err := readType(r) if err != nil { return err } switch type_ { case TypeCodeBool: buf, ok := r.Next(length) if !ok { return errors.New("invalid length") } for i, value := range buf { if value == 0 { aa[i] = false } else { aa[i] = true } } case TypeCodeBoolTrue: for i := range aa { aa[i] = true } case TypeCodeBoolFalse: for i := range aa { aa[i] = false } default: return fmt.Errorf("invalid type for []bool %02x", type_) } *a = aa return nil } type arrayString []string func (a arrayString) Marshal(wr *buffer.Buffer) error { var ( elementType = TypeCodeStr8 elementsSizeTotal int ) for _, element := range a { if !utf8.ValidString(element) { return errors.New("not a valid UTF-8 string") } elementsSizeTotal += len(element) if len(element) > math.MaxUint8 { elementType = TypeCodeStr32 } } writeVariableArrayHeader(wr, len(a), elementsSizeTotal, elementType) if elementType == TypeCodeStr32 { for _, element := range a { wr.AppendUint32(uint32(len(element))) wr.AppendString(element) } } else { for _, element := range a { wr.AppendByte(byte(len(element))) wr.AppendString(element) } } return nil } func (a *arrayString) Unmarshal(r *buffer.Buffer) error { length, err := readArrayHeader(r) if err != nil { return err } const typeSize = 2 // assume all strings are at least 2 bytes if length*typeSize > int64(r.Len()) { return fmt.Errorf("invalid length %d", length) } aa := (*a)[:0] if int64(cap(aa)) < length { aa = make([]string, length) } else { aa = aa[:length] } type_, err := readType(r) if err != nil { return err } switch type_ { case TypeCodeStr8: for i := range aa { size, err := r.ReadByte() if err != nil { return err } buf, ok := r.Next(int64(size)) if !ok { return errors.New("invalid length") } aa[i] = string(buf) } case TypeCodeStr32: for i := range aa { buf, ok := r.Next(4) if !ok { return errors.New("invalid length") } size := int64(binary.BigEndian.Uint32(buf)) buf, ok = r.Next(size) if !ok { return errors.New("invalid length") } aa[i] = string(buf) } default: return fmt.Errorf("invalid type for []string %02x", type_) } *a = aa return nil } type arraySymbol []Symbol func (a arraySymbol) Marshal(wr *buffer.Buffer) error { var ( elementType = TypeCodeSym8 elementsSizeTotal int ) for _, element := range a { elementsSizeTotal += len(element) if len(element) > math.MaxUint8 { elementType = TypeCodeSym32 } } writeVariableArrayHeader(wr, len(a), elementsSizeTotal, elementType) if elementType == TypeCodeSym32 { for _, element := range a { wr.AppendUint32(uint32(len(element))) wr.AppendString(string(element)) } } else { for _, element := range a { wr.AppendByte(byte(len(element))) wr.AppendString(string(element)) } } return nil } func (a *arraySymbol) Unmarshal(r *buffer.Buffer) error { length, err := readArrayHeader(r) if err != nil { return err } const typeSize = 2 // assume all symbols are at least 2 bytes if length*typeSize > int64(r.Len()) { return fmt.Errorf("invalid length %d", length) } aa := (*a)[:0] if int64(cap(aa)) < length { aa = make([]Symbol, length) } else { aa = aa[:length] } type_, err := readType(r) if err != nil { return err } switch type_ { case TypeCodeSym8: for i := range aa { size, err := r.ReadByte() if err != nil { return err } buf, ok := r.Next(int64(size)) if !ok { return errors.New("invalid length") } aa[i] = Symbol(buf) } case TypeCodeSym32: for i := range aa { buf, ok := r.Next(4) if !ok { return errors.New("invalid length") } size := int64(binary.BigEndian.Uint32(buf)) buf, ok = r.Next(size) if !ok { return errors.New("invalid length") } aa[i] = Symbol(buf) } default: return fmt.Errorf("invalid type for []Symbol %02x", type_) } *a = aa return nil } type arrayBinary [][]byte func (a arrayBinary) Marshal(wr *buffer.Buffer) error { var ( elementType = TypeCodeVbin8 elementsSizeTotal int ) for _, element := range a { elementsSizeTotal += len(element) if len(element) > math.MaxUint8 { elementType = TypeCodeVbin32 } } writeVariableArrayHeader(wr, len(a), elementsSizeTotal, elementType) if elementType == TypeCodeVbin32 { for _, element := range a { wr.AppendUint32(uint32(len(element))) wr.Append(element) } } else { for _, element := range a { wr.AppendByte(byte(len(element))) wr.Append(element) } } return nil } func (a *arrayBinary) Unmarshal(r *buffer.Buffer) error { length, err := readArrayHeader(r) if err != nil { return err } const typeSize = 2 // assume all binary is at least 2 bytes if length*typeSize > int64(r.Len()) { return fmt.Errorf("invalid length %d", length) } aa := (*a)[:0] if int64(cap(aa)) < length { aa = make([][]byte, length) } else { aa = aa[:length] } type_, err := readType(r) if err != nil { return err } switch type_ { case TypeCodeVbin8: for i := range aa { size, err := r.ReadByte() if err != nil { return err } buf, ok := r.Next(int64(size)) if !ok { return fmt.Errorf("invalid length %d", length) } aa[i] = append([]byte(nil), buf...) } case TypeCodeVbin32: for i := range aa { buf, ok := r.Next(4) if !ok { return errors.New("invalid length") } size := binary.BigEndian.Uint32(buf) buf, ok = r.Next(int64(size)) if !ok { return errors.New("invalid length") } aa[i] = append([]byte(nil), buf...) } default: return fmt.Errorf("invalid type for [][]byte %02x", type_) } *a = aa return nil } type arrayTimestamp []time.Time func (a arrayTimestamp) Marshal(wr *buffer.Buffer) error { const typeSize = 8 writeArrayHeader(wr, len(a), typeSize, TypeCodeTimestamp) for _, element := range a { ms := element.UnixNano() / int64(time.Millisecond) wr.AppendUint64(uint64(ms)) } return nil } func (a *arrayTimestamp) Unmarshal(r *buffer.Buffer) error { length, err := readArrayHeader(r) if err != nil { return err } type_, err := readType(r) if err != nil { return err } if type_ != TypeCodeTimestamp { return fmt.Errorf("invalid type for []time.Time %02x", type_) } const typeSize = 8 buf, ok := r.Next(length * typeSize) if !ok { return fmt.Errorf("invalid length %d", length) } aa := (*a)[:0] if int64(cap(aa)) < length { aa = make([]time.Time, length) } else { aa = aa[:length] } var bufIdx int for i := range aa { ms := int64(binary.BigEndian.Uint64(buf[bufIdx:])) bufIdx += typeSize aa[i] = time.Unix(ms/1000, (ms%1000)*1000000).UTC() } *a = aa return nil } type arrayUUID []UUID func (a arrayUUID) Marshal(wr *buffer.Buffer) error { const typeSize = 16 writeArrayHeader(wr, len(a), typeSize, TypeCodeUUID) for _, element := range a { wr.Append(element[:]) } return nil } func (a *arrayUUID) Unmarshal(r *buffer.Buffer) error { length, err := readArrayHeader(r) if err != nil { return err } type_, err := readType(r) if err != nil { return err } if type_ != TypeCodeUUID { return fmt.Errorf("invalid type for []UUID %#02x", type_) } const typeSize = 16 buf, ok := r.Next(length * typeSize) if !ok { return fmt.Errorf("invalid length %d", length) } aa := (*a)[:0] if int64(cap(aa)) < length { aa = make([]UUID, length) } else { aa = aa[:length] } var bufIdx int for i := range aa { copy(aa[i][:], buf[bufIdx:bufIdx+16]) bufIdx += 16 } *a = aa return nil } // LIST type list []any func (l list) Marshal(wr *buffer.Buffer) error { length := len(l) // type if length == 0 { wr.AppendByte(byte(TypeCodeList0)) return nil } wr.AppendByte(byte(TypeCodeList32)) // size sizeIdx := wr.Len() wr.Append([]byte{0, 0, 0, 0}) // length wr.AppendUint32(uint32(length)) for _, element := range l { err := Marshal(wr, element) if err != nil { return err } } // overwrite size binary.BigEndian.PutUint32(wr.Bytes()[sizeIdx:], uint32(wr.Len()-(sizeIdx+4))) return nil } func (l *list) Unmarshal(r *buffer.Buffer) error { length, err := readListHeader(r) if err != nil { return err } // assume that all types are at least 1 byte if length > int64(r.Len()) { return fmt.Errorf("invalid length %d", length) } ll := *l if int64(cap(ll)) < length { ll = make([]any, length) } else { ll = ll[:length] } for i := range ll { ll[i], err = ReadAny(r) if err != nil { return err } } *l = ll return nil } // multiSymbol can decode a single symbol or an array. type MultiSymbol []Symbol func (ms MultiSymbol) Marshal(wr *buffer.Buffer) error { return Marshal(wr, []Symbol(ms)) } func (ms *MultiSymbol) Unmarshal(r *buffer.Buffer) error { type_, err := peekType(r) if err != nil { return err } if type_ == TypeCodeSym8 || type_ == TypeCodeSym32 { s, err := ReadString(r) if err != nil { return err } *ms = []Symbol{Symbol(s)} return nil } return Unmarshal(r, (*[]Symbol)(ms)) } golang-github-azure-go-amqp-1.0.2/internal/encoding/types_test.go000066400000000000000000000035661454613650200251000ustar00rootroot00000000000000package encoding import ( "math" "testing" "github.com/Azure/go-amqp/internal/buffer" "github.com/stretchr/testify/require" ) const amqpArrayHeaderLength = 4 func TestMarshalArrayInt64AsLongArray(t *testing.T) { // 244 is larger than a int8 can contain. When it marshals it // it'll have to use the typeCodeLong (8 bytes, signed) vs the // typeCodeSmalllong (1 byte, signed). ai := arrayInt64([]int64{math.MaxInt8 + 1}) buff := &buffer.Buffer{} require.NoError(t, ai.Marshal(buff)) require.EqualValues(t, amqpArrayHeaderLength+8, buff.Len(), "Expected an AMQP header (4 bytes) + 8 bytes for a long") unmarshalled := arrayInt64{} require.NoError(t, unmarshalled.Unmarshal(buff)) require.EqualValues(t, arrayInt64([]int64{math.MaxInt8 + 1}), unmarshalled) } func TestMarshalArrayInt64AsSmallLongArray(t *testing.T) { // If the values are small enough for a typeCodeSmalllong (1 byte, signed) // we can save some space. ai := arrayInt64([]int64{math.MaxInt8, math.MinInt8}) buff := &buffer.Buffer{} require.NoError(t, ai.Marshal(buff)) require.EqualValues(t, amqpArrayHeaderLength+1+1, buff.Len(), "Expected an AMQP header (4 bytes) + 1 byte apiece for the two values") unmarshalled := arrayInt64{} require.NoError(t, unmarshalled.Unmarshal(buff)) require.EqualValues(t, arrayInt64([]int64{math.MaxInt8, math.MinInt8}), unmarshalled) } func TestDecodeSmallInts(t *testing.T) { t.Run("smallong", func(t *testing.T) { buff := &buffer.Buffer{} v := int8(-1) buff.AppendByte(byte(TypeCodeSmalllong)) buff.AppendByte(byte(v)) val, err := readLong(buff) require.NoError(t, err) require.Equal(t, int64(-1), val) }) t.Run("smallint", func(t *testing.T) { buff := &buffer.Buffer{} v := int8(-1) buff.AppendByte(byte(TypeCodeSmallint)) buff.AppendByte(byte(v)) val, err := readInt32(buff) require.NoError(t, err) require.Equal(t, int32(-1), val) }) } golang-github-azure-go-amqp-1.0.2/internal/fake/000077500000000000000000000000001454613650200214545ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/fake/net_conn.go000066400000000000000000000351031454613650200236100ustar00rootroot00000000000000package fake import ( "errors" "math" "net" "time" "github.com/Azure/go-amqp/internal/buffer" "github.com/Azure/go-amqp/internal/encoding" "github.com/Azure/go-amqp/internal/frames" ) // NewNetConn creates a new instance of NetConn. // Responder is invoked by Write when a frame is received. // Return a zero-value Response/nil error to swallow the frame. // Return a non-nil error to simulate a write error. // NOTE: resp is called on a separate goroutine so it MUST NOT access any *testing.T etc func NewNetConn(resp func(remoteChannel uint16, fr frames.FrameBody) (Response, error)) *NetConn { netConn := &NetConn{ ReadErr: make(chan error), WriteErr: make(chan error, 1), resp: resp, // during shutdown, connReader can close before connWriter as they both // both return on c.Done being closed, so there is some non-determinism // here. this means that sometimes writes can still happen but there's // no reader to consume them. we used a buffered channel to prevent these // writes from blocking shutdown. the size was arbitrarily picked. readData: make(chan []byte, 10), // used to serialize writes so the frames are returned in their specified order. // buffering is necessary because write() will sleep when a write delay was // specified and we don't want to stall Write(). the size was arbitrarily picked. writeResp: make(chan Response, 10), close: make(chan struct{}), readDL: newNopTimer(), // default, no deadline } go netConn.write() return netConn } // NetConn is a fake network connection that satisfies the net.Conn interface. type NetConn struct { // OnClose is called from Close() before it returns. // The value returned from OnClose is returned from Close(). OnClose func() error // ReadErr is used to simulate a connReader error. // The error written to this channel is returned // from the call to NetConn.Read. ReadErr chan error // WriteErr is used to simulate a connWriter error. // The error sent here is returned from the call to NetConn.Write. // Has a buffer of one so setting a pending error won't block. WriteErr chan error resp func(uint16, frames.FrameBody) (Response, error) readDL readTimer readData chan []byte writeResp chan Response close chan struct{} closed bool } // SendFrame sends the encoded frame to the client. // Use this to send a frame at an arbitrary time. func (n *NetConn) SendFrame(f []byte) { n.readData <- f } // SendKeepAlive sends a keep-alive frame to the client. func (n *NetConn) SendKeepAlive() { // empty frame n.readData <- []uint8{0, 0, 0, 8, 2, 0, 0, 0} } // SendMultiFrameTransfer splits payload into 32-byte chunks, encodes, and sends to the client. // Payload must be big enough for at least two chunks. func (n *NetConn) SendMultiFrameTransfer(channel uint16, linkHandle, deliveryID uint32, payload []byte, edit func(int, *frames.PerformTransfer)) error { bb, err := encodeMultiFrameTransfer(channel, linkHandle, deliveryID, payload, edit) if err != nil { return err } for _, b := range bb { n.readData <- b } return nil } // Response is the response returned from a responder function. type Response struct { // Payload is the marshalled frame to send to Conn.connReader Payload []byte // WriteDelay is the duration to wait before writing Payload. // Use this to introduce a delay when waiting for a response. WriteDelay time.Duration } // ErrAlreadyClosed is returned by Close() if [NetConn] is already closed. var ErrAlreadyClosed = errors.New("fake already closed") /////////////////////////////////////////////////////// // following methods are for the net.Conn interface /////////////////////////////////////////////////////// // NOTE: Read, Write, and Close are all called by separate goroutines! // Read is invoked by conn.connReader to recieve frame data. // It blocks until Write or Close are called, or the read // deadline expires which will return an error. func (n *NetConn) Read(b []byte) (int, error) { select { case <-n.close: return 0, net.ErrClosed default: // not closed yet } select { case <-n.close: return 0, net.ErrClosed case <-n.readDL.C(): return 0, errors.New("fake connection read deadline exceeded") case rd := <-n.readData: return copy(b, rd), nil case err := <-n.ReadErr: return 0, err } } // Write is invoked by conn.connWriter when we're being sent frame // data. Every call to Write will invoke the responder callback that // must reply with one of three possibilities. // 1. an encoded frame and nil error // 2. a non-nil error to similate a write failure // 3. a nil slice and nil error indicating the frame should be ignored func (n *NetConn) Write(b []byte) (int, error) { select { case <-n.close: return 0, net.ErrClosed default: // not closed yet } select { case err := <-n.WriteErr: return 0, err default: // no fake write error } remoteChannel, frame, err := decodeFrame(b) if err != nil { return 0, err } resp, err := n.resp(remoteChannel, frame) if err != nil { return 0, err } if resp.Payload != nil { select { case n.writeResp <- resp: // resp was sent to write() default: // this means we incorrectly sized writeResp. // we do this to ensure that we never stall // waiting to write to writeResp. panic("writeResp full") } } return len(b), nil } func (n *NetConn) write() { for { select { case <-n.close: return case resp := <-n.writeResp: // any write delay MUST happen outside of NetConn.Write // else all we do is stall Conn.connWriter() which doesn't // actually simulate a delayed response to a frame. time.Sleep(resp.WriteDelay) n.readData <- resp.Payload } } } // Close is called by conn.close. func (n *NetConn) Close() error { if n.closed { return ErrAlreadyClosed } n.closed = true close(n.close) if n.OnClose != nil { return n.OnClose() } return nil } func (n *NetConn) LocalAddr() net.Addr { return &net.IPAddr{ IP: net.IPv4(127, 0, 0, 2), } } func (n *NetConn) RemoteAddr() net.Addr { return &net.IPAddr{ IP: net.IPv4(127, 0, 0, 2), } } func (n *NetConn) SetDeadline(t time.Time) error { return errors.New("not used") } func (n *NetConn) SetReadDeadline(t time.Time) error { // called by conn.connReader before calling Read // stop the last timer if available if n.readDL != nil && !n.readDL.Stop() { <-n.readDL.C() } n.readDL = timer{t: time.NewTimer(time.Until(t))} return nil } func (n *NetConn) SetWriteDeadline(t time.Time) error { // called by conn.connWriter before calling Write return nil } /////////////////////////////////////////////////////// /////////////////////////////////////////////////////// // ProtoID indicates the type of protocol (copied from conn.go) type ProtoID uint8 const ( ProtoAMQP ProtoID = 0x0 ProtoTLS ProtoID = 0x2 ProtoSASL ProtoID = 0x3 ) // ProtoHeader adds the initial handshake frame to the list of responses. // This frame, and PerformOpen, are needed when calling amqp.New() to create a client. func ProtoHeader(id ProtoID) ([]byte, error) { return []byte{'A', 'M', 'Q', 'P', byte(id), 1, 0, 0}, nil } // PerformOpen appends a PerformOpen frame with the specified container ID. // This frame, and ProtoHeader, are needed when calling amqp.New() to create a client. func PerformOpen(containerID string) ([]byte, error) { // send the default values for max channels and frame size return EncodeFrame(frames.TypeAMQP, 0, &frames.PerformOpen{ ChannelMax: 65535, ContainerID: containerID, IdleTimeout: time.Minute, MaxFrameSize: 4294967295, }) } // PerformBegin appends a PerformBegin frame with the specified remote channel ID. // This frame is needed when making a call to Client.NewSession(). func PerformBegin(channel, remoteChannel uint16) ([]byte, error) { return EncodeFrame(frames.TypeAMQP, channel, &frames.PerformBegin{ RemoteChannel: &remoteChannel, NextOutgoingID: 1, IncomingWindow: 5000, OutgoingWindow: 1000, HandleMax: math.MaxInt16, }) } // SenderAttach encodes a PerformAttach frame with the specified values. // This frame is needed when making a call to Session.NewSender(). func SenderAttach(channel uint16, linkName string, linkHandle uint32, mode encoding.SenderSettleMode) ([]byte, error) { return EncodeFrame(frames.TypeAMQP, channel, &frames.PerformAttach{ Name: linkName, Handle: linkHandle, Role: encoding.RoleReceiver, Target: &frames.Target{ Address: "test", Durable: encoding.DurabilityNone, ExpiryPolicy: encoding.ExpirySessionEnd, }, SenderSettleMode: &mode, MaxMessageSize: math.MaxUint32, }) } // ReceiverAttach appends a PerformAttach frame with the specified values. // This frame is needed when making a call to Session.NewReceiver(). func ReceiverAttach(channel uint16, linkName string, linkHandle uint32, mode encoding.ReceiverSettleMode, filter encoding.Filter) ([]byte, error) { return EncodeFrame(frames.TypeAMQP, channel, &frames.PerformAttach{ Name: linkName, Handle: linkHandle, Role: encoding.RoleSender, Source: &frames.Source{ Address: "test", Durable: encoding.DurabilityNone, ExpiryPolicy: encoding.ExpirySessionEnd, Filter: filter, }, ReceiverSettleMode: &mode, MaxMessageSize: math.MaxUint32, }) } // PerformTransfer appends a PerformTransfer frame with the specified values. // The linkHandle MUST match the linkHandle value specified in ReceiverAttach. func PerformTransfer(channel uint16, linkHandle, deliveryID uint32, payload []byte) ([]byte, error) { format := uint32(0) payloadBuf := &buffer.Buffer{} encoding.WriteDescriptor(payloadBuf, encoding.TypeCodeApplicationData) err := encoding.WriteBinary(payloadBuf, payload) if err != nil { return nil, err } return EncodeFrame(frames.TypeAMQP, channel, &frames.PerformTransfer{ Handle: linkHandle, DeliveryID: &deliveryID, DeliveryTag: []byte("tag"), MessageFormat: &format, Payload: payloadBuf.Detach(), }) } // PerformDisposition appends a PerformDisposition frame with the specified values. // The firstID MUST match the deliveryID value specified in PerformTransfer. func PerformDisposition(role encoding.Role, channel uint16, firstID uint32, lastID *uint32, state encoding.DeliveryState) ([]byte, error) { return EncodeFrame(frames.TypeAMQP, channel, &frames.PerformDisposition{ Role: role, First: firstID, Last: lastID, Settled: true, State: state, }) } // PerformDetach encodes a PerformDetach frame with an optional error. func PerformDetach(channel uint16, linkHandle uint32, e *encoding.Error) ([]byte, error) { return EncodeFrame(frames.TypeAMQP, channel, &frames.PerformDetach{Handle: linkHandle, Closed: true, Error: e}) } // PerformEnd encodes a PerformEnd frame with an optional error. func PerformEnd(channel uint16, e *encoding.Error) ([]byte, error) { return EncodeFrame(frames.TypeAMQP, channel, &frames.PerformEnd{Error: e}) } // PerformClose encodes a PerformClose frame with an optional error. func PerformClose(e *encoding.Error) ([]byte, error) { return EncodeFrame(frames.TypeAMQP, 0, &frames.PerformClose{Error: e}) } // AMQPProto is the frame type passed to FrameCallback() for the initial protocal handshake. type AMQPProto struct { frames.FrameBody } // KeepAlive is the frame type passed to FrameCallback() for keep-alive frames. type KeepAlive struct { frames.FrameBody } type frameHeader frames.Header func (f frameHeader) Marshal(wr *buffer.Buffer) error { wr.AppendUint32(f.Size) wr.AppendByte(f.DataOffset) wr.AppendByte(byte(f.FrameType)) wr.AppendUint16(f.Channel) return nil } // EncodeFrame encodes the specified frame to be sent over the wire. func EncodeFrame(t frames.Type, channel uint16, f frames.FrameBody) ([]byte, error) { bodyBuf := buffer.New([]byte{}) if err := encoding.Marshal(bodyBuf, f); err != nil { return nil, err } // create the frame header, needs size of the body plus itself header := frameHeader{ Size: uint32(bodyBuf.Len()) + 8, DataOffset: 2, FrameType: uint8(t), Channel: channel, } headerBuf := buffer.New([]byte{}) if err := encoding.Marshal(headerBuf, header); err != nil { return nil, err } // concatenate header + body raw := headerBuf.Detach() raw = append(raw, bodyBuf.Detach()...) return raw, nil } func decodeFrame(b []byte) (uint16, frames.FrameBody, error) { if len(b) > 3 && b[0] == 'A' && b[1] == 'M' && b[2] == 'Q' && b[3] == 'P' { return 0, &AMQPProto{}, nil } buf := buffer.New(b) header, err := frames.ParseHeader(buf) if err != nil { return 0, nil, err } bodySize := int64(header.Size - frames.HeaderSize) if bodySize == 0 { // keep alive frame return 0, &KeepAlive{}, nil } // parse the frame b, ok := buf.Next(bodySize) if !ok { return 0, nil, err } fr, err := frames.ParseBody(buffer.New(b)) if err != nil { return 0, nil, err } return header.Channel, fr, nil } func encodeMultiFrameTransfer(channel uint16, linkHandle, deliveryID uint32, payload []byte, edit func(int, *frames.PerformTransfer)) ([][]byte, error) { frameData := [][]byte{} format := uint32(0) payloadBuf := &buffer.Buffer{} // determine the number of frames to create chunks := len(payload) / 32 if r := len(payload) % 32; r > 0 { chunks++ } if chunks < 2 { return nil, errors.New("payload is too small for multi-frame transfer") } more := true for chunk := 0; chunk < chunks; chunk++ { encoding.WriteDescriptor(payloadBuf, encoding.TypeCodeApplicationData) var err error if chunk+1 < chunks { err = encoding.WriteBinary(payloadBuf, payload[chunk*32:chunk*32+32]) } else { // final frame err = encoding.WriteBinary(payloadBuf, payload[chunk*32:]) more = false } if err != nil { return nil, err } var fr *frames.PerformTransfer if chunk == 0 { // first frame requires extra data fr = &frames.PerformTransfer{ Handle: linkHandle, DeliveryID: &deliveryID, DeliveryTag: []byte("tag"), MessageFormat: &format, More: true, Payload: payloadBuf.Detach(), } } else { fr = &frames.PerformTransfer{ Handle: linkHandle, More: more, Payload: payloadBuf.Detach(), } } if edit != nil { edit(chunk, fr) } b, err := EncodeFrame(frames.TypeAMQP, channel, fr) if err != nil { return nil, err } frameData = append(frameData, b) } return frameData, nil } type readTimer interface { C() <-chan time.Time Stop() bool } func newNopTimer() nopTimer { return nopTimer{t: make(chan time.Time)} } type nopTimer struct { t chan time.Time } func (n nopTimer) C() <-chan time.Time { return n.t } func (n nopTimer) Stop() bool { close(n.t) return true } type timer struct { t *time.Timer } func (t timer) C() <-chan time.Time { return t.t.C } func (t timer) Stop() bool { return t.t.Stop() } golang-github-azure-go-amqp-1.0.2/internal/frames/000077500000000000000000000000001454613650200220235ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/frames/frames.go000066400000000000000000001665311454613650200236430ustar00rootroot00000000000000package frames import ( "errors" "fmt" "strconv" "time" "github.com/Azure/go-amqp/internal/buffer" "github.com/Azure/go-amqp/internal/encoding" ) // Type contains the values for a frame's type. type Type uint8 const ( TypeAMQP Type = 0x0 TypeSASL Type = 0x1 ) // String implements the fmt.Stringer interface for type Type. func (t Type) String() string { if t == 0 { return "AMQP" } return "SASL" } /* */ type Source struct { // the address of the source // // The address of the source MUST NOT be set when sent on a attach frame sent by // the receiving link endpoint where the dynamic flag is set to true (that is where // the receiver is requesting the sender to create an addressable node). // // The address of the source MUST be set when sent on a attach frame sent by the // sending link endpoint where the dynamic flag is set to true (that is where the // sender has created an addressable node at the request of the receiver and is now // communicating the address of that created node). The generated name of the address // SHOULD include the link name and the container-id of the remote container to allow // for ease of identification. Address string // indicates the durability of the terminus // // Indicates what state of the terminus will be retained durably: the state of durable // messages, only existence and configuration of the terminus, or no state at all. // // 0: none // 1: configuration // 2: unsettled-state Durable encoding.Durability // the expiry policy of the source // // link-detach: The expiry timer starts when terminus is detached. // session-end: The expiry timer starts when the most recently associated session is // ended. // connection-close: The expiry timer starts when most recently associated connection // is closed. // never: The terminus never expires. ExpiryPolicy encoding.ExpiryPolicy // duration that an expiring source will be retained // // The source starts expiring as indicated by the expiry-policy. Timeout uint32 // seconds // request dynamic creation of a remote node // // When set to true by the receiving link endpoint, this field constitutes a request // for the sending peer to dynamically create a node at the source. In this case the // address field MUST NOT be set. // // When set to true by the sending link endpoint this field indicates creation of a // dynamically created node. In this case the address field will contain the address // of the created node. The generated address SHOULD include the link name and other // available information on the initiator of the request (such as the remote // container-id) in some recognizable form for ease of traceability. Dynamic bool // properties of the dynamically created node // // If the dynamic field is not set to true this field MUST be left unset. // // When set by the receiving link endpoint, this field contains the desired // properties of the node the receiver wishes to be created. When set by the // sending link endpoint this field contains the actual properties of the // dynamically created node. See subsection 3.5.9 for standard node properties. // http://www.amqp.org/specification/1.0/node-properties // // lifetime-policy: The lifetime of a dynamically generated node. // Definitionally, the lifetime will never be less than the lifetime // of the link which caused its creation, however it is possible to // extend the lifetime of dynamically created node using a lifetime // policy. The value of this entry MUST be of a type which provides // the lifetime-policy archetype. The following standard // lifetime-policies are defined below: delete-on-close, // delete-on-no-links, delete-on-no-messages or // delete-on-no-links-or-messages. // supported-dist-modes: The distribution modes that the node supports. // The value of this entry MUST be one or more symbols which are valid // distribution-modes. That is, the value MUST be of the same type as // would be valid in a field defined with the following attributes: // type="symbol" multiple="true" requires="distribution-mode" DynamicNodeProperties map[encoding.Symbol]any // TODO: implement custom type with validation // the distribution mode of the link // // This field MUST be set by the sending end of the link if the endpoint supports more // than one distribution-mode. This field MAY be set by the receiving end of the link // to indicate a preference when a node supports multiple distribution modes. DistributionMode encoding.Symbol // a set of predicates to filter the messages admitted onto the link // // The receiving endpoint sets its desired filter, the sending endpoint sets the filter // actually in place (including any filters defaulted at the node). The receiving // endpoint MUST check that the filter in place meets its needs and take responsibility // for detaching if it does not. Filter encoding.Filter // default outcome for unsettled transfers // // Indicates the outcome to be used for transfers that have not reached a terminal // state at the receiver when the transfer is settled, including when the source // is destroyed. The value MUST be a valid outcome (e.g., released or rejected). DefaultOutcome any // descriptors for the outcomes that can be chosen on this link // // The values in this field are the symbolic descriptors of the outcomes that can // be chosen on this link. This field MAY be empty, indicating that the default-outcome // will be assumed for all message transfers (if the default-outcome is not set, and no // outcomes are provided, then the accepted outcome MUST be supported by the source). // // When present, the values MUST be a symbolic descriptor of a valid outcome, // e.g., "amqp:accepted:list". Outcomes encoding.MultiSymbol // the extension capabilities the sender supports/desires // // http://www.amqp.org/specification/1.0/source-capabilities Capabilities encoding.MultiSymbol } func (s *Source) Marshal(wr *buffer.Buffer) error { return encoding.MarshalComposite(wr, encoding.TypeCodeSource, []encoding.MarshalField{ {Value: &s.Address, Omit: s.Address == ""}, {Value: &s.Durable, Omit: s.Durable == encoding.DurabilityNone}, {Value: &s.ExpiryPolicy, Omit: s.ExpiryPolicy == "" || s.ExpiryPolicy == encoding.ExpirySessionEnd}, {Value: &s.Timeout, Omit: s.Timeout == 0}, {Value: &s.Dynamic, Omit: !s.Dynamic}, {Value: s.DynamicNodeProperties, Omit: len(s.DynamicNodeProperties) == 0}, {Value: &s.DistributionMode, Omit: s.DistributionMode == ""}, {Value: s.Filter, Omit: len(s.Filter) == 0}, {Value: &s.DefaultOutcome, Omit: s.DefaultOutcome == nil}, {Value: &s.Outcomes, Omit: len(s.Outcomes) == 0}, {Value: &s.Capabilities, Omit: len(s.Capabilities) == 0}, }) } func (s *Source) Unmarshal(r *buffer.Buffer) error { return encoding.UnmarshalComposite(r, encoding.TypeCodeSource, []encoding.UnmarshalField{ {Field: &s.Address}, {Field: &s.Durable}, {Field: &s.ExpiryPolicy, HandleNull: func() error { s.ExpiryPolicy = encoding.ExpirySessionEnd; return nil }}, {Field: &s.Timeout}, {Field: &s.Dynamic}, {Field: &s.DynamicNodeProperties}, {Field: &s.DistributionMode}, {Field: &s.Filter}, {Field: &s.DefaultOutcome}, {Field: &s.Outcomes}, {Field: &s.Capabilities}, }...) } func (s Source) String() string { return fmt.Sprintf("source{Address: %s, Durable: %d, ExpiryPolicy: %s, Timeout: %d, "+ "Dynamic: %t, DynamicNodeProperties: %v, DistributionMode: %s, Filter: %v, DefaultOutcome: %v "+ "Outcomes: %v, Capabilities: %v}", s.Address, s.Durable, s.ExpiryPolicy, s.Timeout, s.Dynamic, s.DynamicNodeProperties, s.DistributionMode, s.Filter, s.DefaultOutcome, s.Outcomes, s.Capabilities, ) } /* */ type Target struct { // the address of the target // // The address of the target MUST NOT be set when sent on a attach frame sent by // the sending link endpoint where the dynamic flag is set to true (that is where // the sender is requesting the receiver to create an addressable node). // // The address of the source MUST be set when sent on a attach frame sent by the // receiving link endpoint where the dynamic flag is set to true (that is where // the receiver has created an addressable node at the request of the sender and // is now communicating the address of that created node). The generated name of // the address SHOULD include the link name and the container-id of the remote // container to allow for ease of identification. Address string // indicates the durability of the terminus // // Indicates what state of the terminus will be retained durably: the state of durable // messages, only existence and configuration of the terminus, or no state at all. // // 0: none // 1: configuration // 2: unsettled-state Durable encoding.Durability // the expiry policy of the target // // link-detach: The expiry timer starts when terminus is detached. // session-end: The expiry timer starts when the most recently associated session is // ended. // connection-close: The expiry timer starts when most recently associated connection // is closed. // never: The terminus never expires. ExpiryPolicy encoding.ExpiryPolicy // duration that an expiring target will be retained // // The target starts expiring as indicated by the expiry-policy. Timeout uint32 // seconds // request dynamic creation of a remote node // // When set to true by the sending link endpoint, this field constitutes a request // for the receiving peer to dynamically create a node at the target. In this case // the address field MUST NOT be set. // // When set to true by the receiving link endpoint this field indicates creation of // a dynamically created node. In this case the address field will contain the // address of the created node. The generated address SHOULD include the link name // and other available information on the initiator of the request (such as the // remote container-id) in some recognizable form for ease of traceability. Dynamic bool // properties of the dynamically created node // // If the dynamic field is not set to true this field MUST be left unset. // // When set by the sending link endpoint, this field contains the desired // properties of the node the sender wishes to be created. When set by the // receiving link endpoint this field contains the actual properties of the // dynamically created node. See subsection 3.5.9 for standard node properties. // http://www.amqp.org/specification/1.0/node-properties // // lifetime-policy: The lifetime of a dynamically generated node. // Definitionally, the lifetime will never be less than the lifetime // of the link which caused its creation, however it is possible to // extend the lifetime of dynamically created node using a lifetime // policy. The value of this entry MUST be of a type which provides // the lifetime-policy archetype. The following standard // lifetime-policies are defined below: delete-on-close, // delete-on-no-links, delete-on-no-messages or // delete-on-no-links-or-messages. // supported-dist-modes: The distribution modes that the node supports. // The value of this entry MUST be one or more symbols which are valid // distribution-modes. That is, the value MUST be of the same type as // would be valid in a field defined with the following attributes: // type="symbol" multiple="true" requires="distribution-mode" DynamicNodeProperties map[encoding.Symbol]any // TODO: implement custom type with validation // the extension capabilities the sender supports/desires // // http://www.amqp.org/specification/1.0/target-capabilities Capabilities encoding.MultiSymbol } func (t *Target) Marshal(wr *buffer.Buffer) error { return encoding.MarshalComposite(wr, encoding.TypeCodeTarget, []encoding.MarshalField{ {Value: &t.Address, Omit: t.Address == ""}, {Value: &t.Durable, Omit: t.Durable == encoding.DurabilityNone}, {Value: &t.ExpiryPolicy, Omit: t.ExpiryPolicy == "" || t.ExpiryPolicy == encoding.ExpirySessionEnd}, {Value: &t.Timeout, Omit: t.Timeout == 0}, {Value: &t.Dynamic, Omit: !t.Dynamic}, {Value: t.DynamicNodeProperties, Omit: len(t.DynamicNodeProperties) == 0}, {Value: &t.Capabilities, Omit: len(t.Capabilities) == 0}, }) } func (t *Target) Unmarshal(r *buffer.Buffer) error { return encoding.UnmarshalComposite(r, encoding.TypeCodeTarget, []encoding.UnmarshalField{ {Field: &t.Address}, {Field: &t.Durable}, {Field: &t.ExpiryPolicy, HandleNull: func() error { t.ExpiryPolicy = encoding.ExpirySessionEnd; return nil }}, {Field: &t.Timeout}, {Field: &t.Dynamic}, {Field: &t.DynamicNodeProperties}, {Field: &t.Capabilities}, }...) } func (t Target) String() string { return fmt.Sprintf("source{Address: %s, Durable: %d, ExpiryPolicy: %s, Timeout: %d, "+ "Dynamic: %t, DynamicNodeProperties: %v, Capabilities: %v}", t.Address, t.Durable, t.ExpiryPolicy, t.Timeout, t.Dynamic, t.DynamicNodeProperties, t.Capabilities, ) } // frame is the decoded representation of a frame type Frame struct { Type Type // AMQP/SASL Channel uint16 // channel this frame is for Body FrameBody // body of the frame } // String implements the fmt.Stringer interface for type Frame. func (f Frame) String() string { return fmt.Sprintf("Frame{Type: %s, Channel: %d, Body: %s}", f.Type, f.Channel, f.Body) } // frameBody adds some type safety to frame encoding type FrameBody interface { frameBody() } /* */ type PerformOpen struct { ContainerID string // required Hostname string MaxFrameSize uint32 // default: 4294967295 ChannelMax uint16 // default: 65535 IdleTimeout time.Duration // from milliseconds OutgoingLocales encoding.MultiSymbol IncomingLocales encoding.MultiSymbol OfferedCapabilities encoding.MultiSymbol DesiredCapabilities encoding.MultiSymbol Properties map[encoding.Symbol]any } func (o *PerformOpen) frameBody() {} func (o *PerformOpen) Marshal(wr *buffer.Buffer) error { return encoding.MarshalComposite(wr, encoding.TypeCodeOpen, []encoding.MarshalField{ {Value: &o.ContainerID, Omit: false}, {Value: &o.Hostname, Omit: o.Hostname == ""}, {Value: &o.MaxFrameSize, Omit: o.MaxFrameSize == 4294967295}, {Value: &o.ChannelMax, Omit: o.ChannelMax == 65535}, {Value: (*encoding.Milliseconds)(&o.IdleTimeout), Omit: o.IdleTimeout == 0}, {Value: &o.OutgoingLocales, Omit: len(o.OutgoingLocales) == 0}, {Value: &o.IncomingLocales, Omit: len(o.IncomingLocales) == 0}, {Value: &o.OfferedCapabilities, Omit: len(o.OfferedCapabilities) == 0}, {Value: &o.DesiredCapabilities, Omit: len(o.DesiredCapabilities) == 0}, {Value: o.Properties, Omit: len(o.Properties) == 0}, }) } func (o *PerformOpen) Unmarshal(r *buffer.Buffer) error { return encoding.UnmarshalComposite(r, encoding.TypeCodeOpen, []encoding.UnmarshalField{ {Field: &o.ContainerID, HandleNull: func() error { return errors.New("Open.ContainerID is required") }}, {Field: &o.Hostname}, {Field: &o.MaxFrameSize, HandleNull: func() error { o.MaxFrameSize = 4294967295; return nil }}, {Field: &o.ChannelMax, HandleNull: func() error { o.ChannelMax = 65535; return nil }}, {Field: (*encoding.Milliseconds)(&o.IdleTimeout)}, {Field: &o.OutgoingLocales}, {Field: &o.IncomingLocales}, {Field: &o.OfferedCapabilities}, {Field: &o.DesiredCapabilities}, {Field: &o.Properties}, }...) } func (o *PerformOpen) String() string { return fmt.Sprintf("Open{ContainerID : %s, Hostname: %s, MaxFrameSize: %d, "+ "ChannelMax: %d, IdleTimeout: %v, "+ "OutgoingLocales: %v, IncomingLocales: %v, "+ "OfferedCapabilities: %v, DesiredCapabilities: %v, "+ "Properties: %v}", o.ContainerID, o.Hostname, o.MaxFrameSize, o.ChannelMax, o.IdleTimeout, o.OutgoingLocales, o.IncomingLocales, o.OfferedCapabilities, o.DesiredCapabilities, o.Properties, ) } /* */ type PerformBegin struct { // the remote channel for this session // If a session is locally initiated, the remote-channel MUST NOT be set. // When an endpoint responds to a remotely initiated session, the remote-channel // MUST be set to the channel on which the remote session sent the begin. RemoteChannel *uint16 // the transfer-id of the first transfer id the sender will send NextOutgoingID uint32 // required, sequence number http://www.ietf.org/rfc/rfc1982.txt // the initial incoming-window of the sender IncomingWindow uint32 // required // the initial outgoing-window of the sender OutgoingWindow uint32 // required // the maximum handle value that can be used on the session // The handle-max value is the highest handle value that can be // used on the session. A peer MUST NOT attempt to attach a link // using a handle value outside the range that its partner can handle. // A peer that receives a handle outside the supported range MUST // close the connection with the framing-error error-code. HandleMax uint32 // default 4294967295 // the extension capabilities the sender supports // http://www.amqp.org/specification/1.0/session-capabilities OfferedCapabilities encoding.MultiSymbol // the extension capabilities the sender can use if the receiver supports them // The sender MUST NOT attempt to use any capability other than those it // has declared in desired-capabilities field. DesiredCapabilities encoding.MultiSymbol // session properties // http://www.amqp.org/specification/1.0/session-properties Properties map[encoding.Symbol]any } func (b *PerformBegin) frameBody() {} func (b *PerformBegin) String() string { return fmt.Sprintf("Begin{RemoteChannel: %v, NextOutgoingID: %d, IncomingWindow: %d, "+ "OutgoingWindow: %d, HandleMax: %d, OfferedCapabilities: %v, DesiredCapabilities: %v, "+ "Properties: %v}", formatUint16Ptr(b.RemoteChannel), b.NextOutgoingID, b.IncomingWindow, b.OutgoingWindow, b.HandleMax, b.OfferedCapabilities, b.DesiredCapabilities, b.Properties, ) } func formatUint16Ptr(p *uint16) string { if p == nil { return "" } return strconv.FormatUint(uint64(*p), 10) } func (b *PerformBegin) Marshal(wr *buffer.Buffer) error { return encoding.MarshalComposite(wr, encoding.TypeCodeBegin, []encoding.MarshalField{ {Value: b.RemoteChannel, Omit: b.RemoteChannel == nil}, {Value: &b.NextOutgoingID, Omit: false}, {Value: &b.IncomingWindow, Omit: false}, {Value: &b.OutgoingWindow, Omit: false}, {Value: &b.HandleMax, Omit: b.HandleMax == 4294967295}, {Value: &b.OfferedCapabilities, Omit: len(b.OfferedCapabilities) == 0}, {Value: &b.DesiredCapabilities, Omit: len(b.DesiredCapabilities) == 0}, {Value: b.Properties, Omit: b.Properties == nil}, }) } func (b *PerformBegin) Unmarshal(r *buffer.Buffer) error { return encoding.UnmarshalComposite(r, encoding.TypeCodeBegin, []encoding.UnmarshalField{ {Field: &b.RemoteChannel}, {Field: &b.NextOutgoingID, HandleNull: func() error { return errors.New("Begin.NextOutgoingID is required") }}, {Field: &b.IncomingWindow, HandleNull: func() error { return errors.New("Begin.IncomingWindow is required") }}, {Field: &b.OutgoingWindow, HandleNull: func() error { return errors.New("Begin.OutgoingWindow is required") }}, {Field: &b.HandleMax, HandleNull: func() error { b.HandleMax = 4294967295; return nil }}, {Field: &b.OfferedCapabilities}, {Field: &b.DesiredCapabilities}, {Field: &b.Properties}, }...) } /* */ type PerformAttach struct { // the name of the link // // This name uniquely identifies the link from the container of the source // to the container of the target node, e.g., if the container of the source // node is A, and the container of the target node is B, the link MAY be // globally identified by the (ordered) tuple (A,B,). Name string // required // the handle for the link while attached // // The numeric handle assigned by the the peer as a shorthand to refer to the // link in all performatives that reference the link until the it is detached. // // The handle MUST NOT be used for other open links. An attempt to attach using // a handle which is already associated with a link MUST be responded to with // an immediate close carrying a handle-in-use session-error. // // To make it easier to monitor AMQP link attach frames, it is RECOMMENDED that // implementations always assign the lowest available handle to this field. // // The two endpoints MAY potentially use different handles to refer to the same link. // Link handles MAY be reused once a link is closed for both send and receive. Handle uint32 // required // role of the link endpoint // // The role being played by the peer, i.e., whether the peer is the sender or the // receiver of messages on the link. Role encoding.Role // settlement policy for the sender // // The delivery settlement policy for the sender. When set at the receiver this // indicates the desired value for the settlement mode at the sender. When set // at the sender this indicates the actual settlement mode in use. The sender // SHOULD respect the receiver's desired settlement mode if the receiver initiates // the attach exchange and the sender supports the desired mode. // // 0: unsettled - The sender will send all deliveries initially unsettled to the receiver. // 1: settled - The sender will send all deliveries settled to the receiver. // 2: mixed - The sender MAY send a mixture of settled and unsettled deliveries to the receiver. SenderSettleMode *encoding.SenderSettleMode // the settlement policy of the receiver // // The delivery settlement policy for the receiver. When set at the sender this // indicates the desired value for the settlement mode at the receiver. // When set at the receiver this indicates the actual settlement mode in use. // The receiver SHOULD respect the sender's desired settlement mode if the sender // initiates the attach exchange and the receiver supports the desired mode. // // 0: first - The receiver will spontaneously settle all incoming transfers. // 1: second - The receiver will only settle after sending the disposition to // the sender and receiving a disposition indicating settlement of // the delivery from the sender. ReceiverSettleMode *encoding.ReceiverSettleMode // the source for messages // // If no source is specified on an outgoing link, then there is no source currently // attached to the link. A link with no source will never produce outgoing messages. Source *Source // the target for messages // // If no target is specified on an incoming link, then there is no target currently // attached to the link. A link with no target will never permit incoming messages. Target *Target // unsettled delivery state // // This is used to indicate any unsettled delivery states when a suspended link is // resumed. The map is keyed by delivery-tag with values indicating the delivery state. // The local and remote delivery states for a given delivery-tag MUST be compared to // resolve any in-doubt deliveries. If necessary, deliveries MAY be resent, or resumed // based on the outcome of this comparison. See subsection 2.6.13. // // If the local unsettled map is too large to be encoded within a frame of the agreed // maximum frame size then the session MAY be ended with the frame-size-too-small error. // The endpoint SHOULD make use of the ability to send an incomplete unsettled map // (see below) to avoid sending an error. // // The unsettled map MUST NOT contain null valued keys. // // When reattaching (as opposed to resuming), the unsettled map MUST be null. Unsettled encoding.Unsettled // If set to true this field indicates that the unsettled map provided is not complete. // When the map is incomplete the recipient of the map cannot take the absence of a // delivery tag from the map as evidence of settlement. On receipt of an incomplete // unsettled map a sending endpoint MUST NOT send any new deliveries (i.e. deliveries // where resume is not set to true) to its partner (and a receiving endpoint which sent // an incomplete unsettled map MUST detach with an error on receiving a transfer which // does not have the resume flag set to true). // // Note that if this flag is set to true then the endpoints MUST detach and reattach at // least once in order to send new deliveries. This flag can be useful when there are // too many entries in the unsettled map to fit within a single frame. An endpoint can // attach, resume, settle, and detach until enough unsettled state has been cleared for // an attach where this flag is set to false. IncompleteUnsettled bool // default: false // the sender's initial value for delivery-count // // This MUST NOT be null if role is sender, and it is ignored if the role is receiver. InitialDeliveryCount uint32 // sequence number // the maximum message size supported by the link endpoint // // This field indicates the maximum message size supported by the link endpoint. // Any attempt to deliver a message larger than this results in a message-size-exceeded // link-error. If this field is zero or unset, there is no maximum size imposed by the // link endpoint. MaxMessageSize uint64 // the extension capabilities the sender supports // http://www.amqp.org/specification/1.0/link-capabilities OfferedCapabilities encoding.MultiSymbol // the extension capabilities the sender can use if the receiver supports them // // The sender MUST NOT attempt to use any capability other than those it // has declared in desired-capabilities field. DesiredCapabilities encoding.MultiSymbol // link properties // http://www.amqp.org/specification/1.0/link-properties Properties map[encoding.Symbol]any } func (a *PerformAttach) frameBody() {} func (a PerformAttach) String() string { return fmt.Sprintf("Attach{Name: %s, Handle: %d, Role: %s, SenderSettleMode: %s, ReceiverSettleMode: %s, "+ "Source: %v, Target: %v, Unsettled: %v, IncompleteUnsettled: %t, InitialDeliveryCount: %d, MaxMessageSize: %d, "+ "OfferedCapabilities: %v, DesiredCapabilities: %v, Properties: %v}", a.Name, a.Handle, a.Role, a.SenderSettleMode, a.ReceiverSettleMode, a.Source, a.Target, a.Unsettled, a.IncompleteUnsettled, a.InitialDeliveryCount, a.MaxMessageSize, a.OfferedCapabilities, a.DesiredCapabilities, a.Properties, ) } func (a *PerformAttach) Marshal(wr *buffer.Buffer) error { return encoding.MarshalComposite(wr, encoding.TypeCodeAttach, []encoding.MarshalField{ {Value: &a.Name, Omit: false}, {Value: &a.Handle, Omit: false}, {Value: &a.Role, Omit: false}, {Value: a.SenderSettleMode, Omit: a.SenderSettleMode == nil}, {Value: a.ReceiverSettleMode, Omit: a.ReceiverSettleMode == nil}, {Value: a.Source, Omit: a.Source == nil}, {Value: a.Target, Omit: a.Target == nil}, {Value: a.Unsettled, Omit: len(a.Unsettled) == 0}, {Value: &a.IncompleteUnsettled, Omit: !a.IncompleteUnsettled}, {Value: &a.InitialDeliveryCount, Omit: a.Role == encoding.RoleReceiver}, {Value: &a.MaxMessageSize, Omit: a.MaxMessageSize == 0}, {Value: &a.OfferedCapabilities, Omit: len(a.OfferedCapabilities) == 0}, {Value: &a.DesiredCapabilities, Omit: len(a.DesiredCapabilities) == 0}, {Value: a.Properties, Omit: len(a.Properties) == 0}, }) } func (a *PerformAttach) Unmarshal(r *buffer.Buffer) error { return encoding.UnmarshalComposite(r, encoding.TypeCodeAttach, []encoding.UnmarshalField{ {Field: &a.Name, HandleNull: func() error { return errors.New("Attach.Name is required") }}, {Field: &a.Handle, HandleNull: func() error { return errors.New("Attach.Handle is required") }}, {Field: &a.Role, HandleNull: func() error { return errors.New("Attach.Role is required") }}, {Field: &a.SenderSettleMode}, {Field: &a.ReceiverSettleMode}, {Field: &a.Source}, {Field: &a.Target}, {Field: &a.Unsettled}, {Field: &a.IncompleteUnsettled}, {Field: &a.InitialDeliveryCount}, {Field: &a.MaxMessageSize}, {Field: &a.OfferedCapabilities}, {Field: &a.DesiredCapabilities}, {Field: &a.Properties}, }...) } /* */ type PerformFlow struct { // Identifies the expected transfer-id of the next incoming transfer frame. // This value MUST be set if the peer has received the begin frame for the // session, and MUST NOT be set if it has not. See subsection 2.5.6 for more details. NextIncomingID *uint32 // sequence number // Defines the maximum number of incoming transfer frames that the endpoint // can currently receive. See subsection 2.5.6 for more details. IncomingWindow uint32 // required // The transfer-id that will be assigned to the next outgoing transfer frame. // See subsection 2.5.6 for more details. NextOutgoingID uint32 // sequence number // Defines the maximum number of outgoing transfer frames that the endpoint // could potentially currently send, if it was not constrained by restrictions // imposed by its peer's incoming-window. See subsection 2.5.6 for more details. OutgoingWindow uint32 // If set, indicates that the flow frame carries flow state information for the local // link endpoint associated with the given handle. If not set, the flow frame is // carrying only information pertaining to the session endpoint. // // If set to a handle that is not currently associated with an attached link, // the recipient MUST respond by ending the session with an unattached-handle // session error. Handle *uint32 // The delivery-count is initialized by the sender when a link endpoint is created, // and is incremented whenever a message is sent. Only the sender MAY independently // modify this field. The receiver's value is calculated based on the last known // value from the sender and any subsequent messages received on the link. Note that, // despite its name, the delivery-count is not a count but a sequence number // initialized at an arbitrary point by the sender. // // When the handle field is not set, this field MUST NOT be set. // // When the handle identifies that the flow state is being sent from the sender link // endpoint to receiver link endpoint this field MUST be set to the current // delivery-count of the link endpoint. // // When the flow state is being sent from the receiver endpoint to the sender endpoint // this field MUST be set to the last known value of the corresponding sending endpoint. // In the event that the receiving link endpoint has not yet seen the initial attach // frame from the sender this field MUST NOT be set. DeliveryCount *uint32 // sequence number // the current maximum number of messages that can be received // // The current maximum number of messages that can be handled at the receiver endpoint // of the link. Only the receiver endpoint can independently set this value. The sender // endpoint sets this to the last known value seen from the receiver. // See subsection 2.6.7 for more details. // // When the handle field is not set, this field MUST NOT be set. LinkCredit *uint32 // the number of available messages // // The number of messages awaiting credit at the link sender endpoint. Only the sender // can independently set this value. The receiver sets this to the last known value seen // from the sender. See subsection 2.6.7 for more details. // // When the handle field is not set, this field MUST NOT be set. Available *uint32 // indicates drain mode // // When flow state is sent from the sender to the receiver, this field contains the // actual drain mode of the sender. When flow state is sent from the receiver to the // sender, this field contains the desired drain mode of the receiver. // See subsection 2.6.7 for more details. // // When the handle field is not set, this field MUST NOT be set. Drain bool // request state from partner // // If set to true then the receiver SHOULD send its state at the earliest convenient // opportunity. // // If set to true, and the handle field is not set, then the sender only requires // session endpoint state to be echoed, however, the receiver MAY fulfil this requirement // by sending a flow performative carrying link-specific state (since any such flow also // carries session state). // // If a sender makes multiple requests for the same state before the receiver can reply, // the receiver MAY send only one flow in return. // // Note that if a peer responds to echo requests with flows which themselves have the // echo field set to true, an infinite loop could result if its partner adopts the same // policy (therefore such a policy SHOULD be avoided). Echo bool // link state properties // http://www.amqp.org/specification/1.0/link-state-properties Properties map[encoding.Symbol]any } func (f *PerformFlow) frameBody() {} func (f *PerformFlow) String() string { return fmt.Sprintf("Flow{NextIncomingID: %s, IncomingWindow: %d, NextOutgoingID: %d, OutgoingWindow: %d, "+ "Handle: %s, DeliveryCount: %s, LinkCredit: %s, Available: %s, Drain: %t, Echo: %t, Properties: %+v}", formatUint32Ptr(f.NextIncomingID), f.IncomingWindow, f.NextOutgoingID, f.OutgoingWindow, formatUint32Ptr(f.Handle), formatUint32Ptr(f.DeliveryCount), formatUint32Ptr(f.LinkCredit), formatUint32Ptr(f.Available), f.Drain, f.Echo, f.Properties, ) } func formatUint32Ptr(p *uint32) string { if p == nil { return "" } return strconv.FormatUint(uint64(*p), 10) } func (f *PerformFlow) Marshal(wr *buffer.Buffer) error { return encoding.MarshalComposite(wr, encoding.TypeCodeFlow, []encoding.MarshalField{ {Value: f.NextIncomingID, Omit: f.NextIncomingID == nil}, {Value: &f.IncomingWindow, Omit: false}, {Value: &f.NextOutgoingID, Omit: false}, {Value: &f.OutgoingWindow, Omit: false}, {Value: f.Handle, Omit: f.Handle == nil}, {Value: f.DeliveryCount, Omit: f.DeliveryCount == nil}, {Value: f.LinkCredit, Omit: f.LinkCredit == nil}, {Value: f.Available, Omit: f.Available == nil}, {Value: &f.Drain, Omit: !f.Drain}, {Value: &f.Echo, Omit: !f.Echo}, {Value: f.Properties, Omit: len(f.Properties) == 0}, }) } func (f *PerformFlow) Unmarshal(r *buffer.Buffer) error { return encoding.UnmarshalComposite(r, encoding.TypeCodeFlow, []encoding.UnmarshalField{ {Field: &f.NextIncomingID}, {Field: &f.IncomingWindow, HandleNull: func() error { return errors.New("Flow.IncomingWindow is required") }}, {Field: &f.NextOutgoingID, HandleNull: func() error { return errors.New("Flow.NextOutgoingID is required") }}, {Field: &f.OutgoingWindow, HandleNull: func() error { return errors.New("Flow.OutgoingWindow is required") }}, {Field: &f.Handle}, {Field: &f.DeliveryCount}, {Field: &f.LinkCredit}, {Field: &f.Available}, {Field: &f.Drain}, {Field: &f.Echo}, {Field: &f.Properties}, }...) } /* */ type PerformTransfer struct { // Specifies the link on which the message is transferred. Handle uint32 // required // The delivery-id MUST be supplied on the first transfer of a multi-transfer // delivery. On continuation transfers the delivery-id MAY be omitted. It is // an error if the delivery-id on a continuation transfer differs from the // delivery-id on the first transfer of a delivery. DeliveryID *uint32 // sequence number // Uniquely identifies the delivery attempt for a given message on this link. // This field MUST be specified for the first transfer of a multi-transfer // message and can only be omitted for continuation transfers. It is an error // if the delivery-tag on a continuation transfer differs from the delivery-tag // on the first transfer of a delivery. DeliveryTag []byte // up to 32 bytes // This field MUST be specified for the first transfer of a multi-transfer message // and can only be omitted for continuation transfers. It is an error if the // message-format on a continuation transfer differs from the message-format on // the first transfer of a delivery. // // The upper three octets of a message format code identify a particular message // format. The lowest octet indicates the version of said message format. Any given // version of a format is forwards compatible with all higher versions. MessageFormat *uint32 // If not set on the first (or only) transfer for a (multi-transfer) delivery, // then the settled flag MUST be interpreted as being false. For subsequent // transfers in a multi-transfer delivery if the settled flag is left unset then // it MUST be interpreted as true if and only if the value of the settled flag on // any of the preceding transfers was true; if no preceding transfer was sent with // settled being true then the value when unset MUST be taken as false. // // If the negotiated value for snd-settle-mode at attachment is settled, then this // field MUST be true on at least one transfer frame for a delivery (i.e., the // delivery MUST be settled at the sender at the point the delivery has been // completely transferred). // // If the negotiated value for snd-settle-mode at attachment is unsettled, then this // field MUST be false (or unset) on every transfer frame for a delivery (unless the // delivery is aborted). Settled bool // indicates that the message has more content // // Note that if both the more and aborted fields are set to true, the aborted flag // takes precedence. That is, a receiver SHOULD ignore the value of the more field // if the transfer is marked as aborted. A sender SHOULD NOT set the more flag to // true if it also sets the aborted flag to true. More bool // If first, this indicates that the receiver MUST settle the delivery once it has // arrived without waiting for the sender to settle first. // // If second, this indicates that the receiver MUST NOT settle until sending its // disposition to the sender and receiving a settled disposition from the sender. // // If not set, this value is defaulted to the value negotiated on link attach. // // If the negotiated link value is first, then it is illegal to set this field // to second. // // If the message is being sent settled by the sender, the value of this field // is ignored. // // The (implicit or explicit) value of this field does not form part of the // transfer state, and is not retained if a link is suspended and subsequently resumed. // // 0: first - The receiver will spontaneously settle all incoming transfers. // 1: second - The receiver will only settle after sending the disposition to // the sender and receiving a disposition indicating settlement of // the delivery from the sender. ReceiverSettleMode *encoding.ReceiverSettleMode // the state of the delivery at the sender // // When set this informs the receiver of the state of the delivery at the sender. // This is particularly useful when transfers of unsettled deliveries are resumed // after resuming a link. Setting the state on the transfer can be thought of as // being equivalent to sending a disposition immediately before the transfer // performative, i.e., it is the state of the delivery (not the transfer) that // existed at the point the frame was sent. // // Note that if the transfer performative (or an earlier disposition performative // referring to the delivery) indicates that the delivery has attained a terminal // state, then no future transfer or disposition sent by the sender can alter that // terminal state. State encoding.DeliveryState // indicates a resumed delivery // // If true, the resume flag indicates that the transfer is being used to reassociate // an unsettled delivery from a dissociated link endpoint. See subsection 2.6.13 // for more details. // // The receiver MUST ignore resumed deliveries that are not in its local unsettled map. // The sender MUST NOT send resumed transfers for deliveries not in its local // unsettled map. // // If a resumed delivery spans more than one transfer performative, then the resume // flag MUST be set to true on the first transfer of the resumed delivery. For // subsequent transfers for the same delivery the resume flag MAY be set to true, // or MAY be omitted. // // In the case where the exchange of unsettled maps makes clear that all message // data has been successfully transferred to the receiver, and that only the final // state (and potentially settlement) at the sender needs to be conveyed, then a // resumed delivery MAY carry no payload and instead act solely as a vehicle for // carrying the terminal state of the delivery at the sender. Resume bool // indicates that the message is aborted // // Aborted messages SHOULD be discarded by the recipient (any payload within the // frame carrying the performative MUST be ignored). An aborted message is // implicitly settled. Aborted bool // batchable hint // // If true, then the issuer is hinting that there is no need for the peer to urgently // communicate updated delivery state. This hint MAY be used to artificially increase // the amount of batching an implementation uses when communicating delivery states, // and thereby save bandwidth. // // If the message being delivered is too large to fit within a single frame, then the // setting of batchable to true on any of the transfer performatives for the delivery // is equivalent to setting batchable to true for all the transfer performatives for // the delivery. // // The batchable value does not form part of the transfer state, and is not retained // if a link is suspended and subsequently resumed. Batchable bool Payload []byte // optional channel to indicate to sender that transfer has completed // // Settled=true: closed when the transferred on network. // Settled=false: closed when the receiver has confirmed settlement. Done chan encoding.DeliveryState } func (t *PerformTransfer) frameBody() {} func (t PerformTransfer) String() string { deliveryTag := "" if t.DeliveryTag != nil { deliveryTag = fmt.Sprintf("%X", t.DeliveryTag) } return fmt.Sprintf("Transfer{Handle: %d, DeliveryID: %s, DeliveryTag: %s, MessageFormat: %s, "+ "Settled: %t, More: %t, ReceiverSettleMode: %s, State: %v, Resume: %t, Aborted: %t, "+ "Batchable: %t, Payload [size]: %d}", t.Handle, formatUint32Ptr(t.DeliveryID), deliveryTag, formatUint32Ptr(t.MessageFormat), t.Settled, t.More, t.ReceiverSettleMode, t.State, t.Resume, t.Aborted, t.Batchable, len(t.Payload), ) } func (t *PerformTransfer) Marshal(wr *buffer.Buffer) error { err := encoding.MarshalComposite(wr, encoding.TypeCodeTransfer, []encoding.MarshalField{ {Value: &t.Handle}, {Value: t.DeliveryID, Omit: t.DeliveryID == nil}, {Value: &t.DeliveryTag, Omit: len(t.DeliveryTag) == 0}, {Value: t.MessageFormat, Omit: t.MessageFormat == nil}, {Value: &t.Settled, Omit: !t.Settled}, {Value: &t.More, Omit: !t.More}, {Value: t.ReceiverSettleMode, Omit: t.ReceiverSettleMode == nil}, {Value: t.State, Omit: t.State == nil}, {Value: &t.Resume, Omit: !t.Resume}, {Value: &t.Aborted, Omit: !t.Aborted}, {Value: &t.Batchable, Omit: !t.Batchable}, }) if err != nil { return err } wr.Append(t.Payload) return nil } func (t *PerformTransfer) Unmarshal(r *buffer.Buffer) error { err := encoding.UnmarshalComposite(r, encoding.TypeCodeTransfer, []encoding.UnmarshalField{ {Field: &t.Handle, HandleNull: func() error { return errors.New("Transfer.Handle is required") }}, {Field: &t.DeliveryID}, {Field: &t.DeliveryTag}, {Field: &t.MessageFormat}, {Field: &t.Settled}, {Field: &t.More}, {Field: &t.ReceiverSettleMode}, {Field: &t.State}, {Field: &t.Resume}, {Field: &t.Aborted}, {Field: &t.Batchable}, }...) if err != nil { return err } t.Payload = append([]byte(nil), r.Bytes()...) return err } /* */ type PerformDisposition struct { // directionality of disposition // // The role identifies whether the disposition frame contains information about // sending link endpoints or receiving link endpoints. Role encoding.Role // lower bound of deliveries // // Identifies the lower bound of delivery-ids for the deliveries in this set. First uint32 // required, sequence number // upper bound of deliveries // // Identifies the upper bound of delivery-ids for the deliveries in this set. // If not set, this is taken to be the same as first. Last *uint32 // sequence number // indicates deliveries are settled // // If true, indicates that the referenced deliveries are considered settled by // the issuing endpoint. Settled bool // indicates state of deliveries // // Communicates the state of all the deliveries referenced by this disposition. State encoding.DeliveryState // batchable hint // // If true, then the issuer is hinting that there is no need for the peer to // urgently communicate the impact of the updated delivery states. This hint // MAY be used to artificially increase the amount of batching an implementation // uses when communicating delivery states, and thereby save bandwidth. Batchable bool } func (d *PerformDisposition) frameBody() {} func (d PerformDisposition) String() string { return fmt.Sprintf("Disposition{Role: %s, First: %d, Last: %s, Settled: %t, State: %v, Batchable: %t}", d.Role, d.First, formatUint32Ptr(d.Last), d.Settled, d.State, d.Batchable, ) } func (d *PerformDisposition) Marshal(wr *buffer.Buffer) error { return encoding.MarshalComposite(wr, encoding.TypeCodeDisposition, []encoding.MarshalField{ {Value: &d.Role, Omit: false}, {Value: &d.First, Omit: false}, {Value: d.Last, Omit: d.Last == nil}, {Value: &d.Settled, Omit: !d.Settled}, {Value: d.State, Omit: d.State == nil}, {Value: &d.Batchable, Omit: !d.Batchable}, }) } func (d *PerformDisposition) Unmarshal(r *buffer.Buffer) error { return encoding.UnmarshalComposite(r, encoding.TypeCodeDisposition, []encoding.UnmarshalField{ {Field: &d.Role, HandleNull: func() error { return errors.New("Disposition.Role is required") }}, {Field: &d.First, HandleNull: func() error { return errors.New("Disposition.Handle is required") }}, {Field: &d.Last}, {Field: &d.Settled}, {Field: &d.State}, {Field: &d.Batchable}, }...) } /* */ type PerformDetach struct { // the local handle of the link to be detached Handle uint32 //required // if true then the sender has closed the link Closed bool // error causing the detach // // If set, this field indicates that the link is being detached due to an error // condition. The value of the field SHOULD contain details on the cause of the error. Error *encoding.Error } func (d *PerformDetach) frameBody() {} func (d PerformDetach) String() string { return fmt.Sprintf("Detach{Handle: %d, Closed: %t, Error: %v}", d.Handle, d.Closed, d.Error, ) } func (d *PerformDetach) Marshal(wr *buffer.Buffer) error { return encoding.MarshalComposite(wr, encoding.TypeCodeDetach, []encoding.MarshalField{ {Value: &d.Handle, Omit: false}, {Value: &d.Closed, Omit: !d.Closed}, {Value: d.Error, Omit: d.Error == nil}, }) } func (d *PerformDetach) Unmarshal(r *buffer.Buffer) error { return encoding.UnmarshalComposite(r, encoding.TypeCodeDetach, []encoding.UnmarshalField{ {Field: &d.Handle, HandleNull: func() error { return errors.New("Detach.Handle is required") }}, {Field: &d.Closed}, {Field: &d.Error}, }...) } /* */ type PerformEnd struct { // error causing the end // // If set, this field indicates that the session is being ended due to an error // condition. The value of the field SHOULD contain details on the cause of the error. Error *encoding.Error } func (e *PerformEnd) frameBody() {} func (d PerformEnd) String() string { return fmt.Sprintf("End{Error: %v}", d.Error) } func (e *PerformEnd) Marshal(wr *buffer.Buffer) error { return encoding.MarshalComposite(wr, encoding.TypeCodeEnd, []encoding.MarshalField{ {Value: e.Error, Omit: e.Error == nil}, }) } func (e *PerformEnd) Unmarshal(r *buffer.Buffer) error { return encoding.UnmarshalComposite(r, encoding.TypeCodeEnd, encoding.UnmarshalField{Field: &e.Error}, ) } /* */ type PerformClose struct { // error causing the close // // If set, this field indicates that the session is being closed due to an error // condition. The value of the field SHOULD contain details on the cause of the error. Error *encoding.Error } func (c *PerformClose) frameBody() {} func (c *PerformClose) Marshal(wr *buffer.Buffer) error { return encoding.MarshalComposite(wr, encoding.TypeCodeClose, []encoding.MarshalField{ {Value: c.Error, Omit: c.Error == nil}, }) } func (c *PerformClose) Unmarshal(r *buffer.Buffer) error { return encoding.UnmarshalComposite(r, encoding.TypeCodeClose, encoding.UnmarshalField{Field: &c.Error}, ) } func (c *PerformClose) String() string { return fmt.Sprintf("Close{Error: %s}", c.Error) } /* */ type SASLInit struct { Mechanism encoding.Symbol InitialResponse []byte Hostname string } func (si *SASLInit) frameBody() {} func (si *SASLInit) Marshal(wr *buffer.Buffer) error { return encoding.MarshalComposite(wr, encoding.TypeCodeSASLInit, []encoding.MarshalField{ {Value: &si.Mechanism, Omit: false}, {Value: &si.InitialResponse, Omit: false}, {Value: &si.Hostname, Omit: len(si.Hostname) == 0}, }) } func (si *SASLInit) Unmarshal(r *buffer.Buffer) error { return encoding.UnmarshalComposite(r, encoding.TypeCodeSASLInit, []encoding.UnmarshalField{ {Field: &si.Mechanism, HandleNull: func() error { return errors.New("saslInit.Mechanism is required") }}, {Field: &si.InitialResponse}, {Field: &si.Hostname}, }...) } func (si *SASLInit) String() string { // Elide the InitialResponse as it may contain a plain text secret. return fmt.Sprintf("SaslInit{Mechanism : %s, InitialResponse: ********, Hostname: %s}", si.Mechanism, si.Hostname, ) } /* */ type SASLMechanisms struct { Mechanisms encoding.MultiSymbol } func (sm *SASLMechanisms) frameBody() {} func (sm *SASLMechanisms) Marshal(wr *buffer.Buffer) error { return encoding.MarshalComposite(wr, encoding.TypeCodeSASLMechanism, []encoding.MarshalField{ {Value: &sm.Mechanisms, Omit: false}, }) } func (sm *SASLMechanisms) Unmarshal(r *buffer.Buffer) error { return encoding.UnmarshalComposite(r, encoding.TypeCodeSASLMechanism, encoding.UnmarshalField{Field: &sm.Mechanisms, HandleNull: func() error { return errors.New("saslMechanisms.Mechanisms is required") }}, ) } func (sm *SASLMechanisms) String() string { return fmt.Sprintf("SaslMechanisms{Mechanisms : %v}", sm.Mechanisms, ) } /* */ type SASLChallenge struct { Challenge []byte } func (sc *SASLChallenge) String() string { return "Challenge{Challenge: ********}" } func (sc *SASLChallenge) frameBody() {} func (sc *SASLChallenge) Marshal(wr *buffer.Buffer) error { return encoding.MarshalComposite(wr, encoding.TypeCodeSASLChallenge, []encoding.MarshalField{ {Value: &sc.Challenge, Omit: false}, }) } func (sc *SASLChallenge) Unmarshal(r *buffer.Buffer) error { return encoding.UnmarshalComposite(r, encoding.TypeCodeSASLChallenge, []encoding.UnmarshalField{ {Field: &sc.Challenge, HandleNull: func() error { return errors.New("saslChallenge.Challenge is required") }}, }...) } /* */ type SASLResponse struct { Response []byte } func (sr *SASLResponse) String() string { return "Response{Response: ********}" } func (sr *SASLResponse) frameBody() {} func (sr *SASLResponse) Marshal(wr *buffer.Buffer) error { return encoding.MarshalComposite(wr, encoding.TypeCodeSASLResponse, []encoding.MarshalField{ {Value: &sr.Response, Omit: false}, }) } func (sr *SASLResponse) Unmarshal(r *buffer.Buffer) error { return encoding.UnmarshalComposite(r, encoding.TypeCodeSASLResponse, []encoding.UnmarshalField{ {Field: &sr.Response, HandleNull: func() error { return errors.New("saslResponse.Response is required") }}, }...) } /* */ type SASLOutcome struct { Code encoding.SASLCode AdditionalData []byte } func (so *SASLOutcome) frameBody() {} func (so *SASLOutcome) Marshal(wr *buffer.Buffer) error { return encoding.MarshalComposite(wr, encoding.TypeCodeSASLOutcome, []encoding.MarshalField{ {Value: &so.Code, Omit: false}, {Value: &so.AdditionalData, Omit: len(so.AdditionalData) == 0}, }) } func (so *SASLOutcome) Unmarshal(r *buffer.Buffer) error { return encoding.UnmarshalComposite(r, encoding.TypeCodeSASLOutcome, []encoding.UnmarshalField{ {Field: &so.Code, HandleNull: func() error { return errors.New("saslOutcome.AdditionalData is required") }}, {Field: &so.AdditionalData}, }...) } func (so *SASLOutcome) String() string { return fmt.Sprintf("SaslOutcome{Code : %v, AdditionalData: %v}", so.Code, so.AdditionalData, ) } golang-github-azure-go-amqp-1.0.2/internal/frames/parsing.go000066400000000000000000000100701454613650200240130ustar00rootroot00000000000000package frames import ( "encoding/binary" "errors" "fmt" "math" "github.com/Azure/go-amqp/internal/buffer" "github.com/Azure/go-amqp/internal/encoding" ) const HeaderSize = 8 // Frame structure: // // header (8 bytes) // 0-3: SIZE (total size, at least 8 bytes for header, uint32) // 4: DOFF (data offset,at least 2, count of 4 bytes words, uint8) // 5: TYPE (frame type) // 0x0: AMQP // 0x1: SASL // 6-7: type dependent (channel for AMQP) // extended header (opt) // body (opt) // Header in a structure appropriate for use with binary.Read() type Header struct { // size: an unsigned 32-bit integer that MUST contain the total frame size of the frame header, // extended header, and frame body. The frame is malformed if the size is less than the size of // the frame header (8 bytes). Size uint32 // doff: gives the position of the body within the frame. The value of the data offset is an // unsigned, 8-bit integer specifying a count of 4-byte words. Due to the mandatory 8-byte // frame header, the frame is malformed if the value is less than 2. DataOffset uint8 FrameType uint8 Channel uint16 } // ParseHeader reads the header from r and returns the result. // // No validation is done. func ParseHeader(r *buffer.Buffer) (Header, error) { buf, ok := r.Next(8) if !ok { return Header{}, errors.New("invalid frameHeader") } _ = buf[7] fh := Header{ Size: binary.BigEndian.Uint32(buf[0:4]), DataOffset: buf[4], FrameType: buf[5], Channel: binary.BigEndian.Uint16(buf[6:8]), } if fh.Size < HeaderSize { return fh, fmt.Errorf("received frame header with invalid size %d", fh.Size) } if fh.DataOffset < 2 { return fh, fmt.Errorf("received frame header with invalid data offset %d", fh.DataOffset) } return fh, nil } // ParseBody reads and unmarshals an AMQP frame. func ParseBody(r *buffer.Buffer) (FrameBody, error) { payload := r.Bytes() if r.Len() < 3 || payload[0] != 0 || encoding.AMQPType(payload[1]) != encoding.TypeCodeSmallUlong { return nil, errors.New("invalid frame body header") } switch pType := encoding.AMQPType(payload[2]); pType { case encoding.TypeCodeOpen: t := new(PerformOpen) err := t.Unmarshal(r) return t, err case encoding.TypeCodeBegin: t := new(PerformBegin) err := t.Unmarshal(r) return t, err case encoding.TypeCodeAttach: t := new(PerformAttach) err := t.Unmarshal(r) return t, err case encoding.TypeCodeFlow: t := new(PerformFlow) err := t.Unmarshal(r) return t, err case encoding.TypeCodeTransfer: t := new(PerformTransfer) err := t.Unmarshal(r) return t, err case encoding.TypeCodeDisposition: t := new(PerformDisposition) err := t.Unmarshal(r) return t, err case encoding.TypeCodeDetach: t := new(PerformDetach) err := t.Unmarshal(r) return t, err case encoding.TypeCodeEnd: t := new(PerformEnd) err := t.Unmarshal(r) return t, err case encoding.TypeCodeClose: t := new(PerformClose) err := t.Unmarshal(r) return t, err case encoding.TypeCodeSASLMechanism: t := new(SASLMechanisms) err := t.Unmarshal(r) return t, err case encoding.TypeCodeSASLChallenge: t := new(SASLChallenge) err := t.Unmarshal(r) return t, err case encoding.TypeCodeSASLOutcome: t := new(SASLOutcome) err := t.Unmarshal(r) return t, err default: return nil, fmt.Errorf("unknown performative type %02x", pType) } } // Write encodes fr into buf. // split out from conn.WriteFrame for testing purposes. func Write(buf *buffer.Buffer, fr Frame) error { // write header buf.Append([]byte{ 0, 0, 0, 0, // size, overwrite later 2, // doff, see frameHeader.DataOffset comment uint8(fr.Type), // frame type }) buf.AppendUint16(fr.Channel) // channel // write AMQP frame body err := encoding.Marshal(buf, fr.Body) if err != nil { return err } // validate size if uint(buf.Len()) > math.MaxUint32 { return errors.New("frame too large") } // retrieve raw bytes bufBytes := buf.Bytes() // write correct size binary.BigEndian.PutUint32(bufBytes, uint32(len(bufBytes))) return nil } golang-github-azure-go-amqp-1.0.2/internal/queue/000077500000000000000000000000001454613650200216725ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/queue/queue.go000066400000000000000000000071541454613650200233540ustar00rootroot00000000000000package queue import ( "container/ring" ) // Holder provides synchronized access to a *Queue[T]. type Holder[T any] struct { // these channels work in tandem to provide exclusive access to the underlying *Queue[T]. // each channel is created with a buffer size of one. // empty behaves like a mutex when there's one or more messages in the queue. // populated is like a semaphore when the queue is empty. // the *Queue[T] is only ever in one channel. which channel depends on if it contains any items. // the initial state is for empty to contain an empty queue. empty chan *Queue[T] populated chan *Queue[T] } // NewHolder creates a new Holder[T] that contains the provided *Queue[T]. func NewHolder[T any](q *Queue[T]) *Holder[T] { h := &Holder[T]{ empty: make(chan *Queue[T], 1), populated: make(chan *Queue[T], 1), } h.Release(q) return h } // Acquire attempts to acquire the *Queue[T]. If the *Queue[T] has already been acquired the call blocks. // When the *Queue[T] is no longer required, you MUST call Release() to relinquish acquisition. func (h *Holder[T]) Acquire() *Queue[T] { // the queue will be in only one of the channels, it doesn't matter which one var q *Queue[T] select { case q = <-h.empty: // empty queue case q = <-h.populated: // populated queue } return q } // Wait returns a channel that's signaled when the *Queue[T] contains at least one item. // When the *Queue[T] is no longer required, you MUST call Release() to relinquish acquisition. func (h *Holder[T]) Wait() <-chan *Queue[T] { return h.populated } // Release returns the *Queue[T] back to the Holder[T]. // Once the *Queue[T] has been released, it is no longer safe to call its methods. func (h *Holder[T]) Release(q *Queue[T]) { if q.Len() == 0 { h.empty <- q } else { h.populated <- q } } // Len returns the length of the *Queue[T]. func (h *Holder[T]) Len() int { msgLen := 0 select { case q := <-h.empty: h.empty <- q case q := <-h.populated: msgLen = q.Len() h.populated <- q } return msgLen } // Queue[T] is a segmented FIFO queue of Ts. type Queue[T any] struct { head *ring.Ring tail *ring.Ring size int } // New creates a new instance of Queue[T]. // - size is the size of each Queue segment func New[T any](size int) *Queue[T] { r := &ring.Ring{ Value: &segment[T]{ items: make([]*T, size), }, } return &Queue[T]{ head: r, tail: r, } } // Enqueue adds the specified item to the end of the queue. // If the current segment is full, a new segment is created. func (q *Queue[T]) Enqueue(item T) { for { r := q.tail seg := r.Value.(*segment[T]) if seg.tail < len(seg.items) { seg.items[seg.tail] = &item seg.tail++ q.size++ return } // segment is full, can we advance? if next := r.Next(); next != q.head { q.tail = next continue } // no, add a new ring r.Link(&ring.Ring{ Value: &segment[T]{ items: make([]*T, len(seg.items)), }, }) q.tail = r.Next() } } // Dequeue removes and returns the item from the front of the queue. func (q *Queue[T]) Dequeue() *T { r := q.head seg := r.Value.(*segment[T]) if seg.tail == 0 { // queue is empty return nil } // remove first item item := seg.items[seg.head] seg.items[seg.head] = nil seg.head++ q.size-- if seg.head == seg.tail { // segment is now empty, reset indices seg.head, seg.tail = 0, 0 // if we're not at the last ring, advance head to the next one if q.head != q.tail { q.head = r.Next() } } return item } // Len returns the total count of enqueued items. func (q *Queue[T]) Len() int { return q.size } type segment[T any] struct { items []*T head int tail int } golang-github-azure-go-amqp-1.0.2/internal/queue/queue_test.go000066400000000000000000000172101454613650200244050ustar00rootroot00000000000000package queue import ( "testing" "github.com/stretchr/testify/require" ) func TestQueueBasic(t *testing.T) { q := New[string](5) require.NotNil(t, q) require.Zero(t, q.Len()) require.Same(t, q.head, q.tail) require.EqualValues(t, 1, q.head.Len()) v := q.Dequeue() require.Nil(t, v) require.Zero(t, q.Len()) require.Same(t, q.head, q.tail) require.EqualValues(t, 1, q.head.Len()) const one = "one" q.Enqueue(one) require.EqualValues(t, 1, q.Len()) require.Same(t, q.head, q.tail) require.EqualValues(t, 1, q.head.Len()) seg, ok := q.head.Value.(*segment[string]) require.True(t, ok) require.EqualValues(t, 0, seg.head) require.EqualValues(t, 1, seg.tail) v = q.Dequeue() require.NotNil(t, v) require.EqualValues(t, one, *v) require.Zero(t, q.Len()) require.Same(t, q.head, q.tail) require.EqualValues(t, 1, q.head.Len()) seg, ok = q.head.Value.(*segment[string]) require.True(t, ok) require.EqualValues(t, 0, seg.head) require.EqualValues(t, 0, seg.tail) v = q.Dequeue() require.Nil(t, v) require.EqualValues(t, 1, q.head.Len()) const two = "two" q.Enqueue(one) q.Enqueue(two) require.EqualValues(t, 2, q.Len()) require.Same(t, q.head, q.tail) require.EqualValues(t, 1, q.head.Len()) seg, ok = q.head.Value.(*segment[string]) require.True(t, ok) require.EqualValues(t, 0, seg.head) require.EqualValues(t, 2, seg.tail) v = q.Dequeue() require.NotNil(t, v) require.EqualValues(t, one, *v) require.EqualValues(t, 1, q.head.Len()) seg, ok = q.head.Value.(*segment[string]) require.True(t, ok) require.EqualValues(t, 1, seg.head) require.EqualValues(t, 2, seg.tail) v = q.Dequeue() require.NotNil(t, v) require.EqualValues(t, two, *v) require.EqualValues(t, 1, q.head.Len()) seg, ok = q.head.Value.(*segment[string]) require.True(t, ok) require.EqualValues(t, 0, seg.head) require.EqualValues(t, 0, seg.tail) } func TestQueueNewSeg(t *testing.T) { const size = 5 q := New[int](size) require.NotNil(t, q) // fill up first segment for i := 0; i < size; i++ { q.Enqueue(i + 1) } // verify there's no new segment require.EqualValues(t, size, q.Len()) require.Same(t, q.head, q.tail) seg, ok := q.head.Value.(*segment[int]) require.True(t, ok) require.EqualValues(t, 0, seg.head) require.EqualValues(t, size, seg.tail) // with first segment full, a new one is created q.Enqueue(6) require.EqualValues(t, size+1, q.Len()) require.NotSame(t, q.head, q.tail) require.EqualValues(t, 2, q.head.Len()) // first segment undisturbed seg, ok = q.head.Value.(*segment[int]) require.True(t, ok) require.EqualValues(t, 0, seg.head) require.EqualValues(t, size, seg.tail) // second segment contains one item seg, ok = q.tail.Value.(*segment[int]) require.True(t, ok) require.EqualValues(t, 0, seg.head) require.EqualValues(t, 1, seg.tail) // new segment properly linked require.EqualValues(t, q.tail, q.head.Next()) require.EqualValues(t, q.head, q.tail.Next()) // dequeue the first three items for i := 0; i < 3; i++ { val := q.Dequeue() require.NotNil(t, val) require.EqualValues(t, i+1, *val) } require.EqualValues(t, 3, q.Len()) // should be two items left seg, ok = q.head.Value.(*segment[int]) require.True(t, ok) require.EqualValues(t, size-2, seg.head) require.EqualValues(t, size, seg.tail) // enqueue another item q.Enqueue(7) require.EqualValues(t, 4, q.Len()) // first segment is undisturbed (still two items) seg, ok = q.head.Value.(*segment[int]) require.True(t, ok) require.EqualValues(t, size-2, seg.head) require.EqualValues(t, size, seg.tail) // now there are two items in the second segment seg, ok = q.tail.Value.(*segment[int]) require.True(t, ok) require.EqualValues(t, 0, seg.head) require.EqualValues(t, 2, seg.tail) // now dequeue remaining items in first segment for i := 0; i < 2; i++ { val := q.Dequeue() require.NotNil(t, val) require.EqualValues(t, i+4, *val) } require.EqualValues(t, 2, q.Len()) require.EqualValues(t, 2, q.head.Len()) // first segement is now empty and q.head has advanced require.Same(t, q.head, q.tail) seg, ok = q.tail.Prev().Value.(*segment[int]) require.True(t, ok) require.EqualValues(t, 0, seg.head) require.EqualValues(t, 0, seg.tail) // enqueueing another value q.Enqueue(8) require.EqualValues(t, 3, q.Len()) require.Same(t, q.head, q.tail) seg, ok = q.head.Value.(*segment[int]) require.True(t, ok) require.EqualValues(t, 0, seg.head) require.EqualValues(t, 3, seg.tail) // should not touch first (empty) segment seg, ok = q.head.Prev().Value.(*segment[int]) require.True(t, ok) require.EqualValues(t, 0, seg.head) require.EqualValues(t, 0, seg.tail) // dequeue items from second segment (one left) for i := 0; i < 2; i++ { val := q.Dequeue() require.NotNil(t, val) require.EqualValues(t, 6+i, *val) } require.EqualValues(t, 1, q.Len()) seg, ok = q.head.Value.(*segment[int]) require.True(t, ok) require.EqualValues(t, 2, seg.head) require.EqualValues(t, 3, seg.tail) // dequeue last item val := q.Dequeue() require.NotNil(t, val) require.EqualValues(t, 8, *val) require.Zero(t, q.Len()) require.Same(t, q.head, q.tail) // both segments are empty seg, ok = q.head.Value.(*segment[int]) require.True(t, ok) require.EqualValues(t, 0, seg.head) require.EqualValues(t, 0, seg.tail) seg, ok = q.head.Next().Value.(*segment[int]) require.True(t, ok) require.EqualValues(t, 0, seg.head) require.EqualValues(t, 0, seg.tail) require.EqualValues(t, 2, q.head.Len()) } func TestManyItemsStableRingCount(t *testing.T) { const ( items = 5000 factor = 10 segSize = items / factor ) q := New[int](segSize) for n := 0; n < 100; n++ { for i := 0; i < items; i++ { q.Enqueue(i) if n == 0 && i > 0 && i%segSize == 0 { // on the first iteration, for every seg-size inserts, we should see a new segment require.EqualValues(t, (i/segSize)+1, q.head.Len()) } } require.EqualValues(t, items, q.Len()) require.EqualValues(t, factor, q.head.Len()) for i := 0; i < items; i++ { v := q.Dequeue() require.NotNil(t, v) require.EqualValues(t, i, *v) } require.Zero(t, q.Len()) require.EqualValues(t, factor, q.head.Len()) require.Same(t, q.head, q.tail) } } func TestChasingRingGrowth(t *testing.T) { const ( items = 5000 factor = 10 segSize = items / factor ) q := New[int](segSize) // create two segments for i := 0; i < segSize*2; i++ { q.Enqueue(i) } require.EqualValues(t, 2, q.head.Len()) require.NotSame(t, q.head, q.tail) // drain first for i := 0; i < segSize; i++ { v := q.Dequeue() require.NotNil(t, v) } require.EqualValues(t, 2, q.head.Len()) require.Same(t, q.head, q.tail) // old head is reused now for i := 0; i < segSize; i++ { q.Enqueue(i) } require.EqualValues(t, 2, q.head.Len()) for i := 0; i < segSize; i++ { v := q.Dequeue() require.NotNil(t, v) } require.EqualValues(t, 2, q.head.Len()) for i := 0; i < segSize; i++ { v := q.Dequeue() require.NotNil(t, v) } require.EqualValues(t, 2, q.head.Len()) require.Zero(t, q.Len()) require.Same(t, q.head, q.tail) // two segments now, add a third for i := 0; i < segSize*3; i++ { q.Enqueue(i) } require.EqualValues(t, 3, q.head.Len()) require.NotSame(t, q.head, q.tail) // drain first two for i := 0; i < segSize*2; i++ { v := q.Dequeue() require.NotNil(t, v) } require.EqualValues(t, 3, q.head.Len()) require.Same(t, q.head, q.tail) // fill up one for i := 0; i < segSize; i++ { q.Enqueue(i) } require.EqualValues(t, 3, q.head.Len()) require.NotSame(t, q.head, q.tail) require.EqualValues(t, segSize*2, q.Len()) // drain all for { v := q.Dequeue() if v == nil { break } } require.EqualValues(t, 3, q.head.Len()) require.Same(t, q.head, q.tail) require.Zero(t, q.Len()) } golang-github-azure-go-amqp-1.0.2/internal/shared/000077500000000000000000000000001454613650200220145ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/shared/shared.go000066400000000000000000000013031454613650200236060ustar00rootroot00000000000000package shared import ( "encoding/base64" "math/rand" "sync" "time" ) // lockedRand provides a rand source that is safe for concurrent use. type lockedRand struct { mu sync.Mutex src *rand.Rand } func (r *lockedRand) Read(p []byte) (int, error) { r.mu.Lock() defer r.mu.Unlock() return r.src.Read(p) } // package scoped rand source to avoid any issues with seeding // of the global source. var pkgRand = &lockedRand{ src: rand.New(rand.NewSource(time.Now().UnixNano())), } // RandString returns a base64 encoded string of n bytes. func RandString(n int) string { b := make([]byte, n) // from math/rand, cannot fail _, _ = pkgRand.Read(b) return base64.RawURLEncoding.EncodeToString(b) } golang-github-azure-go-amqp-1.0.2/internal/test/000077500000000000000000000000001454613650200215255ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/test/test.go000066400000000000000000000055731454613650200230450ustar00rootroot00000000000000package test import ( "reflect" "time" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" ) func Equal(x, y any) bool { return cmp.Equal(x, y, compareOpts(x, y)...) } func Diff(x, y any) string { return cmp.Diff(x, y, compareOpts(x, y)...) } func compareOpts(x, y any) []cmp.Option { return cmp.Options{ deepAllowUnexported(x, y), cmpopts.EquateNaNs(), } } // from https://github.com/google/go-cmp/issues/40 func deepAllowUnexported(vs ...any) cmp.Option { m := make(map[reflect.Type]struct{}) for _, v := range vs { structTypes(reflect.ValueOf(v), m) } var types []any for t := range m { types = append(types, reflect.New(t).Elem().Interface()) } return cmp.AllowUnexported(types...) } func structTypes(v reflect.Value, m map[reflect.Type]struct{}) { if !v.IsValid() { return } switch v.Kind() { case reflect.Ptr: if !v.IsNil() { structTypes(v.Elem(), m) } case reflect.Interface: if !v.IsNil() { structTypes(v.Elem(), m) } case reflect.Slice, reflect.Array: for i := 0; i < v.Len(); i++ { structTypes(v.Index(i), m) } case reflect.Map: for _, k := range v.MapKeys() { structTypes(v.MapIndex(k), m) } case reflect.Struct: m[v.Type()] = struct{}{} for i := 0; i < v.NumField(); i++ { structTypes(v.Field(i), m) } } } // MuxSemaphore is a helper for managing rendezvous with the mux at certain points during execution. type MuxSemaphore struct { count int pausedCh chan struct{} resumeCh chan struct{} } // NewMuxSemaphore creates a new MuxSemaphore with the specified count. // - count is the number of iterations the mux will execute before pausing func NewMuxSemaphore(count int) *MuxSemaphore { return &MuxSemaphore{ count: count, pausedCh: make(chan struct{}), resumeCh: make(chan struct{}), } } // OnLoop is to be called from your mux test hook. // panics if the pause/resume cycle takes more than 5s. func (m *MuxSemaphore) OnLoop() { if m.count > 0 { m.count-- return } else if m.count < 0 { return } timer := time.NewTimer(5 * time.Second) select { case m.pausedCh <- struct{}{}: // mux is now paused case <-timer.C: panic("pause time exceeded") } select { case <-m.resumeCh: // mux resumed case <-timer.C: panic("resume time exceeded") } timer.Stop() } // Wait - blocks until the mux is paused. // panics if the wait exceeds 5s. func (m *MuxSemaphore) Wait() { select { case <-m.pausedCh: // mux is paused case <-time.After(5 * time.Second): panic("wait time exceeded") } } // Release - call this to resume the mux with a new count (zero-based) // - count is the number of iterations the mux will execute before pausing, pass -1 to close the semaphore // // panics if the wait exceeds 5s. func (m *MuxSemaphore) Release(count int) { select { case m.resumeCh <- struct{}{}: m.count = count case <-time.After(5 * time.Second): panic("release time exceeded") } } golang-github-azure-go-amqp-1.0.2/internal/testconn/000077500000000000000000000000001454613650200224035ustar00rootroot00000000000000golang-github-azure-go-amqp-1.0.2/internal/testconn/recorder.go000066400000000000000000000006751454613650200245470ustar00rootroot00000000000000package testconn import ( "io" "net" ) type Recorder struct { net.Conn w io.WriteCloser } func NewRecorder(w io.WriteCloser, conn net.Conn) Recorder { return Recorder{ Conn: conn, w: w, } } func (r Recorder) Read(b []byte) (int, error) { n, err := r.Conn.Read(b) _, _ = r.w.Write(b[:n]) _, _ = r.w.Write([]byte("SPLIT\n")) return n, err } func (r Recorder) Close() error { err := r.Conn.Close() r.w.Close() return err } golang-github-azure-go-amqp-1.0.2/internal/testconn/testconn.go000066400000000000000000000031421454613650200245670ustar00rootroot00000000000000package testconn import ( "bytes" "errors" "net" "time" ) func New(data []byte) *Conn { c := &Conn{ data: bytes.Split(data, []byte("SPLIT\n")), done: make(chan struct{}), err: make(chan error, 1), } return c } type Conn struct { data [][]byte // data []byte done chan struct{} err chan error readDeadline *time.Timer } func (c *Conn) Read(b []byte) (int, error) { if len(c.data) == 0 { select { case <-c.done: return 0, errors.New("connection closed") case err := <-c.err: return 0, err } } time.Sleep(1 * time.Millisecond) n := copy(b, c.data[0]) // only move on to the next chunk if this one was entirely consumed if n == len(c.data[0]) { c.data = c.data[1:] } else { c.data[0] = c.data[0][n:] } return n, nil } func (c *Conn) Write(b []byte) (n int, err error) { return len(b), nil } func (c *Conn) Close() error { close(c.done) return nil } func (c *Conn) LocalAddr() net.Addr { return &net.TCPAddr{ IP: net.IP{127, 0, 0, 1}, Port: 49706, } } func (c *Conn) RemoteAddr() net.Addr { return &net.TCPAddr{ IP: net.IP{127, 0, 0, 1}, Port: 49706, } } func (c *Conn) SetDeadline(t time.Time) error { return c.SetReadDeadline(t) } func (c *Conn) SetReadDeadline(t time.Time) error { if c.readDeadline != nil { c.readDeadline.Stop() } if t.IsZero() { return nil } c.readDeadline = time.AfterFunc(time.Until(t), func() { select { case c.err <- errors.New("timeout"): case <-c.done: default: } }) return nil } func (c *Conn) SetWriteDeadline(t time.Time) error { return errors.New("testconn.SetWriteDeadline NYI") } golang-github-azure-go-amqp-1.0.2/link.go000066400000000000000000000316271454613650200202270ustar00rootroot00000000000000package amqp import ( "context" "errors" "fmt" "sync" "github.com/Azure/go-amqp/internal/debug" "github.com/Azure/go-amqp/internal/encoding" "github.com/Azure/go-amqp/internal/frames" "github.com/Azure/go-amqp/internal/queue" "github.com/Azure/go-amqp/internal/shared" ) // linkKey uniquely identifies a link on a connection by name and direction. // // A link can be identified uniquely by the ordered tuple // // (source-container-id, target-container-id, name) // // On a single connection the container ID pairs can be abbreviated // to a boolean flag indicating the direction of the link. type linkKey struct { name string role encoding.Role // Local role: sender/receiver } // link contains the common state and methods for sending and receiving links type link struct { key linkKey // Name and direction // NOTE: outputHandle and inputHandle might not have the same value // our handle outputHandle uint32 // remote's handle inputHandle uint32 // frames destined for this link are added to this queue by Session.muxFrameToLink rxQ *queue.Holder[frames.FrameBody] // used for gracefully closing link close chan struct{} // signals a link's mux to shut down; DO NOT use this to check if a link has terminated, use done instead closeOnce *sync.Once // closeOnce protects close from being closed multiple times done chan struct{} // closed when the link has terminated (mux exited); DO NOT wait on this from within a link's mux() as it will never trigger! doneErr error // contains the mux error state; ONLY written to by the mux and MUST only be read from after done is closed! closeErr error // contains the error state returned from closeLink(); ONLY closeLink() reads/writes this! session *Session // parent session source *frames.Source // used for Receiver links target *frames.Target // used for Sender links properties map[encoding.Symbol]any // additional properties sent upon link attach // "The delivery-count is initialized by the sender when a link endpoint is created, // and is incremented whenever a message is sent. Only the sender MAY independently // modify this field. The receiver's value is calculated based on the last known // value from the sender and any subsequent messages received on the link. Note that, // despite its name, the delivery-count is not a count but a sequence number // initialized at an arbitrary point by the sender." deliveryCount uint32 // The current maximum number of messages that can be handled at the receiver endpoint of the link. Only the receiver endpoint // can independently set this value. The sender endpoint sets this to the last known value seen from the receiver. linkCredit uint32 senderSettleMode *SenderSettleMode receiverSettleMode *ReceiverSettleMode maxMessageSize uint64 closeInProgress bool // indicates that the detach performative has been sent dynamicAddr bool // request a dynamic link address from the server } func newLink(s *Session, r encoding.Role) link { l := link{ key: linkKey{shared.RandString(40), r}, session: s, close: make(chan struct{}), closeOnce: &sync.Once{}, done: make(chan struct{}), } // set the segment size relative to respective window var segmentSize int if r == encoding.RoleReceiver { segmentSize = int(s.incomingWindow) } else { segmentSize = int(s.outgoingWindow) } l.rxQ = queue.NewHolder(queue.New[frames.FrameBody](segmentSize)) return l } // waitForFrame waits for an incoming frame to be queued. // it returns the next frame from the queue, or an error. // the error is either from the context or session.doneErr. // not meant for consumption outside of link.go. func (l *link) waitForFrame(ctx context.Context) (frames.FrameBody, error) { select { case <-ctx.Done(): return nil, ctx.Err() case <-l.session.done: // session has terminated, no need to deallocate in this case return nil, l.session.doneErr case q := <-l.rxQ.Wait(): // frame received fr := q.Dequeue() l.rxQ.Release(q) return *fr, nil } } // attach sends the Attach performative to establish the link with its parent session. // this is automatically called by the new*Link constructors. func (l *link) attach(ctx context.Context, beforeAttach func(*frames.PerformAttach), afterAttach func(*frames.PerformAttach)) error { if err := l.session.freeAbandonedLinks(ctx); err != nil { return err } // once the abandoned links have been cleaned up we can create our link if err := l.session.allocateHandle(ctx, l); err != nil { return err } attach := &frames.PerformAttach{ Name: l.key.name, Handle: l.outputHandle, ReceiverSettleMode: l.receiverSettleMode, SenderSettleMode: l.senderSettleMode, MaxMessageSize: l.maxMessageSize, Source: l.source, Target: l.target, Properties: l.properties, } // link-specific configuration of the attach frame beforeAttach(attach) if err := l.txFrameAndWait(ctx, attach); err != nil { return err } // wait for response fr, err := l.waitForFrame(ctx) if err != nil { l.session.abandonLink(l) return err } resp, ok := fr.(*frames.PerformAttach) if !ok { debug.Log(1, "RX (link %p): unexpected attach response frame %T", l, fr) if err := l.session.conn.Close(); err != nil { return err } return &ConnError{inner: fmt.Errorf("unexpected attach response: %#v", fr)} } // If the remote encounters an error during the attach it returns an Attach // with no Source or Target. The remote then sends a Detach with an error. // // Note that if the application chooses not to create a terminus, the session // endpoint will still create a link endpoint and issue an attach indicating // that the link endpoint has no associated local terminus. In this case, the // session endpoint MUST immediately detach the newly created link endpoint. // // http://docs.oasis-open.org/amqp/core/v1.0/csprd01/amqp-core-transport-v1.0-csprd01.html#doc-idp386144 if resp.Source == nil && resp.Target == nil { // wait for detach fr, err := l.waitForFrame(ctx) if err != nil { // we timed out waiting for the peer to close the link, this really isn't an abandoned link. // however, we still need to send the detach performative to ack the peer. l.session.abandonLink(l) return err } detach, ok := fr.(*frames.PerformDetach) if !ok { if err := l.session.conn.Close(); err != nil { return err } return &ConnError{inner: fmt.Errorf("unexpected frame while waiting for detach: %#v", fr)} } // send return detach fr = &frames.PerformDetach{ Handle: l.outputHandle, Closed: true, } if err := l.txFrameAndWait(ctx, fr); err != nil { return err } if detach.Error == nil { return fmt.Errorf("received detach with no error specified") } return detach.Error } if l.maxMessageSize == 0 || resp.MaxMessageSize < l.maxMessageSize { l.maxMessageSize = resp.MaxMessageSize } // link-specific configuration post attach afterAttach(resp) if err := l.setSettleModes(resp); err != nil { // close the link as there's a mismatch on requested/supported settlement modes dr := &frames.PerformDetach{ Handle: l.outputHandle, Closed: true, } if err := l.txFrameAndWait(ctx, dr); err != nil { return err } return err } return nil } // setSettleModes sets the settlement modes based on the resp frames.PerformAttach. // // If a settlement mode has been explicitly set locally and it was not honored by the // server an error is returned. func (l *link) setSettleModes(resp *frames.PerformAttach) error { var ( localRecvSettle = receiverSettleModeValue(l.receiverSettleMode) respRecvSettle = receiverSettleModeValue(resp.ReceiverSettleMode) ) if l.receiverSettleMode != nil && localRecvSettle != respRecvSettle { return fmt.Errorf("amqp: receiver settlement mode %q requested, received %q from server", l.receiverSettleMode, &respRecvSettle) } l.receiverSettleMode = &respRecvSettle var ( localSendSettle = senderSettleModeValue(l.senderSettleMode) respSendSettle = senderSettleModeValue(resp.SenderSettleMode) ) if l.senderSettleMode != nil && localSendSettle != respSendSettle { return fmt.Errorf("amqp: sender settlement mode %q requested, received %q from server", l.senderSettleMode, &respSendSettle) } l.senderSettleMode = &respSendSettle return nil } // muxHandleFrame processes fr based on type. func (l *link) muxHandleFrame(fr frames.FrameBody) error { switch fr := fr.(type) { case *frames.PerformDetach: if !fr.Closed { l.closeWithError(ErrCondNotImplemented, fmt.Sprintf("non-closing detach not supported: %+v", fr)) return nil } // there are two possibilities: // - this is the ack to a client-side Close() // - the peer is closing the link so we must ack if l.closeInProgress { // if the client-side close was initiated due to an error (l.closeWithError) // then l.doneErr will already be set. in this case, return that error instead // of an empty LinkError which indicates a clean client-side close. if l.doneErr != nil { return l.doneErr } return &LinkError{} } dr := &frames.PerformDetach{ Handle: l.outputHandle, Closed: true, } l.txFrame(&frameContext{Ctx: context.Background()}, dr) return &LinkError{RemoteErr: fr.Error} default: debug.Log(1, "RX (link %p): unexpected frame: %s", l, fr) l.closeWithError(ErrCondInternalError, fmt.Sprintf("link received unexpected frame %T", fr)) return nil } } // Close closes the Sender and AMQP link. func (l *link) closeLink(ctx context.Context) error { var ctxErr error l.closeOnce.Do(func() { close(l.close) // once the mux has received the ack'ing detach performative, the mux will // exit which deletes the link and closes l.done. select { case <-l.done: l.closeErr = l.doneErr case <-ctx.Done(): // notify the caller that the close timed out/was cancelled. // the mux will remain running and once the ack is received it will terminate. ctxErr = ctx.Err() // record that the close timed out/was cancelled. // subsequent calls to closeLink() will return this debug.Log(1, "TX (link %p) closing %s: %v", l, l.key.name, ctxErr) l.closeErr = &LinkError{inner: ctxErr} } }) if ctxErr != nil { return ctxErr } var linkErr *LinkError if errors.As(l.closeErr, &linkErr) && linkErr.RemoteErr == nil && linkErr.inner == nil { // an empty LinkError means the link was cleanly closed by the caller return nil } return l.closeErr } // closeWithError initiates closing the link with the specified AMQP error. // the mux must continue to run until the ack'ing detach is received. // l.doneErr is populated with a &LinkError{} containing an inner error constructed from the specified values // - cnd is the AMQP error condition // - desc is the error description func (l *link) closeWithError(cnd ErrCond, desc string) { amqpErr := &Error{Condition: cnd, Description: desc} if l.closeInProgress { debug.Log(3, "TX (link %p) close error already pending, discarding %v", l, amqpErr) return } dr := &frames.PerformDetach{ Handle: l.outputHandle, Closed: true, Error: amqpErr, } l.closeInProgress = true l.doneErr = &LinkError{inner: fmt.Errorf("%s: %s", cnd, desc)} l.txFrame(&frameContext{Ctx: context.Background()}, dr) } // txFrame sends the specified frame via the link's session. // you MUST call this instead of session.txFrame() to ensure // that frames are not sent during session shutdown. func (l *link) txFrame(frameCtx *frameContext, fr frames.FrameBody) { // NOTE: there is no need to select on l.done as this is either // called from a link's mux or before the mux has even started. select { case <-l.session.done: // the link's session has terminated, let that propagate to the link's mux case <-l.session.endSent: // we swallow this to prevent the link's mux from terminating. // l.session.done will soon close so this is temporary. case l.session.tx <- frameBodyEnvelope{FrameCtx: frameCtx, FrameBody: fr}: debug.Log(2, "TX (link %p): mux frame to Session (%p): %s", l, l.session, fr) } } // txFrame sends the specified frame via the link's session. // you MUST call this instead of session.txFrame() to ensure // that frames are not sent during session shutdown. func (l *link) txFrameAndWait(ctx context.Context, fr frames.FrameBody) error { frameCtx := frameContext{ Ctx: ctx, Done: make(chan struct{}), } // NOTE: there is no need to select on l.done as this is either // called from a link's mux or before the mux has even started. select { case <-l.session.done: return l.session.doneErr case <-l.session.endSent: // we swallow this to prevent the link's mux from terminating. // l.session.done will soon close so this is temporary. return nil case l.session.tx <- frameBodyEnvelope{FrameCtx: &frameCtx, FrameBody: fr}: debug.Log(2, "TX (link %p): mux frame to Session (%p): %s", l, l.session, fr) } select { case <-frameCtx.Done: return frameCtx.Err case <-l.session.done: return l.session.doneErr } } golang-github-azure-go-amqp-1.0.2/link_options.go000066400000000000000000000170431454613650200217760ustar00rootroot00000000000000package amqp import ( "github.com/Azure/go-amqp/internal/encoding" ) type SenderOptions struct { // Capabilities is the list of extension capabilities the sender supports. Capabilities []string // Durability indicates what state of the sender will be retained durably. // // Default: DurabilityNone. Durability Durability // DynamicAddress indicates a dynamic address is to be used. // Any specified address will be ignored. // // Default: false. DynamicAddress bool // ExpiryPolicy determines when the expiry timer of the sender starts counting // down from the timeout value. If the link is subsequently re-attached before // the timeout is reached, the count down is aborted. // // Default: ExpirySessionEnd. ExpiryPolicy ExpiryPolicy // ExpiryTimeout is the duration in seconds that the sender will be retained. // // Default: 0. ExpiryTimeout uint32 // Name sets the name of the link. // // Link names must be unique per-connection and direction. // // Default: randomly generated. Name string // Properties sets an entry in the link properties map sent to the server. Properties map[string]any // RequestedReceiverSettleMode sets the requested receiver settlement mode. // // If a settlement mode is explicitly set and the server does not // honor it an error will be returned during link attachment. // // Default: Accept the settlement mode set by the server, commonly ModeFirst. RequestedReceiverSettleMode *ReceiverSettleMode // SettlementMode sets the settlement mode in use by this sender. // // Default: ModeMixed. SettlementMode *SenderSettleMode // SourceAddress specifies the source address for this sender. SourceAddress string // TargetCapabilities is the list of extension capabilities the sender desires. TargetCapabilities []string // TargetDurability indicates what state of the peer will be retained durably. // // Default: DurabilityNone. TargetDurability Durability // TargetExpiryPolicy determines when the expiry timer of the peer starts counting // down from the timeout value. If the link is subsequently re-attached before // the timeout is reached, the count down is aborted. // // Default: ExpirySessionEnd. TargetExpiryPolicy ExpiryPolicy // TargetExpiryTimeout is the duration in seconds that the peer will be retained. // // Default: 0. TargetExpiryTimeout uint32 } type ReceiverOptions struct { // Capabilities is the list of extension capabilities the receiver supports. Capabilities []string // Credit specifies the maximum number of unacknowledged messages // the sender can transmit. Once this limit is reached, no more messages // will arrive until messages are acknowledged and settled. // // As messages are settled, any available credit will automatically be issued. // // Setting this to -1 requires manual management of link credit. // Credits can be added with IssueCredit(), and links can also be // drained with DrainCredit(). // This should only be enabled when complete control of the link's // flow control is required. // // Default: 1. Credit int32 // Durability indicates what state of the receiver will be retained durably. // // Default: DurabilityNone. Durability Durability // DynamicAddress indicates a dynamic address is to be used. // Any specified address will be ignored. // // Default: false. DynamicAddress bool // ExpiryPolicy determines when the expiry timer of the sender starts counting // down from the timeout value. If the link is subsequently re-attached before // the timeout is reached, the count down is aborted. // // Default: ExpirySessionEnd. ExpiryPolicy ExpiryPolicy // ExpiryTimeout is the duration in seconds that the sender will be retained. // // Default: 0. ExpiryTimeout uint32 // Filters contains the desired filters for this receiver. // If the peer cannot fulfill the filters the link will be detached. Filters []LinkFilter // MaxMessageSize sets the maximum message size that can // be received on the link. // // A size of zero indicates no limit. // // Default: 0. MaxMessageSize uint64 // Name sets the name of the link. // // Link names must be unique per-connection and direction. // // Default: randomly generated. Name string // Properties sets an entry in the link properties map sent to the server. Properties map[string]any // RequestedSenderSettleMode sets the requested sender settlement mode. // // If a settlement mode is explicitly set and the server does not // honor it an error will be returned during link attachment. // // Default: Accept the settlement mode set by the server, commonly ModeMixed. RequestedSenderSettleMode *SenderSettleMode // SettlementMode sets the settlement mode in use by this receiver. // // Default: ModeFirst. SettlementMode *ReceiverSettleMode // TargetAddress specifies the target address for this receiver. TargetAddress string // SourceCapabilities is the list of extension capabilities the receiver desires. SourceCapabilities []string // SourceDurability indicates what state of the peer will be retained durably. // // Default: DurabilityNone. SourceDurability Durability // SourceExpiryPolicy determines when the expiry timer of the peer starts counting // down from the timeout value. If the link is subsequently re-attached before // the timeout is reached, the count down is aborted. // // Default: ExpirySessionEnd. SourceExpiryPolicy ExpiryPolicy // SourceExpiryTimeout is the duration in seconds that the peer will be retained. // // Default: 0. SourceExpiryTimeout uint32 } // LinkFilter is an advanced API for setting non-standard source filters. // Please file an issue or open a PR if a standard filter is missing from this // library. // // The name is the key for the filter map. It will be encoded as an AMQP symbol type. // // The code is the descriptor of the described type value. The domain-id and descriptor-id // should be concatenated together. If 0 is passed as the code, the name will be used as // the descriptor. // // The value is the value of the descriped types. Acceptable types for value are specific // to the filter. // // Example: // // The standard selector-filter is defined as: // // // // In this case the name is "apache.org:selector-filter:string" and the code is // 0x0000468C00000004. // // LinkSourceFilter("apache.org:selector-filter:string", 0x0000468C00000004, exampleValue) // // References: // // http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-messaging-v1.0-os.html#type-filter-set // http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-types-v1.0-os.html#section-descriptor-values type LinkFilter func(encoding.Filter) // NewLinkFilter creates a new LinkFilter with the specified values. // Any preexisting link filter with the same name will be updated with the new code and value. func NewLinkFilter(name string, code uint64, value any) LinkFilter { return func(f encoding.Filter) { var descriptor any if code != 0 { descriptor = code } else { descriptor = encoding.Symbol(name) } f[encoding.Symbol(name)] = &encoding.DescribedType{ Descriptor: descriptor, Value: value, } } } // NewSelectorFilter creates a new selector filter (apache.org:selector-filter:string) with the specified filter value. // Any preexisting selector filter will be updated with the new filter value. func NewSelectorFilter(filter string) LinkFilter { return NewLinkFilter(selectorFilter, selectorFilterCode, filter) } const ( selectorFilter = "apache.org:selector-filter:string" selectorFilterCode = uint64(0x0000468C00000004) ) golang-github-azure-go-amqp-1.0.2/link_test.go000066400000000000000000000306361454613650200212650ustar00rootroot00000000000000package amqp import ( "context" "fmt" "testing" "time" "github.com/Azure/go-amqp/internal/bitmap" "github.com/Azure/go-amqp/internal/encoding" "github.com/Azure/go-amqp/internal/fake" "github.com/Azure/go-amqp/internal/frames" "github.com/Azure/go-amqp/internal/queue" "github.com/Azure/go-amqp/internal/test" "github.com/stretchr/testify/require" ) func TestLinkFlowThatNeedsToReplenishCredits(t *testing.T) { for times := 0; times < 100; times++ { l := newTestLink(t) l.l.linkCredit = 2 waitForCredit := make(chan struct{}) go l.mux(receiverTestHooks{ MuxStart: func() { <-waitForCredit }, }) err := l.IssueCredit(1) require.Error(t, err, "issueCredit can only be used with receiver links using manual credit management") // we've consumed half of the maximum credit we're allowed to have - reflow! l.l.linkCredit = 1 l.unsettledMessages = map[string]struct{}{} close(waitForCredit) l.onSettlement(1) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) Loop: for { // the first flow frame we receive isn't always the one with the updated credit. // to avoid the race, we continue to receive frames until we get the flow frame // with the correct value, a wrong frame, or the context expires. select { case txFrame := <-l.l.session.tx: switch frame := txFrame.FrameBody.(type) { case *frames.PerformFlow: require.False(t, frame.Drain) // replenished credits: l.receiver.maxCredit-uint32(l.countUnsettled()) if *frame.LinkCredit == 2 { break Loop } default: require.Fail(t, fmt.Sprintf("Unexpected frame was transferred: %+v", txFrame)) } case <-ctx.Done(): t.Fatal(ctx.Err()) } } cancel() closeTestLink(&l.l) <-l.l.done } } func TestLinkFlowWithZeroCredits(t *testing.T) { l := newTestLink(t) muxSem := test.NewMuxSemaphore(0) go l.mux(receiverTestHooks{ MuxSelect: func() { muxSem.OnLoop() }, }) defer closeTestLink(&l.l) err := l.IssueCredit(1) require.Error(t, err, "issueCredit can only be used with receiver links using manual credit management") muxSem.Wait() // and flow goes through the non-manual credit path require.EqualValues(t, 0, l.l.linkCredit, "No link credits have been added") l.l.linkCredit = 0 l.unsettledMessages = map[string]struct{}{ "hello": {}, "hello2": {}, } muxSem.Release(0) select { case l.receiverReady <- struct{}{}: // woke up mux default: t.Fatal("failed to wake up mux") } muxSem.Wait() require.Zero(t, l.l.linkCredit) muxSem.Release(-1) } func TestLinkFlowWithManualCreditor(t *testing.T) { l := newTestLink(t) l.autoSendFlow = false l.l.linkCredit = 1 go l.mux(receiverTestHooks{}) defer closeTestLink(&l.l) require.NoError(t, l.IssueCredit(100)) // flow happens immmediately in 'mux' txFrame := <-l.l.session.tx switch frame := txFrame.FrameBody.(type) { case *frames.PerformFlow: require.False(t, frame.Drain) require.EqualValues(t, 100+1, *frame.LinkCredit) default: require.Fail(t, fmt.Sprintf("Unexpected frame was transferred: %+v", txFrame)) } } func TestLinkFlowWithManualCreditorAndNoFlowNeeded(t *testing.T) { l := newTestLink(t) l.autoSendFlow = false l.l.linkCredit = 1 go l.mux(receiverTestHooks{}) defer closeTestLink(&l.l) select { case l.receiverReady <- struct{}{}: // woke up mux default: t.Fatal("failed to wake up mux") } // flow happens immmediately in 'mux' select { case fr := <-l.l.session.tx: // there won't be a flow this time. require.Failf(t, "No flow frame would be needed since no link credits were added and drain was not requested", "Frame was %+v", fr) case <-time.After(time.Second * 2): // this is the expected case since no frame will be sent. } } func TestMuxFlowHandlesDrainProperly(t *testing.T) { l := newTestLink(t) l.autoSendFlow = false l.l.linkCredit = 101 // simulate what our 'drain' call to muxFlow would look like // when draining require.NoError(t, l.muxFlow(0, true)) require.EqualValues(t, 101, l.l.linkCredit, "credits are untouched when draining") // when doing a non-drain flow we update the linkCredit to our new link credit total. require.NoError(t, l.muxFlow(501, false)) require.EqualValues(t, 501, l.l.linkCredit, "credits are untouched when draining") } func newTestLink(t *testing.T) *Receiver { fakeConn := fake.NewNetConn(receiverFrameHandlerNoUnhandled(0, ReceiverSettleModeFirst)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) conn, err := NewConn(ctx, fakeConn, nil) require.NoError(t, err) cancel() // we don't need a functioning Conn for tests that use newTestLink, just a non-nil one that can be Close()'ed // TODO: convert these tests to use a fake err = conn.Close() require.NoError(t, err) l := &Receiver{ l: link{ source: &frames.Source{}, // adding just enough so the debug() print will still work... // debug(1, "FLOW Link Mux half: source: %s, inflight: %d, credit: %d, deliveryCount: %d, messages: %d, unsettled: %d, maxCredit : %d, settleMode: %s", l.source.Address, l.receiver.inFlight.len(), l.l.linkCredit, l.deliveryCount, len(l.messages), l.countUnsettled(), l.receiver.maxCredit, l.receiverSettleMode.String()) done: make(chan struct{}), session: &Session{ tx: make(chan frameBodyEnvelope, 100), done: make(chan struct{}), conn: conn, outputHandles: bitmap.New(32), }, rxQ: queue.NewHolder(queue.New[frames.FrameBody](100)), close: make(chan struct{}), }, autoSendFlow: true, inFlight: inFlight{}, receiverReady: make(chan struct{}, 1), } l.messagesQ = queue.NewHolder(queue.New[Message](100)) return l } func closeTestLink(l *link) { close(l.close) q := l.rxQ.Acquire() q.Enqueue(&frames.PerformDetach{Handle: l.outputHandle, Closed: true}) l.rxQ.Release(q) } func TestNewSendingLink(t *testing.T) { const ( name = "mysender" targetAddr = "target" ) tests := []struct { label string opts SenderOptions validate func(t *testing.T, l *Sender) }{ { label: "default options", validate: func(t *testing.T, l *Sender) { require.Empty(t, l.l.target.Capabilities) require.Equal(t, DurabilityNone, l.l.source.Durable) require.False(t, l.l.dynamicAddr) require.Empty(t, l.l.source.ExpiryPolicy) require.Zero(t, l.l.source.Timeout) require.NotEmpty(t, l.l.key.name) require.Empty(t, l.l.properties) require.Nil(t, l.l.senderSettleMode) require.Nil(t, l.l.receiverSettleMode) require.Equal(t, targetAddr, l.l.target.Address) }, }, { label: "with options", opts: SenderOptions{ Capabilities: []string{"foo", "bar"}, Durability: DurabilityUnsettledState, DynamicAddress: true, ExpiryPolicy: ExpiryPolicyLinkDetach, ExpiryTimeout: 5, Name: name, Properties: map[string]any{ "property": 123, }, RequestedReceiverSettleMode: ReceiverSettleModeFirst.Ptr(), SettlementMode: SenderSettleModeSettled.Ptr(), }, validate: func(t *testing.T, l *Sender) { require.Equal(t, encoding.MultiSymbol{"foo", "bar"}, l.l.source.Capabilities) require.Equal(t, DurabilityUnsettledState, l.l.source.Durable) require.True(t, l.l.dynamicAddr) require.Equal(t, ExpiryPolicyLinkDetach, l.l.source.ExpiryPolicy) require.Equal(t, uint32(5), l.l.source.Timeout) require.Equal(t, name, l.l.key.name) require.Equal(t, map[encoding.Symbol]any{ "property": 123, }, l.l.properties) require.NotNil(t, l.l.senderSettleMode) require.Equal(t, SenderSettleModeSettled, *l.l.senderSettleMode) require.NotNil(t, l.l.receiverSettleMode) require.Equal(t, ReceiverSettleModeFirst, *l.l.receiverSettleMode) require.Empty(t, l.l.target.Address) }, }, } for _, tt := range tests { t.Run(tt.label, func(t *testing.T) { got, err := newSender(targetAddr, &Session{}, &tt.opts) require.NoError(t, err) require.NotNil(t, got) tt.validate(t, got) }) } } func TestNewReceivingLink(t *testing.T) { const ( name = "myreceiver" sourceAddr = "source" ) // skip validating any fields on l.receiver as they are // populated in Session.NewReceiver() tests := []struct { label string opts ReceiverOptions validate func(t *testing.T, l *Receiver) wantSource *frames.Source wantTarget *frames.Target wantProperties map[encoding.Symbol]any }{ { label: "default options", validate: func(t *testing.T, l *Receiver) { //require.False(t, l.receiver.batching) //require.Equal(t, defaultLinkBatchMaxAge, l.receiver.batchMaxAge) require.Empty(t, l.l.target.Capabilities) //require.Equal(t, defaultLinkCredit, l.receiver.maxCredit) require.Equal(t, DurabilityNone, l.l.target.Durable) require.False(t, l.l.dynamicAddr) require.Empty(t, l.l.target.ExpiryPolicy) require.Zero(t, l.l.target.Timeout) require.Empty(t, l.l.source.Filter) //require.Nil(t, l.receiver.manualCreditor) require.Zero(t, l.l.maxMessageSize) require.NotEmpty(t, l.l.key.name) require.Empty(t, l.l.properties) require.Nil(t, l.l.senderSettleMode) require.Nil(t, l.l.receiverSettleMode) require.Equal(t, sourceAddr, l.l.source.Address) }, }, { label: "with options", opts: ReceiverOptions{ //Batching: true, //BatchMaxAge: 1 * time.Minute, Capabilities: []string{"foo", "bar"}, //Credit: 32, Durability: DurabilityConfiguration, DynamicAddress: true, ExpiryPolicy: ExpiryPolicyNever, ExpiryTimeout: 3, Filters: []LinkFilter{ NewSelectorFilter("amqp.annotation.x-opt-offset > '100'"), NewLinkFilter("com.microsoft:session-filter", 0x00000137000000C, "123"), }, //ManualCredits: true, MaxMessageSize: 1024, Name: name, Properties: map[string]any{ "property": 123, }, RequestedSenderSettleMode: SenderSettleModeMixed.Ptr(), SettlementMode: ReceiverSettleModeSecond.Ptr(), }, validate: func(t *testing.T, l *Receiver) { //require.True(t, l.receiver.batching) //require.Equal(t, 1*time.Minute, l.receiver.batchMaxAge) require.Equal(t, encoding.MultiSymbol{"foo", "bar"}, l.l.target.Capabilities) //require.Equal(t, uint32(32), l.receiver.maxCredit) require.Equal(t, DurabilityConfiguration, l.l.target.Durable) require.True(t, l.l.dynamicAddr) require.Equal(t, ExpiryPolicyNever, l.l.target.ExpiryPolicy) require.Equal(t, uint32(3), l.l.target.Timeout) require.Equal(t, encoding.Filter{ selectorFilter: &encoding.DescribedType{ Descriptor: selectorFilterCode, Value: "amqp.annotation.x-opt-offset > '100'", }, "com.microsoft:session-filter": &encoding.DescribedType{ Descriptor: uint64(0x00000137000000C), Value: "123", }, }, l.l.source.Filter) //require.NotNil(t, l.receiver.manualCreditor) require.Equal(t, uint64(1024), l.l.maxMessageSize) require.Equal(t, name, l.l.key.name) require.Equal(t, map[encoding.Symbol]any{ "property": 123, }, l.l.properties) require.NotNil(t, l.l.senderSettleMode) require.Equal(t, SenderSettleModeMixed, *l.l.senderSettleMode) require.NotNil(t, l.l.receiverSettleMode) require.Equal(t, ReceiverSettleModeSecond, *l.l.receiverSettleMode) require.Empty(t, l.l.source.Address) }, }, } for _, tt := range tests { t.Run(tt.label, func(t *testing.T) { got, err := newReceiver(sourceAddr, &Session{}, &tt.opts) require.NoError(t, err) require.NotNil(t, got) tt.validate(t, got) }) } } func TestSessionFlowDisablesTransfer(t *testing.T) { t.Skip("TODO: finish for link testing") nextIncomingID := uint32(0) netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) b, err := fake.EncodeFrame(frames.TypeAMQP, 0, &frames.PerformFlow{ NextIncomingID: &nextIncomingID, IncomingWindow: 0, OutgoingWindow: 100, NextOutgoingID: 1, }) require.NoError(t, err) netConn.SendFrame(b) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = session.Close(ctx) cancel() require.NoError(t, err) require.NoError(t, client.Close()) } // TODO: echo flow frame golang-github-azure-go-amqp-1.0.2/marshal_test.go000066400000000000000000000441141454613650200217530ustar00rootroot00000000000000package amqp import ( "encoding/binary" "fmt" "math" "os" "path/filepath" "reflect" "strings" "testing" "time" "github.com/Azure/go-amqp/internal/buffer" "github.com/Azure/go-amqp/internal/encoding" "github.com/Azure/go-amqp/internal/frames" "github.com/Azure/go-amqp/internal/test" ) var exampleFrames = []struct { label string frame frames.Frame }{ { label: "transfer", frame: frames.Frame{ Type: frames.TypeAMQP, Channel: 10, Body: &frames.PerformTransfer{ Handle: 34983, DeliveryID: uint32Ptr(564), DeliveryTag: []byte("foo tag"), MessageFormat: uint32Ptr(34), Settled: true, More: true, ReceiverSettleMode: rcvSettle(ReceiverSettleModeSecond), State: &encoding.StateReceived{}, Resume: true, Aborted: true, Batchable: true, Payload: []byte("very important payload"), }, }, }, } func TestFrameMarshalUnmarshal(t *testing.T) { for _, tt := range exampleFrames { t.Run(tt.label, func(t *testing.T) { var buf buffer.Buffer err := frames.Write(&buf, tt.frame) if err != nil { t.Fatalf("%+v", err) } header, err := frames.ParseHeader(&buf) if err != nil { t.Fatalf("%+v", err) } want := tt.frame if header.Channel != want.Channel { t.Errorf("Expected channel to be %d, but it is %d", want.Channel, header.Channel) } if header.FrameType != uint8(want.Type) { t.Errorf("Expected channel to be %d, but it is %d", want.Type, header.FrameType) } payload, err := frames.ParseBody(&buf) if err != nil { t.Fatalf("%+v", err) } if !test.Equal(want.Body, payload) { t.Errorf("Roundtrip produced different results:\n %s", test.Diff(want.Body, payload)) } }) } } func BenchmarkFrameMarshal(b *testing.B) { for _, tt := range exampleFrames { b.Run(tt.label, func(b *testing.B) { b.ReportAllocs() var buf buffer.Buffer for i := 0; i < b.N; i++ { err := frames.Write(&buf, tt.frame) if err != nil { b.Errorf("%+v", err) } bytesSink = buf.Bytes() buf.Reset() } }) } } func BenchmarkFrameUnmarshal(b *testing.B) { for _, tt := range exampleFrames { b.Run(tt.label, func(b *testing.B) { b.ReportAllocs() var buf buffer.Buffer err := frames.Write(&buf, tt.frame) if err != nil { b.Errorf("%+v", err) } data := buf.Bytes() buf.Reset() b.ResetTimer() b.ReportAllocs() for i := 0; i < b.N; i++ { buf := buffer.New(data) _, err := frames.ParseHeader(buf) if err != nil { b.Errorf("%+v", err) } _, err = frames.ParseBody(buf) if err != nil { b.Errorf("%+v", err) } } }) } } var bytesSink []byte func BenchmarkMarshal(b *testing.B) { for _, typ := range allTypes { b.Run(fmt.Sprintf("%T", typ), func(b *testing.B) { b.ReportAllocs() var buf buffer.Buffer for i := 0; i < b.N; i++ { err := encoding.Marshal(&buf, typ) if err != nil { b.Errorf("%+v", err) } bytesSink = buf.Bytes() buf.Reset() } }) } } func BenchmarkUnmarshal(b *testing.B) { for _, type_ := range allTypes { if type_ == nil { continue } b.Run(fmt.Sprintf("%T", type_), func(b *testing.B) { var buf buffer.Buffer err := encoding.Marshal(&buf, type_) if err != nil { b.Errorf("%+v", err) } data := buf.Bytes() newType := reflect.New(reflect.TypeOf(type_)).Interface() b.ResetTimer() b.ReportAllocs() for i := 0; i < b.N; i++ { err = encoding.Unmarshal(buffer.New(data), newType) if err != nil { b.Errorf("%v", err) } } }) } } func TestMarshalUnmarshal(t *testing.T) { _, updateFuzzCorpus := os.LookupEnv("UPDATE_FUZZ_CORPUS") for _, type_ := range allTypes { t.Run(fmt.Sprintf("%T", type_), func(t *testing.T) { var buf buffer.Buffer err := encoding.Marshal(&buf, type_) if err != nil { t.Fatalf("%+v", err) } if updateFuzzCorpus { name := fmt.Sprintf("%T.bin", type_) name = strings.TrimPrefix(name, "amqp.") name = strings.TrimPrefix(name, "*amqp.") path := filepath.Join("fuzz/marshal/corpus", name) err = os.WriteFile(path, buf.Bytes(), 0644) if err != nil { t.Error(err) } } // handle special case around nil type if type_ == nil { err = encoding.Unmarshal(&buf, nil) if err != nil { t.Fatalf("%+v", err) return } return } newType := reflect.New(reflect.TypeOf(type_)) err = encoding.Unmarshal(&buf, newType.Interface()) if err != nil { t.Fatalf("%+v", err) return } cmpType := reflect.Indirect(newType).Interface() if !test.Equal(type_, cmpType) { t.Errorf("Roundtrip produced different results:\n %s", test.Diff(type_, cmpType)) } }) } } // Regression test for time calculation bug. // https://github.com/vcabbage/amqp/issues/173 func TestIssue173(t *testing.T) { var buf buffer.Buffer // NOTE: Dates after the Unix Epoch don't trigger the bug, only // dates that negative Unix time show the problem. want := time.Date(1969, 03, 21, 0, 0, 0, 0, time.UTC) err := encoding.Marshal(&buf, want) if err != nil { t.Fatal(err) } var got time.Time err = encoding.Unmarshal(&buf, &got) if err != nil { t.Fatal(err) } if d := test.Diff(want, got); d != "" { t.Fatal(d) } } func TestReadAny(t *testing.T) { for _, type_ := range generalTypes { t.Run(fmt.Sprintf("%T", type_), func(t *testing.T) { var buf buffer.Buffer err := encoding.Marshal(&buf, type_) if err != nil { t.Errorf("%+v", err) } got, err := encoding.ReadAny(&buf) if err != nil { t.Fatalf("%+v", err) } if !test.Equal(type_, got) { t.Errorf("Roundtrip produced different results:\n %s", test.Diff(type_, got)) } }) } } var ( allTypes = append(protoTypes, generalTypes...) remoteChannel = uint16(4321) protoTypes = []any{ &frames.PerformOpen{ ContainerID: "foo", Hostname: "bar.host", MaxFrameSize: 4200, ChannelMax: 13, OutgoingLocales: []encoding.Symbol{"fooLocale"}, IncomingLocales: []encoding.Symbol{"barLocale"}, OfferedCapabilities: []encoding.Symbol{"fooCap"}, DesiredCapabilities: []encoding.Symbol{"barCap"}, Properties: map[encoding.Symbol]any{ "fooProp": int32(45), }, }, &frames.PerformBegin{ RemoteChannel: &remoteChannel, NextOutgoingID: 730000, IncomingWindow: 9876654, OutgoingWindow: 123555, HandleMax: 9757, OfferedCapabilities: []encoding.Symbol{"fooCap"}, DesiredCapabilities: []encoding.Symbol{"barCap"}, Properties: map[encoding.Symbol]any{ "fooProp": int32(45), }, }, &frames.PerformAttach{ Name: "fooName", Handle: 435982, Role: encoding.RoleSender, SenderSettleMode: sndSettle(SenderSettleModeMixed), ReceiverSettleMode: rcvSettle(ReceiverSettleModeSecond), Source: &frames.Source{ Address: "fooAddr", Durable: DurabilityUnsettledState, ExpiryPolicy: ExpiryPolicyLinkDetach, Timeout: 635, Dynamic: true, DynamicNodeProperties: map[encoding.Symbol]any{ "lifetime-policy": encoding.DeleteOnClose, }, DistributionMode: "some-mode", Filter: encoding.Filter{ "foo:filter": &encoding.DescribedType{ Descriptor: "foo:filter", Value: "bar value", }, }, Outcomes: []encoding.Symbol{"amqp:accepted:list"}, Capabilities: []encoding.Symbol{"barCap"}, }, Target: &frames.Target{ Address: "fooAddr", Durable: DurabilityUnsettledState, ExpiryPolicy: ExpiryPolicyLinkDetach, Timeout: 635, Dynamic: true, DynamicNodeProperties: map[encoding.Symbol]any{ "lifetime-policy": encoding.DeleteOnClose, }, Capabilities: []encoding.Symbol{"barCap"}, }, Unsettled: encoding.Unsettled{ "fooDeliveryTag": &encoding.StateAccepted{}, }, IncompleteUnsettled: true, InitialDeliveryCount: 3184, MaxMessageSize: 75983, OfferedCapabilities: []encoding.Symbol{"fooCap"}, DesiredCapabilities: []encoding.Symbol{"barCap"}, Properties: map[encoding.Symbol]any{ "fooProp": int32(45), }, }, encoding.Role(true), &encoding.Unsettled{ "fooDeliveryTag": &encoding.StateAccepted{}, }, &frames.Source{ Address: "fooAddr", Durable: DurabilityUnsettledState, ExpiryPolicy: ExpiryPolicyLinkDetach, Timeout: 635, Dynamic: true, DynamicNodeProperties: map[encoding.Symbol]any{ "lifetime-policy": encoding.DeleteOnClose, }, DistributionMode: "some-mode", Filter: encoding.Filter{ "foo:filter": &encoding.DescribedType{ Descriptor: "foo:filter", Value: "bar value", }, }, Outcomes: []encoding.Symbol{"amqp:accepted:list"}, Capabilities: []encoding.Symbol{"barCap"}, }, &frames.Target{ Address: "fooAddr", Durable: DurabilityUnsettledState, ExpiryPolicy: ExpiryPolicyLinkDetach, Timeout: 635, Dynamic: true, DynamicNodeProperties: map[encoding.Symbol]any{ "lifetime-policy": encoding.DeleteOnClose, }, Capabilities: []encoding.Symbol{"barCap"}, }, &frames.PerformFlow{ NextIncomingID: uint32Ptr(354), IncomingWindow: 4352, NextOutgoingID: 85324, OutgoingWindow: 24378634, Handle: uint32Ptr(341543), DeliveryCount: uint32Ptr(31341), LinkCredit: uint32Ptr(7634), Available: uint32Ptr(878321), Drain: true, Echo: true, Properties: map[encoding.Symbol]any{ "fooProp": int32(45), }, }, &frames.PerformTransfer{ Handle: 34983, DeliveryID: uint32Ptr(564), DeliveryTag: []byte("foo tag"), MessageFormat: uint32Ptr(34), Settled: true, More: true, ReceiverSettleMode: rcvSettle(ReceiverSettleModeSecond), State: &encoding.StateReceived{}, Resume: true, Aborted: true, Batchable: true, Payload: []byte("very important payload"), }, &frames.PerformDisposition{ Role: encoding.RoleSender, First: 5644444, Last: uint32Ptr(423), Settled: true, State: &encoding.StateReleased{}, Batchable: true, }, &frames.PerformDetach{ Handle: 4352, Closed: true, Error: &Error{ Condition: ErrCondNotAllowed, Description: "foo description", Info: map[string]any{ "other": "info", "and": uint16(875), }, }, }, &frames.PerformDetach{ Handle: 4352, Closed: true, Error: &Error{ Condition: ErrCondLinkRedirect, Description: "", // payload is bigger than map8 encoding size Info: map[string]any{ "hostname": "redirected.myservicebus.example.org", "network-host": "redirected.myservicebus.example.org", "port": uint32(5671), "address": "amqps://redirected.myservicebus.example.org:5671/path", }, }, }, ErrCond("the condition"), &Error{ Condition: ErrCondNotAllowed, Description: "foo description", Info: map[string]any{ "other": "info", "and": uint16(875), }, }, &frames.PerformEnd{ Error: &Error{ Condition: ErrCondNotAllowed, Description: "foo description", Info: map[string]any{ "other": "info", "and": uint16(875), }, }, }, &frames.PerformClose{ Error: &Error{ Condition: ErrCondNotAllowed, Description: "foo description", Info: map[string]any{ "other": "info", "and": uint16(875), }, }, }, &Message{ Header: &MessageHeader{ Durable: true, Priority: 234, TTL: 10 * time.Second, FirstAcquirer: true, DeliveryCount: 32, }, DeliveryAnnotations: encoding.Annotations{ int64(42): "answer", }, Annotations: encoding.Annotations{ int64(42): "answer", }, Properties: &MessageProperties{ MessageID: "yo", UserID: []byte("baz"), To: stringPtr("me"), Subject: stringPtr("sup?"), ReplyTo: stringPtr("you"), CorrelationID: uint64(34513), ContentType: stringPtr("text/plain"), ContentEncoding: stringPtr("UTF-8"), AbsoluteExpiryTime: timePtr(time.Date(2018, 01, 13, 14, 24, 07, 0, time.UTC)), CreationTime: timePtr(time.Date(2018, 01, 13, 14, 14, 07, 0, time.UTC)), GroupID: stringPtr("fooGroup"), GroupSequence: uint32Ptr(89324), ReplyToGroupID: stringPtr("barGroup"), }, ApplicationProperties: map[string]any{ "baz": "foo", }, Data: [][]byte{ []byte("A nice little data payload."), []byte("More payload."), }, Value: uint8(42), Footer: encoding.Annotations{ "hash": []uint8{0, 1, 2, 34, 5, 6, 7, 8, 9, 0}, }, }, &Message{ Header: &MessageHeader{ Durable: true, Priority: 234, TTL: 10 * time.Second, FirstAcquirer: true, DeliveryCount: 32, }, DeliveryAnnotations: encoding.Annotations{ int64(42): "answer", }, Annotations: encoding.Annotations{ int64(42): "answer", }, Properties: &MessageProperties{ MessageID: nil, UserID: nil, To: nil, Subject: nil, ReplyTo: nil, CorrelationID: nil, ContentType: nil, ContentEncoding: nil, AbsoluteExpiryTime: nil, CreationTime: nil, GroupID: nil, GroupSequence: nil, ReplyToGroupID: nil, }, ApplicationProperties: map[string]any{ "baz": "foo", }, Data: [][]byte{ []byte("A nice little data payload."), []byte("More payload."), }, Value: uint8(42), Footer: encoding.Annotations{ "hash": []uint8{0, 1, 2, 34, 5, 6, 7, 8, 9, 0}, }, }, &MessageHeader{ Durable: true, Priority: 234, TTL: 10 * time.Second, FirstAcquirer: true, DeliveryCount: 32, }, &MessageProperties{ MessageID: "yo", UserID: []byte("baz"), To: stringPtr("me"), Subject: stringPtr("sup?"), ReplyTo: stringPtr("you"), CorrelationID: uint64(34513), ContentType: stringPtr("text/plain"), ContentEncoding: stringPtr("UTF-8"), AbsoluteExpiryTime: timePtr(time.Date(2018, 01, 13, 14, 24, 07, 0, time.UTC)), CreationTime: timePtr(time.Date(2018, 01, 13, 14, 14, 07, 0, time.UTC)), GroupID: stringPtr("fooGroup"), GroupSequence: uint32Ptr(89324), ReplyToGroupID: stringPtr("barGroup"), }, &encoding.StateReceived{ SectionNumber: 234, SectionOffset: 8973, }, &encoding.StateAccepted{}, &encoding.StateRejected{ Error: &Error{ Condition: ErrCondStolen, Description: "foo description", Info: map[string]any{ "other": "info", "and": int32(uint16(875)), }, }, }, &encoding.StateReleased{}, &encoding.StateModified{ DeliveryFailed: true, UndeliverableHere: true, MessageAnnotations: encoding.Annotations{ "more": "annotations", }, }, encoding.LifetimePolicy(encoding.TypeCodeDeleteOnClose), SenderSettleMode(1), ReceiverSettleMode(1), &frames.SASLInit{ Mechanism: "FOO", InitialResponse: []byte("BAR\x00RESPONSE\x00"), Hostname: "me", }, &frames.SASLMechanisms{ Mechanisms: []encoding.Symbol{"FOO", "BAR", "BAZ"}, }, &frames.SASLChallenge{ Challenge: []byte("BAR\x00CHALLENGE\x00"), }, &frames.SASLResponse{ Response: []byte("BAR\x00RESPONSE\x00"), }, &frames.SASLOutcome{ Code: encoding.CodeSASLSysPerm, AdditionalData: []byte("here's some info for you..."), }, encoding.Milliseconds(10 * time.Second), encoding.Symbol("a symbol"), map[encoding.Symbol]any{ "hash": []uint8{0, 1, 2, 34, 5, 6, 7, 8, 9, 0}, }, } generalTypes = []any{ nil, encoding.UUID{1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16}, bool(true), int8(math.MaxInt8), int8(math.MinInt8), int16(math.MaxInt16), int16(math.MinInt16), int32(math.MaxInt32), int32(math.MinInt32), int64(math.MaxInt64), int64(math.MinInt64), uint8(math.MaxUint8), uint16(math.MaxUint16), uint32(math.MaxUint32), uint64(math.MaxUint64), float32(math.Pi), float32(-math.Pi), float32(math.NaN()), float32(-math.NaN()), float64(math.Pi), float64(-math.Pi), float64(math.NaN()), float64(-math.NaN()), encoding.DescribedType{ Descriptor: binary.BigEndian.Uint64([]byte{0x00, 0x00, 0x46, 0x8C, 0x00, 0x00, 0x00, 0x04}), Value: "amqp.annotation.x-opt-offset > '312'", }, map[any]any{ int32(-1234): []uint8{0, 1, 2, 34, 5, 6, 7, 8, 9, 0}, }, map[string]any{ "hash": []uint8{0, 1, 2, 34, 5, 6, 7, 8, 9, 0}, }, encoding.ArrayUByte{1, 2, 3, math.MaxUint8, 0}, []int8{1, 2, 3, math.MaxInt8, math.MinInt8}, []uint16{1, 2, 3, math.MaxUint16, 0}, []uint16{1, 2, 3, math.MaxInt8, 0}, []int16{1, 2, 3, math.MaxInt16, math.MinInt16}, []int16{1, 2, 3, math.MaxInt8, math.MinInt8}, []uint32{1, 2, 3, math.MaxUint32, 0}, []uint32{1, 2, 3, math.MaxUint8, 0}, []int32{1, 2, 3, math.MaxInt32, math.MinInt32}, []int32{1, 2, 3, math.MaxInt8, math.MinInt8}, []uint64{1, 2, 3, math.MaxUint64, 0}, []uint64{1, 2, 3, math.MaxUint8, 0}, []int64{1, 2, 3, math.MaxInt64, math.MinInt64}, []int64{1, 2, 3, math.MaxInt8, math.MinInt8}, []float32{math.Pi, -math.Pi, float32(math.NaN()), float32(-math.NaN())}, []float64{math.Pi, -math.Pi, math.NaN(), -math.NaN()}, []bool{true, false, true, false}, []string{"FOO", "BAR", "BAZ"}, []encoding.Symbol{"FOO", "BAR", "BAZ"}, [][]byte{[]byte("FOO"), []byte("BAR"), []byte("BAZ")}, []time.Time{time.Date(2018, 01, 27, 16, 16, 59, 0, time.UTC)}, []encoding.UUID{ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, {16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 31}, }, []any{int16(1), "hello", false}, } ) func sndSettle(m SenderSettleMode) *SenderSettleMode { return &m } func rcvSettle(m ReceiverSettleMode) *ReceiverSettleMode { return &m } func uint32Ptr(u uint32) *uint32 { return &u } func stringPtr(s string) *string { return &s } func timePtr(t time.Time) *time.Time { return &t } golang-github-azure-go-amqp-1.0.2/message.go000066400000000000000000000413111454613650200207050ustar00rootroot00000000000000package amqp import ( "fmt" "time" "github.com/Azure/go-amqp/internal/buffer" "github.com/Azure/go-amqp/internal/encoding" ) // Message is an AMQP message. type Message struct { // Message format code. // // The upper three octets of a message format code identify a particular message // format. The lowest octet indicates the version of said message format. Any // given version of a format is forwards compatible with all higher versions. Format uint32 // The DeliveryTag can be up to 32 octets of binary data. // Note that when mode one is enabled there will be no delivery tag. DeliveryTag []byte // The header section carries standard delivery details about the transfer // of a message through the AMQP network. Header *MessageHeader // If the header section is omitted the receiver MUST assume the appropriate // default values (or the meaning implied by no value being set) for the // fields within the header unless other target or node specific defaults // have otherwise been set. // The delivery-annotations section is used for delivery-specific non-standard // properties at the head of the message. Delivery annotations convey information // from the sending peer to the receiving peer. DeliveryAnnotations Annotations // If the recipient does not understand the annotation it cannot be acted upon // and its effects (such as any implied propagation) cannot be acted upon. // Annotations might be specific to one implementation, or common to multiple // implementations. The capabilities negotiated on link attach and on the source // and target SHOULD be used to establish which annotations a peer supports. A // registry of defined annotations and their meanings is maintained [AMQPDELANN]. // The symbolic key "rejected" is reserved for the use of communicating error // information regarding rejected messages. Any values associated with the // "rejected" key MUST be of type error. // // If the delivery-annotations section is omitted, it is equivalent to a // delivery-annotations section containing an empty map of annotations. // The message-annotations section is used for properties of the message which // are aimed at the infrastructure. Annotations Annotations // The message-annotations section is used for properties of the message which // are aimed at the infrastructure and SHOULD be propagated across every // delivery step. Message annotations convey information about the message. // Intermediaries MUST propagate the annotations unless the annotations are // explicitly augmented or modified (e.g., by the use of the modified outcome). // // The capabilities negotiated on link attach and on the source and target can // be used to establish which annotations a peer understands; however, in a // network of AMQP intermediaries it might not be possible to know if every // intermediary will understand the annotation. Note that for some annotations // it might not be necessary for the intermediary to understand their purpose, // i.e., they could be used purely as an attribute which can be filtered on. // // A registry of defined annotations and their meanings is maintained [AMQPMESSANN]. // // If the message-annotations section is omitted, it is equivalent to a // message-annotations section containing an empty map of annotations. // The properties section is used for a defined set of standard properties of // the message. Properties *MessageProperties // The properties section is part of the bare message; therefore, // if retransmitted by an intermediary, it MUST remain unaltered. // The application-properties section is a part of the bare message used for // structured application data. Intermediaries can use the data within this // structure for the purposes of filtering or routing. ApplicationProperties map[string]any // The keys of this map are restricted to be of type string (which excludes // the possibility of a null key) and the values are restricted to be of // simple types only, that is, excluding map, list, and array types. // NOTE: the Data, Value, and Sequence fields are mutually exclusive. // Data payloads. // A data section contains opaque binary data. Data [][]byte // Value payload. // An amqp-value section contains a single AMQP value. Value any // Sequence will contain AMQP sequence sections from the body of the message. // An amqp-sequence section contains an AMQP sequence. Sequence [][]any // The footer section is used for details about the message or delivery which // can only be calculated or evaluated once the whole bare message has been // constructed or seen (for example message hashes, HMACs, signatures and // encryption details). Footer Annotations deliveryID uint32 // used when sending disposition settled bool // whether transfer was settled by sender } // NewMessage returns a *Message with data as the first payload in the Data field. // // This constructor is intended as a helper for basic Messages with a // single data payload. It is valid to construct a Message directly for // more complex usages. // // To create a Message using the Value or Sequence fields, don't use this // constructor, create a new Message instead. func NewMessage(data []byte) *Message { return &Message{ Data: [][]byte{data}, } } // GetData returns the first []byte from the Data field // or nil if Data is empty. func (m *Message) GetData() []byte { if len(m.Data) < 1 { return nil } return m.Data[0] } // MarshalBinary encodes the message into binary form. func (m *Message) MarshalBinary() ([]byte, error) { buf := &buffer.Buffer{} err := m.Marshal(buf) return buf.Detach(), err } func (m *Message) Marshal(wr *buffer.Buffer) error { if m.Header != nil { err := m.Header.Marshal(wr) if err != nil { return err } } if m.DeliveryAnnotations != nil { encoding.WriteDescriptor(wr, encoding.TypeCodeDeliveryAnnotations) err := encoding.Marshal(wr, m.DeliveryAnnotations) if err != nil { return err } } if m.Annotations != nil { encoding.WriteDescriptor(wr, encoding.TypeCodeMessageAnnotations) err := encoding.Marshal(wr, m.Annotations) if err != nil { return err } } if m.Properties != nil { err := encoding.Marshal(wr, m.Properties) if err != nil { return err } } if m.ApplicationProperties != nil { encoding.WriteDescriptor(wr, encoding.TypeCodeApplicationProperties) err := encoding.Marshal(wr, m.ApplicationProperties) if err != nil { return err } } for _, data := range m.Data { encoding.WriteDescriptor(wr, encoding.TypeCodeApplicationData) err := encoding.WriteBinary(wr, data) if err != nil { return err } } if m.Value != nil { encoding.WriteDescriptor(wr, encoding.TypeCodeAMQPValue) err := encoding.Marshal(wr, m.Value) if err != nil { return err } } if m.Sequence != nil { // the body can basically be one of three different types (value, data or sequence). // When it's sequence it's actually _several_ sequence sections, one for each sub-array. for _, v := range m.Sequence { encoding.WriteDescriptor(wr, encoding.TypeCodeAMQPSequence) err := encoding.Marshal(wr, v) if err != nil { return err } } } if m.Footer != nil { encoding.WriteDescriptor(wr, encoding.TypeCodeFooter) err := encoding.Marshal(wr, m.Footer) if err != nil { return err } } return nil } // UnmarshalBinary decodes the message from binary form. func (m *Message) UnmarshalBinary(data []byte) error { buf := buffer.New(data) return m.Unmarshal(buf) } func (m *Message) Unmarshal(r *buffer.Buffer) error { // loop, decoding sections until bytes have been consumed for r.Len() > 0 { // determine type type_, headerLength, err := encoding.PeekMessageType(r.Bytes()) if err != nil { return err } var ( section any // section header is read from r before // unmarshaling section is set to true discardHeader = true ) switch encoding.AMQPType(type_) { case encoding.TypeCodeMessageHeader: discardHeader = false section = &m.Header case encoding.TypeCodeDeliveryAnnotations: section = &m.DeliveryAnnotations case encoding.TypeCodeMessageAnnotations: section = &m.Annotations case encoding.TypeCodeMessageProperties: discardHeader = false section = &m.Properties case encoding.TypeCodeApplicationProperties: section = &m.ApplicationProperties case encoding.TypeCodeApplicationData: r.Skip(int(headerLength)) var data []byte err = encoding.Unmarshal(r, &data) if err != nil { return err } m.Data = append(m.Data, data) continue case encoding.TypeCodeAMQPSequence: r.Skip(int(headerLength)) var data []any err = encoding.Unmarshal(r, &data) if err != nil { return err } m.Sequence = append(m.Sequence, data) continue case encoding.TypeCodeFooter: section = &m.Footer case encoding.TypeCodeAMQPValue: section = &m.Value default: return fmt.Errorf("unknown message section %#02x", type_) } if discardHeader { r.Skip(int(headerLength)) } err = encoding.Unmarshal(r, section) if err != nil { return err } } return nil } /* */ // MessageHeader carries standard delivery details about the transfer // of a message. type MessageHeader struct { Durable bool Priority uint8 TTL time.Duration // from milliseconds FirstAcquirer bool DeliveryCount uint32 } func (h *MessageHeader) Marshal(wr *buffer.Buffer) error { return encoding.MarshalComposite(wr, encoding.TypeCodeMessageHeader, []encoding.MarshalField{ {Value: &h.Durable, Omit: !h.Durable}, {Value: &h.Priority, Omit: h.Priority == 4}, {Value: (*encoding.Milliseconds)(&h.TTL), Omit: h.TTL == 0}, {Value: &h.FirstAcquirer, Omit: !h.FirstAcquirer}, {Value: &h.DeliveryCount, Omit: h.DeliveryCount == 0}, }) } func (h *MessageHeader) Unmarshal(r *buffer.Buffer) error { return encoding.UnmarshalComposite(r, encoding.TypeCodeMessageHeader, []encoding.UnmarshalField{ {Field: &h.Durable}, {Field: &h.Priority, HandleNull: func() error { h.Priority = 4; return nil }}, {Field: (*encoding.Milliseconds)(&h.TTL)}, {Field: &h.FirstAcquirer}, {Field: &h.DeliveryCount}, }...) } /* */ // MessageProperties is the defined set of properties for AMQP messages. type MessageProperties struct { // Message-id, if set, uniquely identifies a message within the message system. // The message producer is usually responsible for setting the message-id in // such a way that it is assured to be globally unique. A broker MAY discard a // message as a duplicate if the value of the message-id matches that of a // previously received message sent to the same node. // // The value is restricted to the following types // - uint64, UUID, []byte, or string MessageID any // The identity of the user responsible for producing the message. // The client sets this value, and it MAY be authenticated by intermediaries. UserID []byte // The to field identifies the node that is the intended destination of the message. // On any given transfer this might not be the node at the receiving end of the link. To *string // A common field for summary information about the message content and purpose. Subject *string // The address of the node to send replies to. ReplyTo *string // This is a client-specific id that can be used to mark or identify messages // between clients. // // The value is restricted to the following types // - uint64, UUID, []byte, or string CorrelationID any // The RFC-2046 [RFC2046] MIME type for the message's application-data section // (body). As per RFC-2046 [RFC2046] this can contain a charset parameter defining // the character encoding used: e.g., 'text/plain; charset="utf-8"'. // // For clarity, as per section 7.2.1 of RFC-2616 [RFC2616], where the content type // is unknown the content-type SHOULD NOT be set. This allows the recipient the // opportunity to determine the actual type. Where the section is known to be truly // opaque binary data, the content-type SHOULD be set to application/octet-stream. // // When using an application-data section with a section code other than data, // content-type SHOULD NOT be set. ContentType *string // The content-encoding property is used as a modifier to the content-type. // When present, its value indicates what additional content encodings have been // applied to the application-data, and thus what decoding mechanisms need to be // applied in order to obtain the media-type referenced by the content-type header // field. // // Content-encoding is primarily used to allow a document to be compressed without // losing the identity of its underlying content type. // // Content-encodings are to be interpreted as per section 3.5 of RFC 2616 [RFC2616]. // Valid content-encodings are registered at IANA [IANAHTTPPARAMS]. // // The content-encoding MUST NOT be set when the application-data section is other // than data. The binary representation of all other application-data section types // is defined completely in terms of the AMQP type system. // // Implementations MUST NOT use the identity encoding. Instead, implementations // SHOULD NOT set this property. Implementations SHOULD NOT use the compress encoding, // except as to remain compatible with messages originally sent with other protocols, // e.g. HTTP or SMTP. // // Implementations SHOULD NOT specify multiple content-encoding values except as to // be compatible with messages originally sent with other protocols, e.g. HTTP or SMTP. ContentEncoding *string // An absolute time when this message is considered to be expired. AbsoluteExpiryTime *time.Time // An absolute time when this message was created. CreationTime *time.Time // Identifies the group the message belongs to. GroupID *string // The relative position of this message within its group. // // The value is defined as a RFC-1982 sequence number GroupSequence *uint32 // This is a client-specific id that is used so that client can send replies to this // message to a specific group. ReplyToGroupID *string } func (p *MessageProperties) Marshal(wr *buffer.Buffer) error { return encoding.MarshalComposite(wr, encoding.TypeCodeMessageProperties, []encoding.MarshalField{ {Value: p.MessageID, Omit: p.MessageID == nil}, {Value: &p.UserID, Omit: len(p.UserID) == 0}, {Value: p.To, Omit: p.To == nil}, {Value: p.Subject, Omit: p.Subject == nil}, {Value: p.ReplyTo, Omit: p.ReplyTo == nil}, {Value: p.CorrelationID, Omit: p.CorrelationID == nil}, {Value: (*encoding.Symbol)(p.ContentType), Omit: p.ContentType == nil}, {Value: (*encoding.Symbol)(p.ContentEncoding), Omit: p.ContentEncoding == nil}, {Value: p.AbsoluteExpiryTime, Omit: p.AbsoluteExpiryTime == nil}, {Value: p.CreationTime, Omit: p.CreationTime == nil}, {Value: p.GroupID, Omit: p.GroupID == nil}, {Value: p.GroupSequence, Omit: p.GroupSequence == nil}, {Value: p.ReplyToGroupID, Omit: p.ReplyToGroupID == nil}, }) } func (p *MessageProperties) Unmarshal(r *buffer.Buffer) error { return encoding.UnmarshalComposite(r, encoding.TypeCodeMessageProperties, []encoding.UnmarshalField{ {Field: &p.MessageID}, {Field: &p.UserID}, {Field: &p.To}, {Field: &p.Subject}, {Field: &p.ReplyTo}, {Field: &p.CorrelationID}, {Field: &p.ContentType}, {Field: &p.ContentEncoding}, {Field: &p.AbsoluteExpiryTime}, {Field: &p.CreationTime}, {Field: &p.GroupID}, {Field: &p.GroupSequence}, {Field: &p.ReplyToGroupID}, }...) } // Annotations keys must be of type string, int, or int64. // // String keys are encoded as AMQP Symbols. type Annotations = encoding.Annotations // UUID is a 128 bit identifier as defined in RFC 4122. type UUID = encoding.UUID golang-github-azure-go-amqp-1.0.2/message_test.go000066400000000000000000000062131454613650200217460ustar00rootroot00000000000000package amqp import ( "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/stretchr/testify/require" ) var helperTo = "ActiveMQ.DLQ" var exampleEncodedMessages = []struct { label string expected Message encoded []byte }{ { label: "SwiftMQ message", expected: Message{ Format: 0, Header: &MessageHeader{ Durable: true, Priority: 4, TTL: 0, FirstAcquirer: false, DeliveryCount: 0, }, Properties: &MessageProperties{ MessageID: "7735812932138480283/1/12", To: &helperTo, }, ApplicationProperties: map[string]any{ "prop002": "v2", "prop000000003": int64(100000), "prop4": "val000004", "prop01": "val001", }, Value: `{"id":"000000000","prop4":"val000004","prop002Code":"v2","___prop000000003":10.0,"_______prop000000003":"10.0","prop0005":100,"_________prop01":"val001"}`, }, encoded: []byte{ 0, 128, 0, 0, 0, 0, 0, 0, 0, 112, 192, 7, 5, 65, 80, 4, 64, 66, 67, 0, 128, 0, 0, 0, 0, 0, 0, 0, 115, 192, 42, 3, 161, 24, 55, 55, 51, 53, 56, 49, 50, 57, 51, 50, 49, 51, 56, 52, 56, 48, 50, 56, 51, 47, 49, 47, 49, 50, 64, 161, 12, 65, 99, 116, 105, 118, 101, 77, 81, 46, 68, 76, 81, 0, 128, 0, 0, 0, 0, 0, 0, 0, 116, 193, 72, 8, 161, 6, 112, 114, 111, 112, 48, 49, 161, 6, 118, 97, 108, 48, 48, 49, 161, 7, 112, 114, 111, 112, 48, 48, 50, 161, 2, 118, 50, 161, 13, 112, 114, 111, 112, 48, 48, 48, 48, 48, 48, 48, 48, 51, 129, 0, 0, 0, 0, 0, 1, 134, 160, 161, 5, 112, 114, 111, 112, 52, 161, 9, 118, 97, 108, 48, 48, 48, 48, 48, 52, 0, 128, 0, 0, 0, 0, 0, 0, 0, 119, 161, 153, 123, 34, 105, 100, 34, 58, 34, 48, 48, 48, 48, 48, 48, 48, 48, 48, 34, 44, 34, 112, 114, 111, 112, 52, 34, 58, 34, 118, 97, 108, 48, 48, 48, 48, 48, 52, 34, 44, 34, 112, 114, 111, 112, 48, 48, 50, 67, 111, 100, 101, 34, 58, 34, 118, 50, 34, 44, 34, 95, 95, 95, 112, 114, 111, 112, 48, 48, 48, 48, 48, 48, 48, 48, 51, 34, 58, 49, 48, 46, 48, 44, 34, 95, 95, 95, 95, 95, 95, 95, 112, 114, 111, 112, 48, 48, 48, 48, 48, 48, 48, 48, 51, 34, 58, 34, 49, 48, 46, 48, 34, 44, 34, 112, 114, 111, 112, 48, 48, 48, 53, 34, 58, 49, 48, 48, 44, 34, 95, 95, 95, 95, 95, 95, 95, 95, 95, 112, 114, 111, 112, 48, 49, 34, 58, 34, 118, 97, 108, 48, 48, 49, 34, 125, }, }, } func TestMessageUnmarshaling(t *testing.T) { for _, tt := range exampleEncodedMessages { t.Run(tt.label, func(t *testing.T) { var msg Message if err := msg.UnmarshalBinary(tt.encoded); err != nil { t.Fatal("failed to decode message: ", err) } if diff := cmp.Diff(tt.expected, msg, cmpopts.IgnoreUnexported(Message{})); diff != "" { t.Fatalf("decoded message differs from expected (-expected +got): %s", diff) } }) } } func TestMessageWithSequence(t *testing.T) { m := &Message{ Sequence: [][]any{ {"hello1", "world1", 11, 12, 13}, {"hello2", "world2", 21, 22, 23}, }, } bytes, err := m.MarshalBinary() require.NoError(t, err) newM := &Message{} err = newM.UnmarshalBinary(bytes) require.NoError(t, err) require.EqualValues(t, [][]any{ {"hello1", "world1", int64(11), int64(12), int64(13)}, {"hello2", "world2", int64(21), int64(22), int64(23)}, }, newM.Sequence) } golang-github-azure-go-amqp-1.0.2/receiver.go000066400000000000000000000656341454613650200211030ustar00rootroot00000000000000package amqp import ( "bytes" "context" "errors" "fmt" "sync" "github.com/Azure/go-amqp/internal/buffer" "github.com/Azure/go-amqp/internal/debug" "github.com/Azure/go-amqp/internal/encoding" "github.com/Azure/go-amqp/internal/frames" "github.com/Azure/go-amqp/internal/queue" ) // Default link options const ( defaultLinkCredit = 1 ) // Receiver receives messages on a single AMQP link. type Receiver struct { l link // message receiving receiverReady chan struct{} // receiver sends on this when mux is paused to indicate it can handle more messages messagesQ *queue.Holder[Message] // used to send completed messages to receiver txDisposition chan frameBodyEnvelope // used to funnel disposition frames through the mux unsettledMessages map[string]struct{} // used to keep track of messages being handled downstream unsettledMessagesLock sync.RWMutex // lock to protect concurrent access to unsettledMessages msgBuf buffer.Buffer // buffered bytes for current message more bool // if true, buf contains a partial message msg Message // current message being decoded settlementCount uint32 // the count of settled messages settlementCountMu sync.Mutex // must be held when accessing settlementCount autoSendFlow bool // automatically send flow frames as credit becomes available inFlight inFlight // used to track message disposition when rcv-settle-mode == second creditor creditor // manages credits via calls to IssueCredit/DrainCredit } // IssueCredit adds credits to be requested in the next flow request. // Attempting to issue more credit than the receiver's max credit as // specified in ReceiverOptions.MaxCredit will result in an error. func (r *Receiver) IssueCredit(credit uint32) error { if r.autoSendFlow { return errors.New("issueCredit can only be used with receiver links using manual credit management") } if err := r.creditor.IssueCredit(credit); err != nil { return err } // cause mux() to check our flow conditions. select { case r.receiverReady <- struct{}{}: default: } return nil } // Prefetched returns the next message that is stored in the Receiver's // prefetch cache. It does NOT wait for the remote sender to send messages // and returns immediately if the prefetch cache is empty. To receive from the // prefetch and wait for messages from the remote Sender use `Receive`. // // Once a message is received, and if the sender is configured in any mode other // than SenderSettleModeSettled, you *must* take an action on the message by calling // one of the following: AcceptMessage, RejectMessage, ReleaseMessage, ModifyMessage. func (r *Receiver) Prefetched() *Message { select { case r.receiverReady <- struct{}{}: default: } // non-blocking receive to ensure buffered messages are // delivered regardless of whether the link has been closed. q := r.messagesQ.Acquire() msg := q.Dequeue() r.messagesQ.Release(q) if msg == nil { return nil } debug.Log(3, "RX (Receiver %p): prefetched delivery ID %d", r, msg.deliveryID) if msg.settled { r.onSettlement(1) } return msg } // ReceiveOptions contains any optional values for the Receiver.Receive method. type ReceiveOptions struct { // for future expansion } // Receive returns the next message from the sender. // Blocks until a message is received, ctx completes, or an error occurs. // // Once a message is received, and if the sender is configured in any mode other // than SenderSettleModeSettled, you *must* take an action on the message by calling // one of the following: AcceptMessage, RejectMessage, ReleaseMessage, ModifyMessage. func (r *Receiver) Receive(ctx context.Context, opts *ReceiveOptions) (*Message, error) { if msg := r.Prefetched(); msg != nil { return msg, nil } // wait for the next message select { case q := <-r.messagesQ.Wait(): msg := q.Dequeue() debug.Assert(msg != nil) debug.Log(3, "RX (Receiver %p): received delivery ID %d", r, msg.deliveryID) r.messagesQ.Release(q) if msg.settled { r.onSettlement(1) } return msg, nil case <-r.l.done: // if the link receives messages and is then closed between the above call to r.Prefetched() // and this select statement, the order of selecting r.messages and r.l.done is undefined. // however, once r.l.done is closed the link cannot receive any more messages. so be sure to // drain any that might have trickled in within this window. if msg := r.Prefetched(); msg != nil { return msg, nil } return nil, r.l.doneErr case <-ctx.Done(): return nil, ctx.Err() } } // Accept notifies the server that the message has been accepted and does not require redelivery. // - ctx controls waiting for the peer to acknowledge the disposition // - msg is the message to accept // // If the context's deadline expires or is cancelled before the operation // completes, the message's disposition is in an unknown state. func (r *Receiver) AcceptMessage(ctx context.Context, msg *Message) error { return r.messageDisposition(ctx, msg, &encoding.StateAccepted{}) } // Reject notifies the server that the message is invalid. // - ctx controls waiting for the peer to acknowledge the disposition // - msg is the message to reject // - e is an optional rejection error // // If the context's deadline expires or is cancelled before the operation // completes, the message's disposition is in an unknown state. func (r *Receiver) RejectMessage(ctx context.Context, msg *Message, e *Error) error { return r.messageDisposition(ctx, msg, &encoding.StateRejected{Error: e}) } // Release releases the message back to the server. The message may be redelivered to this or another consumer. // - ctx controls waiting for the peer to acknowledge the disposition // - msg is the message to release // // If the context's deadline expires or is cancelled before the operation // completes, the message's disposition is in an unknown state. func (r *Receiver) ReleaseMessage(ctx context.Context, msg *Message) error { return r.messageDisposition(ctx, msg, &encoding.StateReleased{}) } // Modify notifies the server that the message was not acted upon and should be modifed. // - ctx controls waiting for the peer to acknowledge the disposition // - msg is the message to modify // - options contains the optional settings to modify // // If the context's deadline expires or is cancelled before the operation // completes, the message's disposition is in an unknown state. func (r *Receiver) ModifyMessage(ctx context.Context, msg *Message, options *ModifyMessageOptions) error { if options == nil { options = &ModifyMessageOptions{} } return r.messageDisposition(ctx, msg, &encoding.StateModified{ DeliveryFailed: options.DeliveryFailed, UndeliverableHere: options.UndeliverableHere, MessageAnnotations: options.Annotations, }) } // ModifyMessageOptions contains the optional parameters to ModifyMessage. type ModifyMessageOptions struct { // DeliveryFailed indicates that the server must consider this an // unsuccessful delivery attempt and increment the delivery count. DeliveryFailed bool // UndeliverableHere indicates that the server must not redeliver // the message to this link. UndeliverableHere bool // Annotations is an optional annotation map to be merged // with the existing message annotations, overwriting existing keys // if necessary. Annotations Annotations } // Address returns the link's address. func (r *Receiver) Address() string { if r.l.source == nil { return "" } return r.l.source.Address } // LinkName returns associated link name or an empty string if link is not defined. func (r *Receiver) LinkName() string { return r.l.key.name } // LinkSourceFilterValue retrieves the specified link source filter value or nil if it doesn't exist. func (r *Receiver) LinkSourceFilterValue(name string) any { if r.l.source == nil { return nil } filter, ok := r.l.source.Filter[encoding.Symbol(name)] if !ok { return nil } return filter.Value } // Close closes the Receiver and AMQP link. // - ctx controls waiting for the peer to acknowledge the close // // If the context's deadline expires or is cancelled before the operation // completes, an error is returned. However, the operation will continue to // execute in the background. Subsequent calls will return a *LinkError // that contains the context's error message. func (r *Receiver) Close(ctx context.Context) error { return r.l.closeLink(ctx) } // sendDisposition sends a disposition frame to the peer func (r *Receiver) sendDisposition(ctx context.Context, first uint32, last *uint32, state encoding.DeliveryState) error { fr := &frames.PerformDisposition{ Role: encoding.RoleReceiver, First: first, Last: last, Settled: r.l.receiverSettleMode == nil || *r.l.receiverSettleMode == ReceiverSettleModeFirst, State: state, } frameCtx := frameContext{ Ctx: ctx, Done: make(chan struct{}), } select { case r.txDisposition <- frameBodyEnvelope{FrameCtx: &frameCtx, FrameBody: fr}: debug.Log(2, "TX (Receiver %p): mux txDisposition %s", r, fr) case <-r.l.done: return r.l.doneErr } select { case <-frameCtx.Done: return frameCtx.Err case <-r.l.done: return r.l.doneErr } } func (r *Receiver) messageDisposition(ctx context.Context, msg *Message, state encoding.DeliveryState) error { if msg.settled { return nil } // NOTE: we MUST add to the in-flight map before sending the disposition. if not, it's possible // to receive the ack'ing disposition frame *before* the in-flight map has been updated which // will cause the below <-wait to never trigger. var wait chan error if r.l.receiverSettleMode != nil && *r.l.receiverSettleMode == ReceiverSettleModeSecond { debug.Log(3, "TX (Receiver %p): delivery ID %d is in flight", r, msg.deliveryID) wait = r.inFlight.add(msg) } if err := r.sendDisposition(ctx, msg.deliveryID, nil, state); err != nil { return err } if wait == nil { // mode first, there will be no settlement ack r.deleteUnsettled(msg) r.onSettlement(1) return nil } select { case err := <-wait: // err has three possibilities // - nil, meaning the peer acknowledged the settlement // - an *Error, meaning the peer rejected the message with a provided error // - a non-AMQP error. this comes from calls to inFlight.clear() during mux unwind. // only for the first two cases is the message considered settled if amqpErr := (&Error{}); err == nil || errors.As(err, &amqpErr) { debug.Log(3, "RX (Receiver %p): delivery ID %d has been settled", r, msg.deliveryID) // we've received confirmation of disposition return err } debug.Log(3, "RX (Receiver %p): error settling delivery ID %d: %v", r, msg.deliveryID, err) return err case <-ctx.Done(): // didn't receive the ack in the time allotted, leave message as unsettled // TODO: if the ack arrives later, we need to remove the message from the unsettled map and reclaim the credit return ctx.Err() } } // onSettlement is to be called after message settlement. // - count is the number of messages that were settled func (r *Receiver) onSettlement(count uint32) { if !r.autoSendFlow { return } r.settlementCountMu.Lock() r.settlementCount += count r.settlementCountMu.Unlock() select { case r.receiverReady <- struct{}{}: // woke up default: // wake pending } } func (r *Receiver) addUnsettled(msg *Message) { r.unsettledMessagesLock.Lock() r.unsettledMessages[string(msg.DeliveryTag)] = struct{}{} r.unsettledMessagesLock.Unlock() } func (r *Receiver) deleteUnsettled(msg *Message) { r.unsettledMessagesLock.Lock() delete(r.unsettledMessages, string(msg.DeliveryTag)) r.unsettledMessagesLock.Unlock() } func (r *Receiver) countUnsettled() int { r.unsettledMessagesLock.RLock() count := len(r.unsettledMessages) r.unsettledMessagesLock.RUnlock() return count } func newReceiver(source string, session *Session, opts *ReceiverOptions) (*Receiver, error) { l := newLink(session, encoding.RoleReceiver) l.source = &frames.Source{Address: source} l.target = new(frames.Target) l.linkCredit = defaultLinkCredit r := &Receiver{ l: l, autoSendFlow: true, receiverReady: make(chan struct{}, 1), txDisposition: make(chan frameBodyEnvelope), } r.messagesQ = queue.NewHolder(queue.New[Message](int(session.incomingWindow))) if opts == nil { return r, nil } for _, v := range opts.Capabilities { r.l.target.Capabilities = append(r.l.target.Capabilities, encoding.Symbol(v)) } if opts.Credit > 0 { r.l.linkCredit = uint32(opts.Credit) } else if opts.Credit < 0 { r.l.linkCredit = 0 r.autoSendFlow = false } if opts.Durability > DurabilityUnsettledState { return nil, fmt.Errorf("invalid Durability %d", opts.Durability) } r.l.target.Durable = opts.Durability if opts.DynamicAddress { r.l.source.Address = "" r.l.dynamicAddr = opts.DynamicAddress } if opts.ExpiryPolicy != "" { if err := encoding.ValidateExpiryPolicy(opts.ExpiryPolicy); err != nil { return nil, err } r.l.target.ExpiryPolicy = opts.ExpiryPolicy } r.l.target.Timeout = opts.ExpiryTimeout if opts.Filters != nil { r.l.source.Filter = make(encoding.Filter) for _, f := range opts.Filters { f(r.l.source.Filter) } } if opts.MaxMessageSize > 0 { r.l.maxMessageSize = opts.MaxMessageSize } if opts.Name != "" { r.l.key.name = opts.Name } if opts.Properties != nil { r.l.properties = make(map[encoding.Symbol]any) for k, v := range opts.Properties { if k == "" { return nil, errors.New("link property key must not be empty") } r.l.properties[encoding.Symbol(k)] = v } } if opts.RequestedSenderSettleMode != nil { if rsm := *opts.RequestedSenderSettleMode; rsm > SenderSettleModeMixed { return nil, fmt.Errorf("invalid RequestedSenderSettleMode %d", rsm) } r.l.senderSettleMode = opts.RequestedSenderSettleMode } if opts.SettlementMode != nil { if rsm := *opts.SettlementMode; rsm > ReceiverSettleModeSecond { return nil, fmt.Errorf("invalid SettlementMode %d", rsm) } r.l.receiverSettleMode = opts.SettlementMode } r.l.target.Address = opts.TargetAddress for _, v := range opts.SourceCapabilities { r.l.source.Capabilities = append(r.l.source.Capabilities, encoding.Symbol(v)) } if opts.SourceDurability != DurabilityNone { r.l.source.Durable = opts.SourceDurability } if opts.SourceExpiryPolicy != ExpiryPolicySessionEnd { r.l.source.ExpiryPolicy = opts.SourceExpiryPolicy } if opts.SourceExpiryTimeout != 0 { r.l.source.Timeout = opts.SourceExpiryTimeout } return r, nil } // attach sends the Attach performative to establish the link with its parent session. // this is automatically called by the new*Link constructors. func (r *Receiver) attach(ctx context.Context) error { if err := r.l.attach(ctx, func(pa *frames.PerformAttach) { pa.Role = encoding.RoleReceiver if pa.Source == nil { pa.Source = new(frames.Source) } pa.Source.Dynamic = r.l.dynamicAddr }, func(pa *frames.PerformAttach) { if r.l.source == nil { r.l.source = new(frames.Source) } // if dynamic address requested, copy assigned name to address if r.l.dynamicAddr && pa.Source != nil { r.l.source.Address = pa.Source.Address } // deliveryCount is a sequence number, must initialize to sender's initial sequence number r.l.deliveryCount = pa.InitialDeliveryCount r.unsettledMessages = map[string]struct{}{} // copy the received filter values if pa.Source != nil { r.l.source.Filter = pa.Source.Filter } }); err != nil { return err } return nil } func nopHook() {} type receiverTestHooks struct { MuxStart func() MuxSelect func() } func (r *Receiver) mux(hooks receiverTestHooks) { if hooks.MuxSelect == nil { hooks.MuxSelect = nopHook } if hooks.MuxStart == nil { hooks.MuxStart = nopHook } defer func() { // unblock any in flight message dispositions r.inFlight.clear(r.l.doneErr) if !r.autoSendFlow { // unblock any pending drain requests r.creditor.EndDrain() } close(r.l.done) }() hooks.MuxStart() if r.autoSendFlow { r.l.doneErr = r.muxFlow(r.l.linkCredit, false) } for { msgLen := r.messagesQ.Len() r.settlementCountMu.Lock() // counter that accumulates the settled delivery count. // once the threshold has been reached, the counter is // reset and a flow frame is sent. previousSettlementCount := r.settlementCount if previousSettlementCount >= r.l.linkCredit { r.settlementCount = 0 } r.settlementCountMu.Unlock() // once we have pending credit equal to or greater than our available credit, reclaim it. // we do this instead of settlementCount > 0 to prevent flow frames from being too chatty. // NOTE: we compare the settlementCount against the current link credit instead of some // fixed threshold to ensure credit is reclaimed in cases where the number of unsettled // messages remains high for whatever reason. if r.autoSendFlow && previousSettlementCount > 0 && previousSettlementCount >= r.l.linkCredit { debug.Log(1, "RX (Receiver %p) (auto): source: %q, inflight: %d, linkCredit: %d, deliveryCount: %d, messages: %d, unsettled: %d, settlementCount: %d, settleMode: %s", r, r.l.source.Address, r.inFlight.len(), r.l.linkCredit, r.l.deliveryCount, msgLen, r.countUnsettled(), previousSettlementCount, r.l.receiverSettleMode.String()) r.l.doneErr = r.creditor.IssueCredit(previousSettlementCount) } else if r.l.linkCredit == 0 { debug.Log(1, "RX (Receiver %p) (pause): source: %q, inflight: %d, linkCredit: %d, deliveryCount: %d, messages: %d, unsettled: %d, settlementCount: %d, settleMode: %s", r, r.l.source.Address, r.inFlight.len(), r.l.linkCredit, r.l.deliveryCount, msgLen, r.countUnsettled(), previousSettlementCount, r.l.receiverSettleMode.String()) } if r.l.doneErr != nil { return } drain, credits := r.creditor.FlowBits(r.l.linkCredit) if drain || credits > 0 { debug.Log(1, "RX (Receiver %p) (flow): source: %q, inflight: %d, curLinkCredit: %d, newLinkCredit: %d, drain: %v, deliveryCount: %d, messages: %d, unsettled: %d, settlementCount: %d, settleMode: %s", r, r.l.source.Address, r.inFlight.len(), r.l.linkCredit, credits, drain, r.l.deliveryCount, msgLen, r.countUnsettled(), previousSettlementCount, r.l.receiverSettleMode.String()) // send a flow frame. r.l.doneErr = r.muxFlow(credits, drain) } if r.l.doneErr != nil { return } txDisposition := r.txDisposition closed := r.l.close if r.l.closeInProgress { // swap out channel so it no longer triggers closed = nil // disable sending of disposition frames once closing is in progress. // this is to prevent races between mux shutdown and clearing of // any in-flight dispositions. txDisposition = nil } hooks.MuxSelect() select { case q := <-r.l.rxQ.Wait(): // populated queue fr := *q.Dequeue() r.l.rxQ.Release(q) // if muxHandleFrame returns an error it means the mux must terminate. // note that in the case of a client-side close due to an error, nil // is returned in order to keep the mux running to ack the detach frame. if err := r.muxHandleFrame(fr); err != nil { r.l.doneErr = err return } case env := <-txDisposition: r.l.txFrame(env.FrameCtx, env.FrameBody) case <-r.receiverReady: continue case <-closed: if r.l.closeInProgress { // a client-side close due to protocol error is in progress continue } // receiver is being closed by the client r.l.closeInProgress = true fr := &frames.PerformDetach{ Handle: r.l.outputHandle, Closed: true, } r.l.txFrame(&frameContext{Ctx: context.Background()}, fr) case <-r.l.session.done: r.l.doneErr = r.l.session.doneErr return } } } // muxFlow sends tr to the session mux. // l.linkCredit will also be updated to `linkCredit` func (r *Receiver) muxFlow(linkCredit uint32, drain bool) error { var ( deliveryCount = r.l.deliveryCount ) fr := &frames.PerformFlow{ Handle: &r.l.outputHandle, DeliveryCount: &deliveryCount, LinkCredit: &linkCredit, // max number of messages, Drain: drain, } // Update credit. This must happen before entering loop below // because incoming messages handled while waiting to transmit // flow increment deliveryCount. This causes the credit to become // out of sync with the server. if !drain { // if we're draining we don't want to touch our internal credit - we're not changing it so any issued credits // are still valid until drain completes, at which point they will be naturally zeroed. r.l.linkCredit = linkCredit } select { case r.l.session.tx <- frameBodyEnvelope{FrameCtx: &frameContext{Ctx: context.Background()}, FrameBody: fr}: debug.Log(2, "TX (Receiver %p): mux frame to Session (%p): %d, %s", r, r.l.session, r.l.session.channel, fr) return nil case <-r.l.close: return nil case <-r.l.session.done: return r.l.session.doneErr } } // muxHandleFrame processes fr based on type. func (r *Receiver) muxHandleFrame(fr frames.FrameBody) error { debug.Log(2, "RX (Receiver %p): %s", r, fr) switch fr := fr.(type) { // message frame case *frames.PerformTransfer: r.muxReceive(*fr) // flow control frame case *frames.PerformFlow: if !fr.Echo { // if the 'drain' flag has been set in the frame sent to the _receiver_ then // we signal whomever is waiting (the service has seen and acknowledged our drain) if fr.Drain && !r.autoSendFlow { r.l.linkCredit = 0 // we have no active credits at this point. r.creditor.EndDrain() } return nil } var ( // copy because sent by pointer below; prevent race linkCredit = r.l.linkCredit deliveryCount = r.l.deliveryCount ) // send flow resp := &frames.PerformFlow{ Handle: &r.l.outputHandle, DeliveryCount: &deliveryCount, LinkCredit: &linkCredit, // max number of messages } select { case r.l.session.tx <- frameBodyEnvelope{FrameCtx: &frameContext{Ctx: context.Background()}, FrameBody: resp}: debug.Log(2, "TX (Receiver %p): mux frame to Session (%p): %d, %s", r, r.l.session, r.l.session.channel, resp) case <-r.l.close: return nil case <-r.l.session.done: return r.l.session.doneErr } case *frames.PerformDisposition: // Unblock receivers waiting for message disposition // bubble disposition error up to the receiver var dispositionError error if state, ok := fr.State.(*encoding.StateRejected); ok { // state.Error isn't required to be filled out. For instance if you dead letter a message // you will get a rejected response that doesn't contain an error. if state.Error != nil { dispositionError = state.Error } } // removal from the in-flight map will also remove the message from the unsettled map count := r.inFlight.remove(fr.First, fr.Last, dispositionError, func(msg *Message) { r.deleteUnsettled(msg) msg.settled = true }) r.onSettlement(count) default: return r.l.muxHandleFrame(fr) } return nil } func (r *Receiver) muxReceive(fr frames.PerformTransfer) { if !r.more { // this is the first transfer of a message, // record the delivery ID, message format, // and delivery Tag if fr.DeliveryID != nil { r.msg.deliveryID = *fr.DeliveryID } if fr.MessageFormat != nil { r.msg.Format = *fr.MessageFormat } r.msg.DeliveryTag = fr.DeliveryTag // these fields are required on first transfer of a message if fr.DeliveryID == nil { r.l.closeWithError(ErrCondNotAllowed, "received message without a delivery-id") return } if fr.MessageFormat == nil { r.l.closeWithError(ErrCondNotAllowed, "received message without a message-format") return } if fr.DeliveryTag == nil { r.l.closeWithError(ErrCondNotAllowed, "received message without a delivery-tag") return } } else { // this is a continuation of a multipart message // some fields may be omitted on continuation transfers, // but if they are included they must be consistent // with the first. if fr.DeliveryID != nil && *fr.DeliveryID != r.msg.deliveryID { msg := fmt.Sprintf( "received continuation transfer with inconsistent delivery-id: %d != %d", *fr.DeliveryID, r.msg.deliveryID, ) r.l.closeWithError(ErrCondNotAllowed, msg) return } if fr.MessageFormat != nil && *fr.MessageFormat != r.msg.Format { msg := fmt.Sprintf( "received continuation transfer with inconsistent message-format: %d != %d", *fr.MessageFormat, r.msg.Format, ) r.l.closeWithError(ErrCondNotAllowed, msg) return } if fr.DeliveryTag != nil && !bytes.Equal(fr.DeliveryTag, r.msg.DeliveryTag) { msg := fmt.Sprintf( "received continuation transfer with inconsistent delivery-tag: %q != %q", fr.DeliveryTag, r.msg.DeliveryTag, ) r.l.closeWithError(ErrCondNotAllowed, msg) return } } // discard message if it's been aborted if fr.Aborted { r.msgBuf.Reset() r.msg = Message{} r.more = false return } // ensure maxMessageSize will not be exceeded if r.l.maxMessageSize != 0 && uint64(r.msgBuf.Len())+uint64(len(fr.Payload)) > r.l.maxMessageSize { r.l.closeWithError(ErrCondMessageSizeExceeded, fmt.Sprintf("received message larger than max size of %d", r.l.maxMessageSize)) return } // add the payload the the buffer r.msgBuf.Append(fr.Payload) // mark as settled if at least one frame is settled r.msg.settled = r.msg.settled || fr.Settled // save in-progress status r.more = fr.More if fr.More { return } // last frame in message err := r.msg.Unmarshal(&r.msgBuf) if err != nil { r.l.closeWithError(ErrCondInternalError, err.Error()) return } // send to receiver if !r.msg.settled { r.addUnsettled(&r.msg) debug.Log(3, "RX (Receiver %p): add unsettled delivery ID %d", r, r.msg.deliveryID) } q := r.messagesQ.Acquire() q.Enqueue(r.msg) msgLen := q.Len() r.messagesQ.Release(q) // reset progress r.msgBuf.Reset() r.msg = Message{} // decrement link-credit after entire message received r.l.deliveryCount++ r.l.linkCredit-- debug.Log(3, "RX (Receiver %p) link %s - deliveryCount: %d, linkCredit: %d, len(messages): %d", r, r.l.key.name, r.l.deliveryCount, r.l.linkCredit, msgLen) } // inFlight tracks in-flight message dispositions allowing receivers // to block waiting for the server to respond when an appropriate // settlement mode is configured. type inFlight struct { mu sync.RWMutex m map[uint32]inFlightInfo } type inFlightInfo struct { wait chan error msg *Message } func (f *inFlight) add(msg *Message) chan error { wait := make(chan error, 1) f.mu.Lock() if f.m == nil { f.m = make(map[uint32]inFlightInfo) } f.m[msg.deliveryID] = inFlightInfo{wait: wait, msg: msg} f.mu.Unlock() return wait } func (f *inFlight) remove(first uint32, last *uint32, err error, handler func(*Message)) uint32 { f.mu.Lock() if f.m == nil { f.mu.Unlock() return 0 } ll := first if last != nil { ll = *last } count := uint32(0) for i := first; i <= ll; i++ { info, ok := f.m[i] if ok { handler(info.msg) info.wait <- err delete(f.m, i) count++ } } f.mu.Unlock() return count } func (f *inFlight) clear(err error) { f.mu.Lock() for id, info := range f.m { info.wait <- err delete(f.m, id) } f.mu.Unlock() } func (f *inFlight) len() int { f.mu.RLock() defer f.mu.RUnlock() return len(f.m) } golang-github-azure-go-amqp-1.0.2/receiver_test.go000066400000000000000000001406321454613650200221320ustar00rootroot00000000000000package amqp import ( "context" "errors" "fmt" "testing" "time" "github.com/Azure/go-amqp/internal/encoding" "github.com/Azure/go-amqp/internal/fake" "github.com/Azure/go-amqp/internal/frames" "github.com/Azure/go-amqp/internal/test" "github.com/stretchr/testify/require" ) func TestReceiverInvalidOptions(t *testing.T) { conn := fake.NewNetConn(receiverFrameHandlerNoUnhandled(0, ReceiverSettleModeFirst)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := session.NewReceiver(ctx, "source", &ReceiverOptions{ SettlementMode: ReceiverSettleMode(3).Ptr(), }) cancel() require.Error(t, err) require.Nil(t, r) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err = session.NewReceiver(ctx, "source", &ReceiverOptions{ Durability: Durability(3), }) cancel() require.Error(t, err) require.Nil(t, r) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err = session.NewReceiver(ctx, "source", &ReceiverOptions{ ExpiryPolicy: ExpiryPolicy("not-a-real-policy"), }) cancel() require.Error(t, err) require.Nil(t, r) } func TestReceiverMethodsNoReceive(t *testing.T) { const linkName = "test" responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch ff := req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("test")) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformAttach: require.Equal(t, DurabilityUnsettledState, ff.Target.Durable) require.Equal(t, ExpiryPolicyNever, ff.Target.ExpiryPolicy) require.Equal(t, uint32(300), ff.Target.Timeout) return newResponse(fake.ReceiverAttach(0, linkName, 0, ReceiverSettleModeFirst, nil)) case *frames.PerformFlow, *fake.KeepAlive: return fake.Response{}, nil case *frames.PerformDetach: return newResponse(fake.PerformDetach(0, ff.Handle, nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) const sourceAddr = "thesource" ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := session.NewReceiver(ctx, sourceAddr, &ReceiverOptions{ Name: linkName, Durability: DurabilityUnsettledState, ExpiryPolicy: ExpiryPolicyNever, ExpiryTimeout: 300, }) cancel() require.NoError(t, err) require.Equal(t, sourceAddr, r.Address()) require.Equal(t, linkName, r.LinkName()) require.Nil(t, r.LinkSourceFilterValue("nofilter")) ctx, cancel = context.WithTimeout(context.Background(), time.Second) require.NoError(t, r.Close(ctx)) cancel() } func TestReceiverLinkSourceFilter(t *testing.T) { conn := fake.NewNetConn(receiverFrameHandlerNoUnhandled(0, ReceiverSettleModeFirst)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) const filterName = "myfilter" const filterExp = "filter_exp" ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := session.NewReceiver(ctx, "ignored", &ReceiverOptions{ DynamicAddress: true, Filters: []LinkFilter{ NewLinkFilter(filterName, 0, filterExp), }, }) cancel() require.NoError(t, err) require.Equal(t, "test", r.Address()) require.NotEmpty(t, r.LinkName()) require.Equal(t, filterExp, r.LinkSourceFilterValue(filterName)) ctx, cancel = context.WithTimeout(context.Background(), time.Second) require.NoError(t, r.Close(ctx)) cancel() } func TestReceiverOnClosed(t *testing.T) { conn := fake.NewNetConn(receiverFrameHandlerNoUnhandled(0, ReceiverSettleModeFirst)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := session.NewReceiver(ctx, "source", nil) cancel() require.NoError(t, err) errChan := make(chan error) go func() { _, err := r.Receive(context.Background(), nil) errChan <- err }() ctx, cancel = context.WithTimeout(context.Background(), time.Second) require.NoError(t, r.Close(ctx)) cancel() var linkErr *LinkError require.ErrorAs(t, <-errChan, &linkErr) _, err = r.Receive(context.Background(), nil) require.ErrorAs(t, err, &linkErr) var amqpErr *Error // there should be no inner error when closed on our side require.False(t, errors.As(err, &amqpErr)) } func TestReceiverOnSessionClosed(t *testing.T) { conn := fake.NewNetConn(receiverFrameHandlerNoUnhandled(0, ReceiverSettleModeFirst)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := session.NewReceiver(ctx, "source", nil) cancel() require.NoError(t, err) errChan := make(chan error) go func() { _, err := r.Receive(context.Background(), nil) errChan <- err }() ctx, cancel = context.WithTimeout(context.Background(), time.Second) require.NoError(t, session.Close(ctx)) cancel() var sessionErr *SessionError require.ErrorAs(t, <-errChan, &sessionErr) _, err = r.Receive(context.Background(), nil) require.ErrorAs(t, err, &sessionErr) } func TestReceiverOnConnClosed(t *testing.T) { conn := fake.NewNetConn(receiverFrameHandlerNoUnhandled(0, ReceiverSettleModeFirst)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := session.NewReceiver(ctx, "source", nil) cancel() require.NoError(t, err) errChan := make(chan error) go func() { _, err := r.Receive(context.Background(), nil) errChan <- err }() require.NoError(t, client.Close()) err = <-errChan var connErr *ConnError if !errors.As(err, &connErr) { t.Fatalf("unexpected error type %T", err) } _, err = r.Receive(context.Background(), nil) if !errors.As(err, &connErr) { t.Fatalf("unexpected error type %T", err) } } func TestReceiverOnDetached(t *testing.T) { conn := fake.NewNetConn(receiverFrameHandlerNoUnhandled(0, ReceiverSettleModeFirst)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := session.NewReceiver(ctx, "source", nil) cancel() require.NoError(t, err) errChan := make(chan error) go func() { _, err := r.Receive(context.Background(), nil) errChan <- err }() // initiate a server-side detach const ( errcon = "detaching" errdesc = "server side detach" ) b, err := fake.PerformDetach(0, 0, &Error{Condition: errcon, Description: errdesc}) require.NoError(t, err) conn.SendFrame(b) var linkErr *LinkError require.ErrorAs(t, <-errChan, &linkErr) require.Equal(t, ErrCond(errcon), linkErr.RemoteErr.Condition) require.Equal(t, errdesc, linkErr.RemoteErr.Description) require.NoError(t, client.Close()) _, err = r.Receive(context.Background(), nil) require.ErrorAs(t, err, &linkErr) } func TestReceiverCloseTimeout(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch tt := req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformEnd: return newResponse(fake.PerformEnd(0, nil)) case *frames.PerformAttach: return newResponse(fake.ReceiverAttach(0, tt.Name, tt.Handle, ReceiverSettleModeSecond, nil)) case *frames.PerformDetach: b, err := fake.PerformDetach(0, tt.Handle, nil) if err != nil { return fake.Response{}, err } // include a write delay to trigger sender close timeout return fake.Response{Payload: b, WriteDelay: 1 * time.Second}, nil case *frames.PerformFlow, *fake.KeepAlive: return fake.Response{}, nil case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := session.NewReceiver(ctx, "source", nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = r.Close(ctx) cancel() require.ErrorIs(t, err, context.DeadlineExceeded) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = r.Close(ctx) cancel() var linkErr *LinkError require.ErrorAs(t, err, &linkErr) require.Contains(t, linkErr.Error(), context.DeadlineExceeded.Error()) require.NoError(t, client.Close()) } func TestReceiveInvalidMessage(t *testing.T) { const linkHandle = 0 deliveryID := uint32(1) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch tt := req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformEnd: return newResponse(fake.PerformEnd(0, nil)) case *frames.PerformAttach: return newResponse(fake.ReceiverAttach(0, tt.Name, 0, ReceiverSettleModeFirst, tt.Source.Filter)) case *frames.PerformDetach: require.NotNil(t, tt.Error) require.EqualValues(t, ErrCondNotAllowed, tt.Error.Condition) return newResponse(fake.PerformDetach(0, 0, nil)) case *frames.PerformFlow, *fake.KeepAlive: return fake.Response{}, nil case *frames.PerformDisposition: return newResponse(fake.PerformDisposition(encoding.RoleSender, 0, deliveryID, nil, &encoding.StateAccepted{})) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := session.NewReceiver(ctx, "source", nil) cancel() require.NoError(t, err) msgChan := make(chan *Message) errChan := make(chan error) go func() { msg, err := r.Receive(context.Background(), nil) msgChan <- msg errChan <- err }() // missing DeliveryID fr, err := fake.EncodeFrame(frames.TypeAMQP, 0, &frames.PerformTransfer{ Handle: linkHandle, }) require.NoError(t, err) conn.SendFrame(fr) require.Nil(t, <-msgChan) var linkErr *LinkError require.ErrorAs(t, <-errChan, &linkErr) require.Contains(t, linkErr.Error(), ErrCondNotAllowed) _, err = r.Receive(context.Background(), nil) require.ErrorAs(t, err, &linkErr) // missing MessageFormat ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err = session.NewReceiver(ctx, "source", nil) cancel() require.NoError(t, err) go func() { msg, err := r.Receive(context.Background(), nil) msgChan <- msg errChan <- err }() fr, err = fake.EncodeFrame(frames.TypeAMQP, 0, &frames.PerformTransfer{ DeliveryID: &deliveryID, Handle: linkHandle, }) require.NoError(t, err) conn.SendFrame(fr) require.Nil(t, <-msgChan) require.ErrorAs(t, <-errChan, &linkErr) require.Contains(t, linkErr.Error(), ErrCondNotAllowed) _, err = r.Receive(context.Background(), nil) require.ErrorAs(t, err, &linkErr) // missing delivery tag format := uint32(0) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err = session.NewReceiver(ctx, "source", nil) cancel() require.NoError(t, err) go func() { msg, err := r.Receive(context.Background(), nil) msgChan <- msg errChan <- err }() fr, err = fake.EncodeFrame(frames.TypeAMQP, 0, &frames.PerformTransfer{ DeliveryID: &deliveryID, Handle: linkHandle, MessageFormat: &format, }) require.NoError(t, err) conn.SendFrame(fr) require.Nil(t, <-msgChan) require.ErrorAs(t, <-errChan, &linkErr) require.Contains(t, linkErr.Error(), ErrCondNotAllowed) _, err = r.Receive(context.Background(), nil) require.ErrorAs(t, err, &linkErr) require.NoError(t, client.Close()) } func TestReceiveSuccessReceiverSettleModeFirst(t *testing.T) { muxSem := test.NewMuxSemaphore(2) const linkHandle = 0 deliveryID := uint32(1) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := receiverFrameHandler(0, ReceiverSettleModeFirst)(remoteChannel, req) if resp.Payload != nil || err != nil { return resp, err } switch ff := req.(type) { case *frames.PerformFlow: if *ff.NextIncomingID == deliveryID { // this is the first flow frame, send our payload return newResponse(fake.PerformTransfer(0, linkHandle, deliveryID, []byte("hello"))) } // ignore future flow frames as we have no response return fake.Response{}, nil case *frames.PerformDisposition: return fake.Response{}, nil default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := newReceiverForSession(ctx, session, "source", &ReceiverOptions{ SettlementMode: ReceiverSettleModeFirst.Ptr(), }, receiverTestHooks{MuxSelect: muxSem.OnLoop}) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), time.Second) msg, err := r.Receive(ctx, nil) cancel() require.NoError(t, err) muxSem.Wait() if c := r.countUnsettled(); c != 1 { t.Fatalf("unexpected unsettled count %d", c) } // link credit should be 0 if c := r.l.linkCredit; c != 0 { t.Fatalf("unexpected link credit %d", c) } muxSem.Release(1) ctx, cancel = context.WithTimeout(context.Background(), time.Second) err = r.AcceptMessage(ctx, msg) cancel() require.NoError(t, err) muxSem.Wait() if c := r.countUnsettled(); c != 0 { t.Fatalf("unexpected unsettled count %d", c) } // link credit should be 1 if c := r.l.linkCredit; c != 1 { t.Fatalf("unexpected link credit %d", c) } muxSem.Release(-1) // subsequent dispositions should have no effect ctx, cancel = context.WithTimeout(context.Background(), time.Second) err = r.AcceptMessage(ctx, msg) cancel() require.NoError(t, err) require.NoError(t, client.Close()) } func TestReceiveSuccessReceiverSettleModeSecondAccept(t *testing.T) { muxSem := test.NewMuxSemaphore(2) const linkHandle = 0 deliveryID := uint32(1) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := receiverFrameHandler(0, ReceiverSettleModeSecond)(remoteChannel, req) if resp.Payload != nil || err != nil { return resp, err } switch ff := req.(type) { case *frames.PerformFlow: if *ff.NextIncomingID == deliveryID { // this is the first flow frame, send our payload return newResponse(fake.PerformTransfer(0, linkHandle, deliveryID, []byte("hello"))) } // ignore future flow frames as we have no response return fake.Response{}, nil case *frames.PerformDisposition: if _, ok := ff.State.(*encoding.StateAccepted); !ok { return fake.Response{}, fmt.Errorf("unexpected State %T", ff.State) } return newResponse(fake.PerformDisposition(encoding.RoleSender, 0, deliveryID, nil, &encoding.StateAccepted{})) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := newReceiverForSession(ctx, session, "source", &ReceiverOptions{ SettlementMode: ReceiverSettleModeSecond.Ptr(), }, receiverTestHooks{MuxSelect: muxSem.OnLoop}) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), time.Second) msg, err := r.Receive(ctx, nil) cancel() require.NoError(t, err) if c := r.countUnsettled(); c != 1 { t.Fatalf("unexpected unsettled count %d", c) } muxSem.Wait() // link credit must be zero since we only started with 1 if c := r.l.linkCredit; c != 0 { t.Fatalf("unexpected link credit %d", c) } muxSem.Release(2) ctx, cancel = context.WithTimeout(context.Background(), time.Second) err = r.AcceptMessage(ctx, msg) cancel() require.NoError(t, err) muxSem.Wait() if c := r.countUnsettled(); c != 0 { t.Fatalf("unexpected unsettled count %d", c) } require.Equal(t, true, msg.settled) // link credit should be back to 1 if c := r.l.linkCredit; c != 1 { t.Fatalf("unexpected link credit %d", c) } muxSem.Release(-1) // subsequent dispositions should have no effect ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = r.AcceptMessage(ctx, msg) cancel() require.NoError(t, err) require.NoError(t, client.Close()) } func TestReceiveSuccessReceiverSettleModeSecondAcceptOnClosedLink(t *testing.T) { muxSem := test.NewMuxSemaphore(2) const linkHandle = 0 deliveryID := uint32(1) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := receiverFrameHandler(0, ReceiverSettleModeSecond)(remoteChannel, req) if resp.Payload != nil || err != nil { return resp, err } switch ff := req.(type) { case *frames.PerformFlow: if *ff.NextIncomingID == deliveryID { // this is the first flow frame, send our payload return newResponse(fake.PerformTransfer(0, linkHandle, deliveryID, []byte("hello"))) } // ignore future flow frames as we have no response return fake.Response{}, nil case *frames.PerformDisposition: if _, ok := ff.State.(*encoding.StateAccepted); !ok { return fake.Response{}, fmt.Errorf("unexpected State %T", ff.State) } return newResponse(fake.PerformDisposition(encoding.RoleSender, 0, deliveryID, nil, &encoding.StateAccepted{})) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := newReceiverForSession(ctx, session, "source", &ReceiverOptions{ SettlementMode: ReceiverSettleModeSecond.Ptr(), }, receiverTestHooks{MuxSelect: muxSem.OnLoop}) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), time.Second) msg, err := r.Receive(ctx, nil) cancel() require.NoError(t, err) muxSem.Wait() if c := r.countUnsettled(); c != 1 { t.Fatalf("unexpected unsettled count %d", c) } // link credit must be zero since we only started with 1 if c := r.l.linkCredit; c != 0 { t.Fatalf("unexpected link credit %d", c) } muxSem.Release(-1) require.NoError(t, r.Close(context.Background())) ctx, cancel = context.WithTimeout(context.Background(), time.Second) err = r.AcceptMessage(ctx, msg) cancel() var linkErr *LinkError require.ErrorAs(t, err, &linkErr) } func TestReceiveSuccessReceiverSettleModeSecondReject(t *testing.T) { muxSem := test.NewMuxSemaphore(2) const linkHandle = 0 deliveryID := uint32(1) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := receiverFrameHandler(0, ReceiverSettleModeSecond)(remoteChannel, req) if resp.Payload != nil || err != nil { return resp, err } switch ff := req.(type) { case *frames.PerformFlow: if *ff.NextIncomingID == deliveryID { // this is the first flow frame, send our payload return newResponse(fake.PerformTransfer(0, linkHandle, deliveryID, []byte("hello"))) } // ignore future flow frames as we have no response return fake.Response{}, nil case *frames.PerformDisposition: if _, ok := ff.State.(*encoding.StateRejected); !ok { return fake.Response{}, fmt.Errorf("unexpected State %T", ff.State) } return newResponse(fake.PerformDisposition(encoding.RoleSender, 0, deliveryID, nil, &encoding.StateRejected{})) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := newReceiverForSession(ctx, session, "source", &ReceiverOptions{ SettlementMode: ReceiverSettleModeSecond.Ptr(), }, receiverTestHooks{MuxSelect: muxSem.OnLoop}) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), time.Second) msg, err := r.Receive(ctx, nil) cancel() require.NoError(t, err) muxSem.Wait() if c := r.countUnsettled(); c != 1 { t.Fatalf("unexpected unsettled count %d", c) } // link credit must be zero since we only started with 1 if c := r.l.linkCredit; c != 0 { t.Fatalf("unexpected link credit %d", c) } muxSem.Release(2) ctx, cancel = context.WithTimeout(context.Background(), time.Second) err = r.RejectMessage(ctx, msg, nil) cancel() require.NoError(t, err) muxSem.Wait() if c := r.countUnsettled(); c != 0 { t.Fatalf("unexpected unsettled count %d", c) } // link credit should be back to 1 if c := r.l.linkCredit; c != 1 { t.Fatalf("unexpected link credit %d", c) } muxSem.Release(-1) require.NoError(t, client.Close()) } func TestReceiveSuccessReceiverSettleModeSecondRelease(t *testing.T) { muxSem := test.NewMuxSemaphore(2) const linkHandle = 0 deliveryID := uint32(1) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := receiverFrameHandler(0, ReceiverSettleModeSecond)(remoteChannel, req) if resp.Payload != nil || err != nil { return resp, err } switch ff := req.(type) { case *frames.PerformFlow: if *ff.NextIncomingID == deliveryID { // this is the first flow frame, send our payload return newResponse(fake.PerformTransfer(0, linkHandle, deliveryID, []byte("hello"))) } // ignore future flow frames as we have no response return fake.Response{}, nil case *frames.PerformDisposition: if _, ok := ff.State.(*encoding.StateReleased); !ok { return fake.Response{}, fmt.Errorf("unexpected State %T", ff.State) } return newResponse(fake.PerformDisposition(encoding.RoleSender, 0, deliveryID, nil, &encoding.StateReleased{})) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := newReceiverForSession(ctx, session, "source", &ReceiverOptions{ SettlementMode: ReceiverSettleModeSecond.Ptr(), }, receiverTestHooks{MuxSelect: muxSem.OnLoop}) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), time.Second) msg, err := r.Receive(ctx, nil) cancel() require.NoError(t, err) muxSem.Wait() if c := r.countUnsettled(); c != 1 { t.Fatalf("unexpected unsettled count %d", c) } // link credit must be zero since we only started with 1 if c := r.l.linkCredit; c != 0 { t.Fatalf("unexpected link credit %d", c) } muxSem.Release(2) ctx, cancel = context.WithTimeout(context.Background(), time.Second) err = r.ReleaseMessage(ctx, msg) cancel() require.NoError(t, err) muxSem.Wait() if c := r.countUnsettled(); c != 0 { t.Fatalf("unexpected unsettled count %d", c) } // link credit should be back to 1 if c := r.l.linkCredit; c != 1 { t.Fatalf("unexpected link credit %d", c) } muxSem.Release(-1) require.NoError(t, client.Close()) } func TestReceiveSuccessReceiverSettleModeSecondModify(t *testing.T) { muxSem := test.NewMuxSemaphore(2) const linkHandle = 0 deliveryID := uint32(1) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := receiverFrameHandler(0, ReceiverSettleModeSecond)(remoteChannel, req) if resp.Payload != nil || err != nil { return resp, err } switch ff := req.(type) { case *frames.PerformFlow: if *ff.NextIncomingID == deliveryID { // this is the first flow frame, send our payload return newResponse(fake.PerformTransfer(0, linkHandle, deliveryID, []byte("hello"))) } // ignore future flow frames as we have no response return fake.Response{}, nil case *frames.PerformDisposition: var mod *encoding.StateModified var ok bool if mod, ok = ff.State.(*encoding.StateModified); !ok { return fake.Response{}, fmt.Errorf("unexpected State %T", ff.State) } if v := mod.MessageAnnotations["some"]; v != "value" { return fake.Response{}, fmt.Errorf("unexpected annotation value %v", v) } return newResponse(fake.PerformDisposition(encoding.RoleSender, 0, deliveryID, nil, &encoding.StateModified{})) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := newReceiverForSession(ctx, session, "source", &ReceiverOptions{ SettlementMode: ReceiverSettleModeSecond.Ptr(), }, receiverTestHooks{MuxSelect: muxSem.OnLoop}) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), time.Second) msg, err := r.Receive(ctx, nil) cancel() require.NoError(t, err) muxSem.Wait() if c := r.countUnsettled(); c != 1 { t.Fatalf("unexpected unsettled count %d", c) } // link credit must be zero since we only started with 1 if c := r.l.linkCredit; c != 0 { t.Fatalf("unexpected link credit %d", c) } muxSem.Release(2) ctx, cancel = context.WithTimeout(context.Background(), time.Second) err = r.ModifyMessage(ctx, msg, &ModifyMessageOptions{ UndeliverableHere: true, Annotations: Annotations{ "some": "value", }, }) cancel() require.NoError(t, err) muxSem.Wait() if c := r.countUnsettled(); c != 0 { t.Fatalf("unexpected unsettled count %d", c) } // link credit should be back to 1 if c := r.l.linkCredit; c != 1 { t.Fatalf("unexpected link credit %d", c) } muxSem.Release(-1) require.NoError(t, client.Close()) } func TestReceiverPrefetch(t *testing.T) { conn := fake.NewNetConn(receiverFrameHandlerNoUnhandled(0, ReceiverSettleModeFirst)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := session.NewReceiver(ctx, "source", nil) cancel() require.NoError(t, err) msg := r.Prefetched() require.Nil(t, msg) // now send a transfer b, err := fake.PerformTransfer(0, 0, 1, []byte("message 1")) require.NoError(t, err) conn.SendFrame(b) // wait for the transfer to "arrive" time.Sleep(time.Second) msg = r.Prefetched() require.NotNil(t, msg) msg = r.Prefetched() require.Nil(t, msg) require.NoError(t, client.Close()) } func TestReceiveMultiFrameMessageSuccess(t *testing.T) { muxSem := test.NewMuxSemaphore(4) const linkHandle = 0 deliveryID := uint32(1) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := receiverFrameHandler(0, ReceiverSettleModeSecond)(remoteChannel, req) if resp.Payload != nil || err != nil { return resp, err } switch ff := req.(type) { case *frames.PerformFlow, *fake.KeepAlive: return fake.Response{}, nil case *frames.PerformDisposition: if _, ok := ff.State.(*encoding.StateAccepted); !ok { return fake.Response{}, fmt.Errorf("unexpected State %T", ff.State) } return newResponse(fake.PerformDisposition(encoding.RoleSender, 0, deliveryID, nil, &encoding.StateAccepted{})) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := newReceiverForSession(ctx, session, "source", &ReceiverOptions{ SettlementMode: ReceiverSettleModeSecond.Ptr(), }, receiverTestHooks{MuxSelect: muxSem.OnLoop}) cancel() require.NoError(t, err) msgChan := make(chan *Message) errChan := make(chan error) go func() { msg, err := r.Receive(context.Background(), nil) msgChan <- msg errChan <- err }() // send multi-frame message payload := []byte("this should be split into three frames for a multi-frame transfer message") require.NoError(t, conn.SendMultiFrameTransfer(0, linkHandle, deliveryID, payload, nil)) msg := <-msgChan require.NoError(t, <-errChan) // validate message content result := []byte{} for i := range msg.Data { result = append(result, msg.Data[i]...) } require.Equal(t, payload, result) muxSem.Wait() if c := r.countUnsettled(); c != 1 { t.Fatalf("unexpected unsettled count %d", c) } // link credit must be zero since we only started with 1 if c := r.l.linkCredit; c != 0 { t.Fatalf("unexpected link credit %d", c) } muxSem.Release(2) ctx, cancel = context.WithTimeout(context.Background(), time.Second) err = r.AcceptMessage(ctx, msg) cancel() require.NoError(t, err) muxSem.Wait() if c := r.countUnsettled(); c != 0 { t.Fatalf("unexpected unsettled count %d", c) } require.Equal(t, true, msg.settled) // link credit should be back to 1 if c := r.l.linkCredit; c != 1 { t.Fatalf("unexpected link credit %d", c) } muxSem.Release(-1) require.NoError(t, client.Close()) } func TestReceiveInvalidMultiFrameMessage(t *testing.T) { const linkHandle = 0 deliveryID := uint32(1) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch tt := req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformEnd: return newResponse(fake.PerformEnd(0, nil)) case *frames.PerformAttach: return newResponse(fake.ReceiverAttach(0, tt.Name, 0, ReceiverSettleModeSecond, tt.Source.Filter)) case *frames.PerformDetach: return newResponse(fake.PerformDetach(0, 0, nil)) case *frames.PerformFlow, *fake.KeepAlive: return fake.Response{}, nil case *frames.PerformDisposition: return newResponse(fake.PerformDisposition(encoding.RoleSender, 0, deliveryID, nil, &encoding.StateAccepted{})) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := session.NewReceiver(ctx, "source", &ReceiverOptions{ SettlementMode: ReceiverSettleModeSecond.Ptr(), }) cancel() require.NoError(t, err) msgChan := make(chan *Message) errChan := make(chan error) go func() { msg, err := r.Receive(context.Background(), nil) msgChan <- msg errChan <- err }() // send multi-frame message payload := []byte("this should be split into two frames for a multi-frame transfer") // mismatched DeliveryID require.NoError(t, conn.SendMultiFrameTransfer(0, linkHandle, deliveryID, payload, func(i int, fr *frames.PerformTransfer) { if i == 0 { return } // modify the second frame with mismatched data badID := uint32(123) fr.DeliveryID = &badID })) msg := <-msgChan require.Nil(t, msg) var linkErr *LinkError require.ErrorAs(t, <-errChan, &linkErr) require.Contains(t, linkErr.Error(), ErrCondNotAllowed) // mismatched MessageFormat ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err = session.NewReceiver(ctx, "source", &ReceiverOptions{ SettlementMode: ReceiverSettleModeSecond.Ptr(), }) cancel() require.NoError(t, err) go func() { msg, err := r.Receive(context.Background(), nil) msgChan <- msg errChan <- err }() require.NoError(t, conn.SendMultiFrameTransfer(0, linkHandle, deliveryID, payload, func(i int, fr *frames.PerformTransfer) { if i == 0 { return } // modify the second frame with mismatched data badFormat := uint32(123) fr.MessageFormat = &badFormat })) msg = <-msgChan require.Nil(t, msg) require.ErrorAs(t, <-errChan, &linkErr) require.Contains(t, linkErr.Error(), ErrCondNotAllowed) // mismatched DeliveryTag ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err = session.NewReceiver(ctx, "source", &ReceiverOptions{ SettlementMode: ReceiverSettleModeSecond.Ptr(), }) cancel() require.NoError(t, err) go func() { msg, err := r.Receive(context.Background(), nil) msgChan <- msg errChan <- err }() require.NoError(t, conn.SendMultiFrameTransfer(0, linkHandle, deliveryID, payload, func(i int, fr *frames.PerformTransfer) { if i == 0 { return } // modify the second frame with mismatched data fr.DeliveryTag = []byte("bad_tag") })) msg = <-msgChan require.Nil(t, msg) require.ErrorAs(t, <-errChan, &linkErr) require.Contains(t, linkErr.Error(), ErrCondNotAllowed) require.NoError(t, client.Close()) } func TestReceiveMultiFrameMessageAborted(t *testing.T) { const linkHandle = 0 deliveryID := uint32(1) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := receiverFrameHandler(0, ReceiverSettleModeSecond)(remoteChannel, req) if resp.Payload != nil || err != nil { return resp, err } switch ff := req.(type) { case *frames.PerformFlow, *fake.KeepAlive: return fake.Response{}, nil case *frames.PerformDisposition: if _, ok := ff.State.(*encoding.StateAccepted); !ok { return fake.Response{}, fmt.Errorf("unexpected State %T", ff.State) } return newResponse(fake.PerformDisposition(encoding.RoleSender, 0, deliveryID, nil, &encoding.StateAccepted{})) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := session.NewReceiver(ctx, "source", &ReceiverOptions{ SettlementMode: ReceiverSettleModeSecond.Ptr(), }) cancel() require.NoError(t, err) msgChan := make(chan *Message) errChan := make(chan error) go func() { msg, err := r.Receive(context.Background(), nil) errChan <- err msgChan <- msg }() // send multi-frame message payload := []byte("this should be split into three frames for a multi-frame transfer message") require.NoError(t, conn.SendMultiFrameTransfer(0, linkHandle, deliveryID, payload, func(i int, fr *frames.PerformTransfer) { if i < 2 { return } // set abort flag on the last frame fr.Aborted = true })) // we shouldn't have received any message at this point, now send a single-frame message payload = []byte("single message") b, err := fake.PerformTransfer(0, linkHandle, deliveryID+1, payload) require.NoError(t, err) conn.SendFrame(b) require.NoError(t, <-errChan) msg := <-msgChan require.Equal(t, payload, msg.GetData()) require.NoError(t, client.Close()) } func TestReceiveMessageTooBig(t *testing.T) { const linkHandle = 0 deliveryID := uint32(1) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := receiverFrameHandler(0, ReceiverSettleModeSecond)(remoteChannel, req) if resp.Payload != nil || err != nil { return resp, err } switch ff := req.(type) { case *frames.PerformFlow: if *ff.NextIncomingID == deliveryID { // this is the first flow frame, send our payload bigPayload := make([]byte, 256) return newResponse(fake.PerformTransfer(0, linkHandle, deliveryID, bigPayload)) } // ignore future flow frames as we have no response return fake.Response{}, nil default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := session.NewReceiver(ctx, "source", &ReceiverOptions{ SettlementMode: ReceiverSettleModeSecond.Ptr(), MaxMessageSize: 128, }) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), time.Second) msg, err := r.Receive(ctx, nil) cancel() require.Nil(t, msg) var linkErr *LinkError require.ErrorAs(t, err, &linkErr) require.Contains(t, linkErr.Error(), ErrCondMessageSizeExceeded) require.NoError(t, client.Close()) } func TestReceiveSuccessAcceptFails(t *testing.T) { muxSem := test.NewMuxSemaphore(2) const linkHandle = 0 deliveryID := uint32(1) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := receiverFrameHandler(0, ReceiverSettleModeSecond)(remoteChannel, req) if resp.Payload != nil || err != nil { return resp, err } switch ff := req.(type) { case *frames.PerformFlow: if *ff.NextIncomingID == deliveryID { // this is the first flow frame, send our payload return newResponse(fake.PerformTransfer(0, linkHandle, deliveryID, []byte("hello"))) } // ignore future flow frames as we have no response return fake.Response{}, nil default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := newReceiverForSession(ctx, session, "source", &ReceiverOptions{ SettlementMode: ReceiverSettleModeSecond.Ptr(), }, receiverTestHooks{MuxSelect: muxSem.OnLoop}) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), time.Second) msg, err := r.Receive(ctx, nil) cancel() require.NoError(t, err) muxSem.Wait() if c := r.countUnsettled(); c != 1 { t.Fatalf("unexpected unsettled count %d", c) } // link credit must be zero since we only started with 1 if c := r.l.linkCredit; c != 0 { t.Fatalf("unexpected link credit %d", c) } muxSem.Release(-1) // close client before accepting the message require.NoError(t, client.Close()) ctx, cancel = context.WithTimeout(context.Background(), time.Second) err = r.AcceptMessage(ctx, msg) cancel() var connErr *ConnError if !errors.As(err, &connErr) { t.Fatalf("unexpected error type %T", err) } if c := r.countUnsettled(); c != 1 { t.Fatalf("unexpected unsettled count %d", c) } } func TestReceiverCloseOnUnsettledWithPending(t *testing.T) { conn := fake.NewNetConn(receiverFrameHandlerNoUnhandled(0, ReceiverSettleModeFirst)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := session.NewReceiver(ctx, "source", nil) cancel() require.NoError(t, err) // first message exhausts the link credit b, err := fake.PerformTransfer(0, 0, 1, []byte("message 1")) require.NoError(t, err) conn.SendFrame(b) // wait for the messages to "arrive" time.Sleep(time.Second) // now close the receiver without reading any of the messages ctx, cancel = context.WithTimeout(context.Background(), time.Second) require.NoError(t, r.Close(ctx)) cancel() } func TestReceiverConnReaderError(t *testing.T) { conn := fake.NewNetConn(receiverFrameHandlerNoUnhandled(0, ReceiverSettleModeFirst)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := session.NewReceiver(ctx, "source", nil) cancel() require.NoError(t, err) errChan := make(chan error) go func() { _, err := r.Receive(context.Background(), nil) errChan <- err }() // trigger some kind of error conn.ReadErr <- errors.New("failed") err = <-errChan var connErr *ConnError if !errors.As(err, &connErr) { t.Fatalf("unexpected error type %T", err) } _, err = r.Receive(context.Background(), nil) if !errors.As(err, &connErr) { t.Fatalf("unexpected error type %T", err) } require.Error(t, conn.Close()) } func TestReceiverConnWriterError(t *testing.T) { conn := fake.NewNetConn(receiverFrameHandlerNoUnhandled(0, ReceiverSettleModeFirst)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := session.NewReceiver(ctx, "source", nil) cancel() require.NoError(t, err) errChan := make(chan error) go func() { _, err := r.Receive(context.Background(), nil) errChan <- err }() conn.WriteErr <- errors.New("failed") // trigger the write error conn.SendKeepAlive() err = <-errChan var connErr *ConnError if !errors.As(err, &connErr) { t.Fatalf("unexpected error type %T", err) } _, err = r.Receive(context.Background(), nil) if !errors.As(err, &connErr) { t.Fatalf("unexpected error type %T", err) } require.Error(t, conn.Close()) } func TestReceiveSuccessReceiverSettleModeSecondAcceptSlow(t *testing.T) { muxSem := test.NewMuxSemaphore(2) const linkHandle = 0 deliveryID := uint32(1) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := receiverFrameHandler(0, ReceiverSettleModeSecond)(remoteChannel, req) if resp.Payload != nil || err != nil { return resp, err } switch ff := req.(type) { case *frames.PerformFlow: if *ff.NextIncomingID == deliveryID { // this is the first flow frame, send our payload return newResponse(fake.PerformTransfer(0, linkHandle, deliveryID, []byte("hello"))) } // ignore future flow frames as we have no response return fake.Response{}, nil case *frames.PerformDisposition: b, err := fake.PerformDisposition(encoding.RoleSender, 0, deliveryID, nil, &encoding.StateAccepted{}) if err != nil { return fake.Response{}, err } // include a write delay so that waiting for the ack times out return fake.Response{Payload: b, WriteDelay: 1 * time.Second}, nil default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } conn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) r, err := newReceiverForSession(ctx, session, "source", &ReceiverOptions{ SettlementMode: ReceiverSettleModeSecond.Ptr(), }, receiverTestHooks{MuxSelect: muxSem.OnLoop}) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), time.Second) msg, err := r.Receive(ctx, nil) cancel() require.NoError(t, err) if c := r.countUnsettled(); c != 1 { t.Fatalf("unexpected unsettled count %d", c) } muxSem.Wait() // link credit must be zero since we only started with 1 if c := r.l.linkCredit; c != 0 { t.Fatalf("unexpected link credit %d", c) } muxSem.Release(2) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = r.AcceptMessage(ctx, msg) cancel() require.ErrorIs(t, err, context.DeadlineExceeded) muxSem.Wait() // even though we timed out waiting for the ack, the message should still be settled if c := r.countUnsettled(); c != 0 { t.Fatalf("unexpected unsettled count %d", c) } require.True(t, msg.settled) // link credit should be back to 1 if c := r.l.linkCredit; c != 1 { t.Fatalf("unexpected link credit %d", c) } muxSem.Release(-1) require.NoError(t, client.Close()) } // TODO: add unit tests for manual credit management golang-github-azure-go-amqp-1.0.2/sasl.go000066400000000000000000000170521454613650200202300ustar00rootroot00000000000000package amqp import ( "context" "fmt" "github.com/Azure/go-amqp/internal/debug" "github.com/Azure/go-amqp/internal/encoding" "github.com/Azure/go-amqp/internal/frames" ) // SASL Mechanisms const ( saslMechanismPLAIN encoding.Symbol = "PLAIN" saslMechanismANONYMOUS encoding.Symbol = "ANONYMOUS" saslMechanismEXTERNAL encoding.Symbol = "EXTERNAL" saslMechanismXOAUTH2 encoding.Symbol = "XOAUTH2" ) // SASLType represents a SASL configuration to use during authentication. type SASLType func(c *Conn) error // ConnSASLPlain enables SASL PLAIN authentication for the connection. // // SASL PLAIN transmits credentials in plain text and should only be used // on TLS/SSL enabled connection. func SASLTypePlain(username, password string) SASLType { // TODO: how widely used is hostname? should it be supported return func(c *Conn) error { // make handlers map if no other mechanism has if c.saslHandlers == nil { c.saslHandlers = make(map[encoding.Symbol]stateFunc) } // add the handler the the map c.saslHandlers[saslMechanismPLAIN] = func(ctx context.Context) (stateFunc, error) { // send saslInit with PLAIN payload init := &frames.SASLInit{ Mechanism: "PLAIN", InitialResponse: []byte("\x00" + username + "\x00" + password), Hostname: "", } fr := frames.Frame{ Type: frames.TypeSASL, Body: init, } debug.Log(1, "TX (ConnSASLPlain %p): %s", c, fr) timeout, err := c.getWriteTimeout(ctx) if err != nil { return nil, err } if err = c.writeFrame(timeout, fr); err != nil { return nil, err } // go to c.saslOutcome to handle the server response return c.saslOutcome, nil } return nil } } // ConnSASLAnonymous enables SASL ANONYMOUS authentication for the connection. func SASLTypeAnonymous() SASLType { return func(c *Conn) error { // make handlers map if no other mechanism has if c.saslHandlers == nil { c.saslHandlers = make(map[encoding.Symbol]stateFunc) } // add the handler the the map c.saslHandlers[saslMechanismANONYMOUS] = func(ctx context.Context) (stateFunc, error) { init := &frames.SASLInit{ Mechanism: saslMechanismANONYMOUS, InitialResponse: []byte("anonymous"), } fr := frames.Frame{ Type: frames.TypeSASL, Body: init, } debug.Log(1, "TX (ConnSASLAnonymous %p): %s", c, fr) timeout, err := c.getWriteTimeout(ctx) if err != nil { return nil, err } if err = c.writeFrame(timeout, fr); err != nil { return nil, err } // go to c.saslOutcome to handle the server response return c.saslOutcome, nil } return nil } } // ConnSASLExternal enables SASL EXTERNAL authentication for the connection. // The value for resp is dependent on the type of authentication (empty string is common for TLS). // See https://datatracker.ietf.org/doc/html/rfc4422#appendix-A for additional info. func SASLTypeExternal(resp string) SASLType { return func(c *Conn) error { // make handlers map if no other mechanism has if c.saslHandlers == nil { c.saslHandlers = make(map[encoding.Symbol]stateFunc) } // add the handler the the map c.saslHandlers[saslMechanismEXTERNAL] = func(ctx context.Context) (stateFunc, error) { init := &frames.SASLInit{ Mechanism: saslMechanismEXTERNAL, InitialResponse: []byte(resp), } fr := frames.Frame{ Type: frames.TypeSASL, Body: init, } debug.Log(1, "TX (ConnSASLExternal %p): %s", c, fr) timeout, err := c.getWriteTimeout(ctx) if err != nil { return nil, err } if err = c.writeFrame(timeout, fr); err != nil { return nil, err } // go to c.saslOutcome to handle the server response return c.saslOutcome, nil } return nil } } // ConnSASLXOAUTH2 enables SASL XOAUTH2 authentication for the connection. // // The saslMaxFrameSizeOverride parameter allows the limit that governs the maximum frame size this client will allow // itself to generate to be raised for the sasl-init frame only. Set this when the size of the size of the SASL XOAUTH2 // initial client response (which contains the username and bearer token) would otherwise breach the 512 byte min-max-frame-size // (http://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-transport-v1.0-os.html#definition-MIN-MAX-FRAME-SIZE). Pass -1 // to keep the default. // // SASL XOAUTH2 transmits the bearer in plain text and should only be used // on TLS/SSL enabled connection. func SASLTypeXOAUTH2(username, bearer string, saslMaxFrameSizeOverride uint32) SASLType { return func(c *Conn) error { // make handlers map if no other mechanism has if c.saslHandlers == nil { c.saslHandlers = make(map[encoding.Symbol]stateFunc) } response, err := saslXOAUTH2InitialResponse(username, bearer) if err != nil { return err } handler := saslXOAUTH2Handler{ conn: c, maxFrameSizeOverride: saslMaxFrameSizeOverride, response: response, } // add the handler the the map c.saslHandlers[saslMechanismXOAUTH2] = handler.init return nil } } type saslXOAUTH2Handler struct { conn *Conn maxFrameSizeOverride uint32 response []byte errorResponse []byte // https://developers.google.com/gmail/imap/xoauth2-protocol#error_response } func (s saslXOAUTH2Handler) init(ctx context.Context) (stateFunc, error) { originalPeerMaxFrameSize := s.conn.peerMaxFrameSize if s.maxFrameSizeOverride > s.conn.peerMaxFrameSize { s.conn.peerMaxFrameSize = s.maxFrameSizeOverride } timeout, err := s.conn.getWriteTimeout(ctx) if err != nil { return nil, err } err = s.conn.writeFrame(timeout, frames.Frame{ Type: frames.TypeSASL, Body: &frames.SASLInit{ Mechanism: saslMechanismXOAUTH2, InitialResponse: s.response, }, }) s.conn.peerMaxFrameSize = originalPeerMaxFrameSize if err != nil { return nil, err } return s.step, nil } func (s saslXOAUTH2Handler) step(ctx context.Context) (stateFunc, error) { // read challenge or outcome frame fr, err := s.conn.readFrame() if err != nil { return nil, err } switch v := fr.Body.(type) { case *frames.SASLOutcome: // check if auth succeeded if v.Code != encoding.CodeSASLOK { return nil, fmt.Errorf("SASL XOAUTH2 auth failed with code %#00x: %s : %s", v.Code, v.AdditionalData, s.errorResponse) } // return to c.negotiateProto s.conn.saslComplete = true return s.conn.negotiateProto, nil case *frames.SASLChallenge: if s.errorResponse == nil { s.errorResponse = v.Challenge timeout, err := s.conn.getWriteTimeout(ctx) if err != nil { return nil, err } // The SASL protocol requires clients to send an empty response to this challenge. err = s.conn.writeFrame(timeout, frames.Frame{ Type: frames.TypeSASL, Body: &frames.SASLResponse{ Response: []byte{}, }, }) if err != nil { return nil, err } return s.step, nil } else { return nil, fmt.Errorf("SASL XOAUTH2 unexpected additional error response received during "+ "exchange. Initial error response: %s, additional response: %s", s.errorResponse, v.Challenge) } default: return nil, fmt.Errorf("sasl: unexpected frame type %T", fr.Body) } } func saslXOAUTH2InitialResponse(username string, bearer string) ([]byte, error) { if len(bearer) == 0 { return []byte{}, fmt.Errorf("unacceptable bearer token") } for _, char := range bearer { if char < '\x20' || char > '\x7E' { return []byte{}, fmt.Errorf("unacceptable bearer token") } } for _, char := range username { if char == '\x01' { return []byte{}, fmt.Errorf("unacceptable username") } } return []byte("user=" + username + "\x01auth=Bearer " + bearer + "\x01\x01"), nil } golang-github-azure-go-amqp-1.0.2/sasl_test.go000066400000000000000000000173251454613650200212720ustar00rootroot00000000000000package amqp import ( "bytes" "context" "encoding/base64" "fmt" "strings" "testing" "time" "github.com/Azure/go-amqp/internal/buffer" "github.com/Azure/go-amqp/internal/encoding" "github.com/Azure/go-amqp/internal/frames" "github.com/Azure/go-amqp/internal/test" "github.com/Azure/go-amqp/internal/testconn" ) // Known good challenges/responses taken following specification: // https://developers.google.com/gmail/imap/xoauth2-protocol#the_sasl_xoauth2_mechanism func TestSaslXOAUTH2InitialResponse(t *testing.T) { wantedRespBase64 := "dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlYXJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMjl0Q2cBAQ==" wantedResp, err := base64.StdEncoding.DecodeString(wantedRespBase64) if err != nil { t.Fatal(err) } gotResp, err := saslXOAUTH2InitialResponse("someuser@example.com", "ya29.vF9dft4qmTc2Nvb3RlckBhdHRhdmlzdGEuY29tCg") if err != nil { t.Fatal(err) } if !bytes.Equal(wantedResp, gotResp) { t.Errorf("Initial response does not match expected:\n %s", test.Diff(gotResp, wantedResp)) } } // RFC6749 defines the OAUTH2 as comprising VSCHAR elements (\x20-7E) func TestSaslXOAUTH2InvalidBearer(t *testing.T) { tests := []struct { label string illegal string }{ { label: "char outside range", illegal: "illegalChar\x00", }, { label: "empty bearer", illegal: "", }, } for _, tt := range tests { t.Run(tt.label, func(t *testing.T) { _, err := saslXOAUTH2InitialResponse("someuser@example.com", tt.illegal) if err == nil { t.Errorf("Expected invalid bearer to be rejected") } }) } } // https://developers.google.com/gmail/imap/xoauth2-protocol gives no guidance on the formation of the username field // or even if the username is actually required. However, disallowing \x01 seems reasonable as this would interfere // with the encoding. func TestSaslXOAUTH2InvalidUsername(t *testing.T) { _, err := saslXOAUTH2InitialResponse("illegalChar\x01Within", "ya29.vF9dft4qmTc2Nvb3RlckBhdHRhdmlzdGEuY29tCg") if err == nil { t.Errorf("Expected invalid username to be rejected") } } func TestSaslXOAUTH2EmptyUsername(t *testing.T) { _, err := saslXOAUTH2InitialResponse("", "ya29.vF9dft4qmTc2Nvb3RlckBhdHRhdmlzdGEuY29tCg") if err != nil { t.Errorf("Expected empty username to be accepted") } } func TestConnSASLXOAUTH2AuthSuccess(t *testing.T) { buf, err := peerResponse( []byte("AMQP\x03\x01\x00\x00"), frames.Frame{ Type: frames.TypeSASL, Channel: 0, Body: &frames.SASLMechanisms{Mechanisms: []encoding.Symbol{saslMechanismXOAUTH2}}, }, frames.Frame{ Type: frames.TypeSASL, Channel: 0, Body: &frames.SASLOutcome{Code: encoding.CodeSASLOK}, }, []byte("AMQP\x00\x01\x00\x00"), frames.Frame{ Type: frames.TypeAMQP, Channel: 0, Body: &frames.PerformOpen{}, }, ) if err != nil { t.Fatal(err) } c := testconn.New(buf) ctx, cancel := context.WithTimeout(context.Background(), time.Second) client, err := NewConn(ctx, c, &ConnOptions{ IdleTimeout: 10 * time.Minute, SASLType: SASLTypeXOAUTH2("someuser@example.com", "ya29.vF9dft4qmTc2Nvb3RlckBhdHRhdmlzdGEuY29tCg", 512), }) cancel() if err != nil { t.Fatal(err) } defer client.Close() } func TestConnSASLXOAUTH2AuthFail(t *testing.T) { buf, err := peerResponse( []byte("AMQP\x03\x01\x00\x00"), frames.Frame{ Type: frames.TypeSASL, Channel: 0, Body: &frames.SASLMechanisms{Mechanisms: []encoding.Symbol{saslMechanismXOAUTH2}}, }, frames.Frame{ Type: frames.TypeSASL, Channel: 0, Body: &frames.SASLOutcome{Code: encoding.CodeSASLAuth}, }, ) if err != nil { t.Fatal(err) } c := testconn.New(buf) ctx, cancel := context.WithTimeout(context.Background(), time.Second) client, err := NewConn(ctx, c, &ConnOptions{ IdleTimeout: 10 * time.Minute, SASLType: SASLTypeXOAUTH2("someuser@example.com", "ya29.vF9dft4qmTc2Nvb3RlckBhdHRhdmlzdGEuY29tCg", 512), }) cancel() if err == nil { defer client.Close() } switch { case err == nil: t.Errorf("authentication is expected to fail ") case !strings.Contains(err.Error(), fmt.Sprintf("code %#00x", encoding.CodeSASLAuth)): t.Errorf("unexpected connection failure : %s", err) } } func TestConnSASLXOAUTH2AuthFailWithErrorResponse(t *testing.T) { buf, err := peerResponse( []byte("AMQP\x03\x01\x00\x00"), frames.Frame{ Type: frames.TypeSASL, Channel: 0, Body: &frames.SASLMechanisms{Mechanisms: []encoding.Symbol{saslMechanismXOAUTH2}}, }, frames.Frame{ Type: frames.TypeSASL, Channel: 0, Body: &frames.SASLChallenge{Challenge: []byte("{ \"status\":\"401\", \"schemes\":\"bearer\", \"scope\":\"https://mail.google.com/\" }")}, }, frames.Frame{ Type: frames.TypeSASL, Channel: 0, Body: &frames.SASLOutcome{Code: encoding.CodeSASLAuth}, }, ) if err != nil { t.Fatal(err) } c := testconn.New(buf) ctx, cancel := context.WithTimeout(context.Background(), time.Second) client, err := NewConn(ctx, c, &ConnOptions{ IdleTimeout: 10 * time.Minute, SASLType: SASLTypeXOAUTH2("someuser@example.com", "ya29.vF9dft4qmTc2Nvb3RlckBhdHRhdmlzdGEuY29tCg", 512), }) cancel() if err == nil { defer client.Close() } switch { case err == nil: t.Errorf("authentication is expected to fail ") case !strings.Contains(err.Error(), fmt.Sprintf("code %#00x", encoding.CodeSASLAuth)): t.Errorf("unexpected connection failure : %s", err) } } func TestConnSASLXOAUTH2AuthFailsAdditionalErrorResponse(t *testing.T) { buf, err := peerResponse( []byte("AMQP\x03\x01\x00\x00"), frames.Frame{ Type: frames.TypeSASL, Channel: 0, Body: &frames.SASLMechanisms{Mechanisms: []encoding.Symbol{saslMechanismXOAUTH2}}, }, frames.Frame{ Type: frames.TypeSASL, Channel: 0, Body: &frames.SASLChallenge{Challenge: []byte("fail1")}, }, frames.Frame{ Type: frames.TypeSASL, Channel: 0, Body: &frames.SASLChallenge{Challenge: []byte("fail2")}, }, ) if err != nil { t.Fatal(err) } c := testconn.New(buf) ctx, cancel := context.WithTimeout(context.Background(), time.Second) client, err := NewConn(ctx, c, &ConnOptions{ IdleTimeout: 10 * time.Minute, SASLType: SASLTypeXOAUTH2("someuser@example.com", "ya29.vF9dft4qmTc2Nvb3RlckBhdHRhdmlzdGEuY29tCg", 512), }) cancel() if err == nil { defer client.Close() } switch { case err == nil: t.Errorf("authentication is expected to fail ") case !strings.Contains(err.Error(), "Initial error response: fail1, additional response: fail2"): t.Errorf("unexpected connection failure : %s", err) } } func TestConnSASLExternal(t *testing.T) { buf, err := peerResponse( []byte("AMQP\x03\x01\x00\x00"), frames.Frame{ Type: frames.TypeSASL, Channel: 0, Body: &frames.SASLMechanisms{Mechanisms: []encoding.Symbol{saslMechanismEXTERNAL}}, }, frames.Frame{ Type: frames.TypeSASL, Channel: 0, Body: &frames.SASLOutcome{Code: encoding.CodeSASLOK}, }, []byte("AMQP\x00\x01\x00\x00"), frames.Frame{ Type: frames.TypeAMQP, Channel: 0, Body: &frames.PerformOpen{}, }, ) if err != nil { t.Fatal(err) } c := testconn.New(buf) ctx, cancel := context.WithTimeout(context.Background(), time.Second) client, err := NewConn(ctx, c, &ConnOptions{ IdleTimeout: 10 * time.Minute, SASLType: SASLTypeExternal(""), }) cancel() if err != nil { t.Fatal(err) } defer client.Close() } func peerResponse(items ...any) ([]byte, error) { buf := make([]byte, 0) for _, item := range items { switch v := item.(type) { case frames.Frame: b := &buffer.Buffer{} e := frames.Write(b, v) if e != nil { return buf, e } buf = append(buf, b.Bytes()...) case []byte: buf = append(buf, v...) default: return buf, fmt.Errorf("unrecongized type %T", item) } } return buf, nil } golang-github-azure-go-amqp-1.0.2/sender.go000066400000000000000000000347551454613650200205570ustar00rootroot00000000000000package amqp import ( "context" "encoding/binary" "errors" "fmt" "sync" "github.com/Azure/go-amqp/internal/buffer" "github.com/Azure/go-amqp/internal/debug" "github.com/Azure/go-amqp/internal/encoding" "github.com/Azure/go-amqp/internal/frames" ) // Sender sends messages on a single AMQP link. type Sender struct { l link transfers chan transferEnvelope // sender uses to send transfer frames mu sync.Mutex // protects buf and nextDeliveryTag buf buffer.Buffer nextDeliveryTag uint64 rollback chan struct{} } // LinkName() is the name of the link used for this Sender. func (s *Sender) LinkName() string { return s.l.key.name } // MaxMessageSize is the maximum size of a single message. func (s *Sender) MaxMessageSize() uint64 { return s.l.maxMessageSize } // SendOptions contains any optional values for the Sender.Send method. type SendOptions struct { // Indicates the message is to be sent as settled when settlement mode is SenderSettleModeMixed. // If the settlement mode is SenderSettleModeUnsettled and Settled is true, an error is returned. Settled bool } // Send sends a Message. // // Blocks until the message is sent or an error occurs. If the peer is // configured for receiver settlement mode second, the call also blocks // until the peer confirms message settlement. // // - ctx controls waiting for the message to be sent and possibly confirmed // - msg is the message to send // - opts contains optional values, pass nil to accept the defaults // // If the context's deadline expires or is cancelled before the operation // completes, the message is in an unknown state of transmission. // // Send is safe for concurrent use. Since only a single message can be // sent on a link at a time, this is most useful when settlement confirmation // has been requested (receiver settle mode is second). In this case, // additional messages can be sent while the current goroutine is waiting // for the confirmation. func (s *Sender) Send(ctx context.Context, msg *Message, opts *SendOptions) error { // check if the link is dead. while it's safe to call s.send // in this case, this will avoid some allocations etc. select { case <-s.l.done: return s.l.doneErr default: // link is still active } done, err := s.send(ctx, msg, opts) if err != nil { return err } // wait for transfer to be confirmed select { case state := <-done: if state, ok := state.(*encoding.StateRejected); ok { if state.Error != nil { return state.Error } return errors.New("the peer rejected the message without specifying an error") } return nil case <-s.l.done: return s.l.doneErr case <-ctx.Done(): // TODO: if the message is not settled and we never received a disposition, how can we consider the message as sent? return ctx.Err() } } // send is separated from Send so that the mutex unlock can be deferred without // locking the transfer confirmation that happens in Send. func (s *Sender) send(ctx context.Context, msg *Message, opts *SendOptions) (chan encoding.DeliveryState, error) { const ( maxDeliveryTagLength = 32 maxTransferFrameHeader = 66 // determined by calcMaxTransferFrameHeader ) if len(msg.DeliveryTag) > maxDeliveryTagLength { return nil, &Error{ Condition: ErrCondMessageSizeExceeded, Description: fmt.Sprintf("delivery tag is over the allowed %v bytes, len: %v", maxDeliveryTagLength, len(msg.DeliveryTag)), } } s.mu.Lock() defer s.mu.Unlock() s.buf.Reset() err := msg.Marshal(&s.buf) if err != nil { return nil, err } if s.l.maxMessageSize != 0 && uint64(s.buf.Len()) > s.l.maxMessageSize { return nil, &Error{ Condition: ErrCondMessageSizeExceeded, Description: fmt.Sprintf("encoded message size exceeds max of %d", s.l.maxMessageSize), } } senderSettled := senderSettleModeValue(s.l.senderSettleMode) == SenderSettleModeSettled if opts != nil { if opts.Settled && senderSettleModeValue(s.l.senderSettleMode) == SenderSettleModeUnsettled { return nil, errors.New("can't send message as settled when sender settlement mode is unsettled") } else if opts.Settled { senderSettled = true } } var ( maxPayloadSize = int64(s.l.session.conn.peerMaxFrameSize) - maxTransferFrameHeader ) deliveryTag := msg.DeliveryTag if len(deliveryTag) == 0 { // use uint64 encoded as []byte as deliveryTag deliveryTag = make([]byte, 8) binary.BigEndian.PutUint64(deliveryTag, s.nextDeliveryTag) s.nextDeliveryTag++ } fr := frames.PerformTransfer{ Handle: s.l.outputHandle, DeliveryID: &needsDeliveryID, DeliveryTag: deliveryTag, MessageFormat: &msg.Format, More: s.buf.Len() > 0, } for fr.More { buf, _ := s.buf.Next(maxPayloadSize) fr.Payload = append([]byte(nil), buf...) fr.More = s.buf.Len() > 0 if !fr.More { // SSM=settled: overrides RSM; no acks. // SSM=unsettled: sender should wait for receiver to ack // RSM=first: receiver considers it settled immediately, but must still send ack (SSM=unsettled only) // RSM=second: receiver sends ack and waits for return ack from sender (SSM=unsettled only) // mark final transfer as settled when sender mode is settled fr.Settled = senderSettled // set done on last frame fr.Done = make(chan encoding.DeliveryState, 1) } // NOTE: we MUST send a copy of fr here since we modify it post send frameCtx := frameContext{ Ctx: ctx, Done: make(chan struct{}), } select { case s.transfers <- transferEnvelope{FrameCtx: &frameCtx, InputHandle: s.l.inputHandle, Frame: fr}: // frame was sent to our mux case <-s.l.done: return nil, s.l.doneErr case <-ctx.Done(): return nil, &Error{Condition: ErrCondTransferLimitExceeded, Description: fmt.Sprintf("credit limit exceeded for sending link %s", s.l.key.name)} } select { case <-frameCtx.Done: if frameCtx.Err != nil { if !fr.More { select { case s.rollback <- struct{}{}: // the write never happened so signal the mux to roll back the delivery count and link credit case <-s.l.close: // the link is going down } } return nil, frameCtx.Err } // frame was written to the network case <-s.l.done: return nil, s.l.doneErr } // clear values that are only required on first message fr.DeliveryID = nil fr.DeliveryTag = nil fr.MessageFormat = nil } return fr.Done, nil } // Address returns the link's address. func (s *Sender) Address() string { if s.l.target == nil { return "" } return s.l.target.Address } // Close closes the Sender and AMQP link. // - ctx controls waiting for the peer to acknowledge the close // // If the context's deadline expires or is cancelled before the operation // completes, an error is returned. However, the operation will continue to // execute in the background. Subsequent calls will return a *LinkError // that contains the context's error message. func (s *Sender) Close(ctx context.Context) error { return s.l.closeLink(ctx) } // newSendingLink creates a new sending link and attaches it to the session func newSender(target string, session *Session, opts *SenderOptions) (*Sender, error) { l := newLink(session, encoding.RoleSender) l.target = &frames.Target{Address: target} l.source = new(frames.Source) s := &Sender{ l: l, rollback: make(chan struct{}), } if opts == nil { return s, nil } for _, v := range opts.Capabilities { s.l.source.Capabilities = append(s.l.source.Capabilities, encoding.Symbol(v)) } if opts.Durability > DurabilityUnsettledState { return nil, fmt.Errorf("invalid Durability %d", opts.Durability) } s.l.source.Durable = opts.Durability if opts.DynamicAddress { s.l.target.Address = "" s.l.dynamicAddr = opts.DynamicAddress } if opts.ExpiryPolicy != "" { if err := encoding.ValidateExpiryPolicy(opts.ExpiryPolicy); err != nil { return nil, err } s.l.source.ExpiryPolicy = opts.ExpiryPolicy } s.l.source.Timeout = opts.ExpiryTimeout if opts.Name != "" { s.l.key.name = opts.Name } if opts.Properties != nil { s.l.properties = make(map[encoding.Symbol]any) for k, v := range opts.Properties { if k == "" { return nil, errors.New("link property key must not be empty") } s.l.properties[encoding.Symbol(k)] = v } } if opts.RequestedReceiverSettleMode != nil { if rsm := *opts.RequestedReceiverSettleMode; rsm > ReceiverSettleModeSecond { return nil, fmt.Errorf("invalid RequestedReceiverSettleMode %d", rsm) } s.l.receiverSettleMode = opts.RequestedReceiverSettleMode } if opts.SettlementMode != nil { if ssm := *opts.SettlementMode; ssm > SenderSettleModeMixed { return nil, fmt.Errorf("invalid SettlementMode %d", ssm) } s.l.senderSettleMode = opts.SettlementMode } s.l.source.Address = opts.SourceAddress for _, v := range opts.TargetCapabilities { s.l.target.Capabilities = append(s.l.target.Capabilities, encoding.Symbol(v)) } if opts.TargetDurability != DurabilityNone { s.l.target.Durable = opts.TargetDurability } if opts.TargetExpiryPolicy != ExpiryPolicySessionEnd { s.l.target.ExpiryPolicy = opts.TargetExpiryPolicy } if opts.TargetExpiryTimeout != 0 { s.l.target.Timeout = opts.TargetExpiryTimeout } return s, nil } func (s *Sender) attach(ctx context.Context) error { if err := s.l.attach(ctx, func(pa *frames.PerformAttach) { pa.Role = encoding.RoleSender if pa.Target == nil { pa.Target = new(frames.Target) } pa.Target.Dynamic = s.l.dynamicAddr }, func(pa *frames.PerformAttach) { if s.l.target == nil { s.l.target = new(frames.Target) } // if dynamic address requested, copy assigned name to address if s.l.dynamicAddr && pa.Target != nil { s.l.target.Address = pa.Target.Address } }); err != nil { return err } s.transfers = make(chan transferEnvelope) return nil } type senderTestHooks struct { MuxSelect func() MuxTransfer func() } func (s *Sender) mux(hooks senderTestHooks) { if hooks.MuxSelect == nil { hooks.MuxSelect = nopHook } if hooks.MuxTransfer == nil { hooks.MuxTransfer = nopHook } defer func() { close(s.l.done) }() Loop: for { var outgoingTransfers chan transferEnvelope if s.l.linkCredit > 0 { debug.Log(1, "TX (Sender %p) (enable): target: %q, link credit: %d, deliveryCount: %d", s, s.l.target.Address, s.l.linkCredit, s.l.deliveryCount) outgoingTransfers = s.transfers } else { debug.Log(1, "TX (Sender %p) (pause): target: %q, link credit: %d, deliveryCount: %d", s, s.l.target.Address, s.l.linkCredit, s.l.deliveryCount) } closed := s.l.close if s.l.closeInProgress { // swap out channel so it no longer triggers closed = nil // disable sending once closing is in progress. // this prevents races with mux shutdown and // the peer sending disposition frames. outgoingTransfers = nil } hooks.MuxSelect() select { // received frame case q := <-s.l.rxQ.Wait(): // populated queue fr := *q.Dequeue() s.l.rxQ.Release(q) // if muxHandleFrame returns an error it means the mux must terminate. // note that in the case of a client-side close due to an error, nil // is returned in order to keep the mux running to ack the detach frame. if err := s.muxHandleFrame(fr); err != nil { s.l.doneErr = err return } // send data case env := <-outgoingTransfers: hooks.MuxTransfer() select { case s.l.session.txTransfer <- env: debug.Log(2, "TX (Sender %p): mux transfer to Session: %d, %s", s, s.l.session.channel, env.Frame) // decrement link-credit after entire message transferred if !env.Frame.More { s.l.deliveryCount++ s.l.linkCredit-- // we are the sender and we keep track of the peer's link credit debug.Log(3, "TX (Sender %p): link: %s, link credit: %d", s, s.l.key.name, s.l.linkCredit) } continue Loop case <-s.l.close: continue Loop case <-s.l.session.done: continue Loop } case <-closed: if s.l.closeInProgress { // a client-side close due to protocol error is in progress continue } // sender is being closed by the client s.l.closeInProgress = true fr := &frames.PerformDetach{ Handle: s.l.outputHandle, Closed: true, } s.l.txFrame(&frameContext{Ctx: context.Background()}, fr) case <-s.l.session.done: s.l.doneErr = s.l.session.doneErr return case <-s.rollback: s.l.deliveryCount-- s.l.linkCredit++ debug.Log(3, "TX (Sender %p): rollback link: %s, link credit: %d", s, s.l.key.name, s.l.linkCredit) } } } // muxHandleFrame processes fr based on type. // depending on the peer's RSM, it might return a disposition frame for sending func (s *Sender) muxHandleFrame(fr frames.FrameBody) error { debug.Log(2, "RX (Sender %p): %s", s, fr) switch fr := fr.(type) { // flow control frame case *frames.PerformFlow: // the sender's link-credit variable MUST be set according to this formula when flow information is given by the receiver: // link-credit(snd) := delivery-count(rcv) + link-credit(rcv) - delivery-count(snd) linkCredit := *fr.LinkCredit - s.l.deliveryCount if fr.DeliveryCount != nil { // DeliveryCount can be nil if the receiver hasn't processed // the attach. That shouldn't be the case here, but it's // what ActiveMQ does. linkCredit += *fr.DeliveryCount } s.l.linkCredit = linkCredit if !fr.Echo { return nil } var ( // copy because sent by pointer below; prevent race deliveryCount = s.l.deliveryCount ) // send flow resp := &frames.PerformFlow{ Handle: &s.l.outputHandle, DeliveryCount: &deliveryCount, LinkCredit: &linkCredit, // max number of messages } select { case s.l.session.tx <- frameBodyEnvelope{FrameCtx: &frameContext{Ctx: context.Background()}, FrameBody: resp}: debug.Log(2, "TX (Sender %p): mux frame to Session (%p): %d, %s", s, s.l.session, s.l.session.channel, resp) case <-s.l.close: return nil case <-s.l.session.done: return s.l.session.doneErr } case *frames.PerformDisposition: if fr.Settled { return nil } // peer is in mode second, so we must send confirmation of disposition. // NOTE: the ack must be sent through the session so it can close out // the in-flight disposition. dr := &frames.PerformDisposition{ Role: encoding.RoleSender, First: fr.First, Last: fr.Last, Settled: true, } select { case s.l.session.tx <- frameBodyEnvelope{FrameCtx: &frameContext{Ctx: context.Background()}, FrameBody: dr}: debug.Log(2, "TX (Sender %p): mux frame to Session (%p): %d, %s", s, s.l.session, s.l.session.channel, dr) case <-s.l.close: return nil case <-s.l.session.done: return s.l.session.doneErr } return nil default: return s.l.muxHandleFrame(fr) } return nil } golang-github-azure-go-amqp-1.0.2/sender_test.go000066400000000000000000001304121454613650200216010ustar00rootroot00000000000000package amqp import ( "context" "errors" "fmt" "reflect" "testing" "time" "github.com/Azure/go-amqp/internal/encoding" "github.com/Azure/go-amqp/internal/fake" "github.com/Azure/go-amqp/internal/frames" "github.com/Azure/go-amqp/internal/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestSenderInvalidOptions(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", &SenderOptions{ SettlementMode: SenderSettleMode(3).Ptr(), }) cancel() require.Error(t, err) require.Nil(t, snd) } func TestSenderMethodsNoSend(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch tt := req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformEnd: return newResponse(fake.PerformEnd(0, nil)) case *frames.PerformAttach: require.Equal(t, DurabilityUnsettledState, tt.Source.Durable) require.Equal(t, ExpiryPolicyNever, tt.Source.ExpiryPolicy) require.Equal(t, uint32(300), tt.Source.Timeout) return newResponse(fake.SenderAttach(0, tt.Name, 0, SenderSettleModeUnsettled)) case *frames.PerformDetach: return newResponse(fake.PerformDetach(0, 0, nil)) case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) const ( linkAddr = "addr1" linkName = "test1" ) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, linkAddr, &SenderOptions{ Name: linkName, Durability: DurabilityUnsettledState, ExpiryPolicy: ExpiryPolicyNever, ExpiryTimeout: 300, }) cancel() require.NoError(t, err) require.NotNil(t, snd) require.Equal(t, linkAddr, snd.Address()) require.Equal(t, linkName, snd.LinkName()) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) require.NoError(t, snd.Close(ctx)) cancel() require.NoError(t, client.Close()) } func TestSenderSendOnClosed(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) require.NotNil(t, snd) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) require.NoError(t, snd.Close(ctx)) cancel() // sending on a closed sender returns ErrLinkClosed var linkErr *LinkError require.ErrorAs(t, snd.Send(context.Background(), NewMessage([]byte("failed")), nil), &linkErr) require.Equal(t, "amqp: link closed", linkErr.Error()) require.NoError(t, client.Close()) } func TestSenderSendOnSessionClosed(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) require.NotNil(t, snd) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) require.NoError(t, session.Close(ctx)) cancel() // sending on a closed sender returns SessionError var sessionErr *SessionError err = snd.Send(context.Background(), NewMessage([]byte("failed")), nil) require.ErrorAs(t, err, &sessionErr) var amqpErr *Error // there should be no inner error when closed on our side require.False(t, errors.As(err, &amqpErr)) require.NoError(t, client.Close()) } func TestSenderSendConcurrentSessionClosed(t *testing.T) { muxSem := test.NewMuxSemaphore(0) netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := newSenderForSession(ctx, session, "target", nil, senderTestHooks{MuxTransfer: muxSem.OnLoop}) cancel() require.NoError(t, err) require.NotNil(t, snd) sendInitialFlowFrame(t, 0, netConn, 0, 100) sendErr := make(chan error) go func() { ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) err := snd.Send(ctx, NewMessage([]byte("failed")), nil) cancel() sendErr <- err }() muxSem.Wait() // transfer was handed off to the sender's mux and it's now paused ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) require.NoError(t, session.Close(ctx)) cancel() // resume the sender's mux muxSem.Release(-1) select { case err := <-sendErr: var sessionErr *SessionError require.ErrorAs(t, err, &sessionErr) case <-time.After(1 * time.Second): t.Fatal("timed out waiting for send error") } require.NoError(t, client.Close()) } func TestSenderSendOnConnClosed(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) require.NotNil(t, snd) require.NoError(t, client.Close()) // sending on a closed sender returns a ConnectionError err = snd.Send(context.Background(), NewMessage([]byte("failed")), nil) var connErr *ConnError if !errors.As(err, &connErr) { t.Fatalf("unexpected error type %T", err) } require.NoError(t, client.Close()) } func TestSenderSendOnDetached(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) require.NotNil(t, snd) // initiate a server-side detach const ( errcon = "detaching" errdesc = "server side detach" ) b, err := fake.PerformDetach(0, 0, &Error{Condition: errcon, Description: errdesc}) require.NoError(t, err) netConn.SendFrame(b) // sending on a detached link returns a LinkError err = snd.Send(context.Background(), NewMessage([]byte("failed")), nil) var linkErr *LinkError require.ErrorAs(t, err, &linkErr) require.Equal(t, ErrCond(errcon), linkErr.RemoteErr.Condition) require.Equal(t, errdesc, linkErr.RemoteErr.Description) require.NoError(t, client.Close()) } func TestSenderCloseTimeout(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch tt := req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformEnd: return newResponse(fake.PerformEnd(0, nil)) case *frames.PerformAttach: return newResponse(fake.SenderAttach(0, tt.Name, tt.Handle, SenderSettleModeUnsettled)) case *frames.PerformDetach: b, err := fake.PerformDetach(0, tt.Handle, nil) if err != nil { return fake.Response{}, err } // include a write delay to trigger sender close timeout return fake.Response{Payload: b, WriteDelay: 1 * time.Second}, nil case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = snd.Close(ctx) cancel() require.ErrorIs(t, err, context.DeadlineExceeded) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = snd.Close(ctx) cancel() var linkErr *LinkError require.ErrorAs(t, err, &linkErr) require.Contains(t, linkErr.Error(), context.DeadlineExceeded.Error()) require.NoError(t, client.Close()) } func TestSenderAttachError(t *testing.T) { detachAck := make(chan bool, 1) var enqueueFrames func(string) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch tt := req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformEnd: return newResponse(fake.PerformEnd(0, nil)) case *frames.PerformAttach: enqueueFrames(tt.Name) return fake.Response{}, nil case *frames.PerformDetach: // we don't need to respond to the ack detachAck <- true return fake.Response{}, nil case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) const ( errcon = "cantattach" errdesc = "server side error" ) enqueueFrames = func(n string) { // send an invalid attach response b, err := fake.EncodeFrame(frames.TypeAMQP, 0, &frames.PerformAttach{ Name: n, Role: encoding.RoleReceiver, }) require.NoError(t, err) netConn.SendFrame(b) // now follow up with a detach frame b, err = fake.EncodeFrame(frames.TypeAMQP, 0, &frames.PerformDetach{ Error: &encoding.Error{ Condition: errcon, Description: errdesc, }, }) require.NoError(t, err) netConn.SendFrame(b) } ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() var de *Error if !errors.As(err, &de) { t.Fatalf("unexpected error type %T", err) } require.Equal(t, ErrCond(errcon), de.Condition) require.Equal(t, errdesc, de.Description) require.Nil(t, snd) require.Equal(t, true, <-detachAck) require.NoError(t, client.Close()) } func TestSenderSendMismatchedModes(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", &SenderOptions{ SettlementMode: SenderSettleModeSettled.Ptr(), }) cancel() require.Error(t, err) require.Equal(t, "amqp: sender settlement mode \"settled\" requested, received \"unsettled\" from server", err.Error()) require.Nil(t, snd) require.NoError(t, client.Close()) } func TestSenderSendSuccess(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := senderFrameHandler(0, SenderSettleModeUnsettled)(remoteChannel, req) if err != nil || resp.Payload != nil { return resp, err } switch tt := req.(type) { case *frames.PerformTransfer: if tt.More { return fake.Response{}, errors.New("didn't expect more to be true") } if tt.Settled { return fake.Response{}, errors.New("didn't expect message to be settled") } if tt.MessageFormat == nil { return fake.Response{}, errors.New("unexpected nil MessageFormat") } if !reflect.DeepEqual([]byte{0, 83, 117, 160, 4, 116, 101, 115, 116}, tt.Payload) { return fake.Response{}, fmt.Errorf("unexpected payload %v", tt.Payload) } return newResponse(fake.PerformDisposition(encoding.RoleReceiver, 0, *tt.DeliveryID, nil, &encoding.StateAccepted{})) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) sendInitialFlowFrame(t, 0, netConn, 0, 100) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) require.NoError(t, snd.Send(ctx, NewMessage([]byte("test")), nil)) cancel() require.NoError(t, client.Close()) } func TestSenderSendSettled(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := senderFrameHandler(0, SenderSettleModeSettled)(remoteChannel, req) if err != nil || resp.Payload != nil { return resp, err } switch tt := req.(type) { case *frames.PerformTransfer: if tt.More { return fake.Response{}, errors.New("didn't expect more to be true") } if !tt.Settled { return fake.Response{}, errors.New("expected message to be settled") } if !reflect.DeepEqual([]byte{0, 83, 117, 160, 4, 116, 101, 115, 116}, tt.Payload) { return fake.Response{}, fmt.Errorf("unexpected payload %v", tt.Payload) } return fake.Response{}, nil default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", &SenderOptions{ SettlementMode: SenderSettleModeSettled.Ptr(), }) cancel() require.NoError(t, err) sendInitialFlowFrame(t, 0, netConn, 0, 100) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) require.NoError(t, snd.Send(ctx, NewMessage([]byte("test")), nil)) cancel() require.NoError(t, client.Close()) } func TestSenderSendSettledModeMixed(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := senderFrameHandler(0, SenderSettleModeSettled)(remoteChannel, req) if err != nil || resp.Payload != nil { return resp, err } switch tt := req.(type) { case *frames.PerformTransfer: if tt.More { return fake.Response{}, errors.New("didn't expect more to be true") } if !tt.Settled { return fake.Response{}, errors.New("expected message to be settled") } if !reflect.DeepEqual([]byte{0, 83, 117, 160, 4, 116, 101, 115, 116}, tt.Payload) { return fake.Response{}, fmt.Errorf("unexpected payload %v", tt.Payload) } return fake.Response{}, nil default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) sendInitialFlowFrame(t, 0, netConn, 0, 100) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) require.NoError(t, snd.Send(ctx, NewMessage([]byte("test")), &SendOptions{Settled: true})) cancel() require.NoError(t, client.Close()) } func TestSenderSendSettledError(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", &SenderOptions{ SettlementMode: SenderSettleModeUnsettled.Ptr(), }) cancel() require.NoError(t, err) sendInitialFlowFrame(t, 0, netConn, 0, 100) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) require.Error(t, snd.Send(ctx, NewMessage([]byte("test")), &SendOptions{Settled: true})) cancel() require.NoError(t, client.Close()) } func TestSenderSendRejectedNoDetach(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch tt := req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformEnd: return newResponse(fake.PerformEnd(0, nil)) case *frames.PerformAttach: return newResponse(fake.SenderAttach(0, tt.Name, 0, SenderSettleModeUnsettled)) case *frames.PerformTransfer: // reject first delivery if *tt.DeliveryID == 0 { return newResponse(fake.PerformDisposition(encoding.RoleReceiver, 0, *tt.DeliveryID, nil, &encoding.StateRejected{ Error: &Error{ Condition: "rejected", Description: "didn't like it", }, })) } return newResponse(fake.PerformDisposition(encoding.RoleReceiver, 0, *tt.DeliveryID, nil, &encoding.StateAccepted{})) case *frames.PerformDetach: return newResponse(fake.PerformDetach(0, 0, nil)) case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) sendInitialFlowFrame(t, 0, netConn, 0, 100) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = snd.Send(ctx, NewMessage([]byte("test")), nil) cancel() var asErr *Error if !errors.As(err, &asErr) { t.Fatalf("unexpected error type %T", err) } require.Equal(t, ErrCond("rejected"), asErr.Condition) // link should *not* be detached ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = snd.Send(ctx, NewMessage([]byte("test")), nil) cancel() require.NoError(t, err) require.NoError(t, client.Close()) } func TestSenderSendDetached(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := senderFrameHandler(0, SenderSettleModeUnsettled)(remoteChannel, req) if err != nil || resp.Payload != nil { return resp, err } switch req.(type) { case *frames.PerformTransfer: return newResponse(fake.PerformDetach(0, 0, &Error{ Condition: "detached", Description: "server exploded", })) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) sendInitialFlowFrame(t, 0, netConn, 0, 100) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = snd.Send(ctx, NewMessage([]byte("test")), nil) cancel() var linkErr *LinkError require.ErrorAs(t, err, &linkErr) require.NotNil(t, linkErr.RemoteErr) require.Equal(t, ErrCond("detached"), linkErr.RemoteErr.Condition) require.NoError(t, client.Close()) } func TestSenderSendTimeout(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) // no credits have been issued so the send will time out ctx, cancel = context.WithTimeout(context.Background(), 10*time.Millisecond) err = snd.Send(ctx, NewMessage([]byte("test")), nil) cancel() var amqpErr *Error require.ErrorAs(t, err, &amqpErr) require.EqualValues(t, ErrCondTransferLimitExceeded, amqpErr.Condition) require.NoError(t, client.Close()) } func TestSenderSendMsgTooBig(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch tt := req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformEnd: return newResponse(fake.PerformEnd(0, nil)) case *frames.PerformAttach: mode := SenderSettleModeUnsettled b, err := fake.EncodeFrame(frames.TypeAMQP, 0, &frames.PerformAttach{ Name: tt.Name, Handle: 0, Role: encoding.RoleReceiver, Target: &frames.Target{ Address: "test", Durable: encoding.DurabilityNone, ExpiryPolicy: encoding.ExpirySessionEnd, }, SenderSettleMode: &mode, MaxMessageSize: 16, // really small messages only }) if err != nil { return fake.Response{}, err } return fake.Response{Payload: b}, nil case *frames.PerformTransfer: return newResponse(fake.PerformDisposition(encoding.RoleReceiver, 0, *tt.DeliveryID, nil, &encoding.StateAccepted{})) case *frames.PerformDetach: return newResponse(fake.PerformDetach(0, 0, nil)) case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) sendInitialFlowFrame(t, 0, netConn, 0, 100) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) defer cancel() err = snd.Send(ctx, NewMessage([]byte("test message that's too big")), nil) var amqpErr *Error require.ErrorAs(t, err, &amqpErr) require.Equal(t, Error{ Condition: ErrCondMessageSizeExceeded, Description: "encoded message size exceeds max of 16", }, *amqpErr) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) defer cancel() err = snd.Send(ctx, &Message{ DeliveryTag: []byte("this delivery tag is way bigger than it can be so we'll just return a distinguish amqp.Error"), }, nil) cancel() require.ErrorAs(t, err, &amqpErr) require.Equal(t, Error{ Condition: ErrCondMessageSizeExceeded, Description: "delivery tag is over the allowed 32 bytes, len: 92", }, *amqpErr) require.NoError(t, client.Close()) } func TestSenderSendTagTooBig(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := senderFrameHandler(0, SenderSettleModeUnsettled)(remoteChannel, req) if err != nil || resp.Payload != nil { return resp, err } switch tt := req.(type) { case *frames.PerformTransfer: return newResponse(fake.PerformDisposition(encoding.RoleReceiver, 0, *tt.DeliveryID, nil, &encoding.StateAccepted{})) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) sendInitialFlowFrame(t, 0, netConn, 0, 100) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) msg := NewMessage([]byte("test")) // make the tag larger than max allowed of 32 msg.DeliveryTag = make([]byte, 33) require.Error(t, snd.Send(ctx, msg, nil)) cancel() require.NoError(t, client.Close()) } func TestSenderSendMultiTransfer(t *testing.T) { var deliveryID uint32 transferCount := 0 const maxReceiverFrameSize = 128 responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch tt := req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: b, err := fake.EncodeFrame(frames.TypeAMQP, 0, &frames.PerformOpen{ ChannelMax: 65535, ContainerID: "container", IdleTimeout: time.Minute, MaxFrameSize: maxReceiverFrameSize, // really small max frame size }) if err != nil { return fake.Response{}, err } return fake.Response{Payload: b}, nil case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformEnd: return newResponse(fake.PerformEnd(0, nil)) case *frames.PerformAttach: return newResponse(fake.SenderAttach(0, tt.Name, 0, SenderSettleModeUnsettled)) case *frames.PerformTransfer: if tt.DeliveryID != nil { // deliveryID is only sent on the first transfer frame for multi-frame transfers if transferCount != 0 { return fake.Response{}, fmt.Errorf("unexpected DeliveryID for frame number %d", transferCount) } deliveryID = *tt.DeliveryID } if tt.MessageFormat != nil && transferCount != 0 { // MessageFormat is only sent on the first transfer frame for multi-frame transfers return fake.Response{}, fmt.Errorf("unexpected MessageFormat for frame number %d", transferCount) } else if tt.MessageFormat == nil && transferCount == 0 { return fake.Response{}, errors.New("unexpected nil MessageFormat") } if tt.More { transferCount++ return fake.Response{}, nil } return newResponse(fake.PerformDisposition(encoding.RoleReceiver, 0, deliveryID, nil, &encoding.StateAccepted{})) case *frames.PerformDetach: return newResponse(fake.PerformDetach(0, 0, nil)) case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) sendInitialFlowFrame(t, 0, netConn, 0, 100) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) payload := make([]byte, maxReceiverFrameSize*4) for i := 0; i < maxReceiverFrameSize*4; i++ { payload[i] = byte(i % 256) } require.NoError(t, snd.Send(ctx, NewMessage(payload), nil)) cancel() // split up into 8 transfers due to transfer frame header size require.Equal(t, 8, transferCount) require.NoError(t, client.Close()) } func TestSenderConnReaderError(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) require.NotNil(t, snd) go func() { // trigger some kind of error netConn.ReadErr <- errors.New("failed") }() err = snd.Send(context.Background(), NewMessage([]byte("failed")), nil) var connErr *ConnError if !errors.As(err, &connErr) { t.Fatalf("unexpected error type %T", err) } err = client.Close() if !errors.As(err, &connErr) { t.Fatalf("unexpected error type %T", err) } } func TestSenderConnWriterError(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) require.NotNil(t, snd) sendInitialFlowFrame(t, 0, netConn, 0, 100) // simulate some connWriter error netConn.WriteErr <- errors.New("failed") err = snd.Send(context.Background(), NewMessage([]byte("failed")), nil) var connErr *ConnError require.ErrorAs(t, err, &connErr) require.Equal(t, "failed", connErr.Error()) err = client.Close() require.ErrorAs(t, err, &connErr) require.Equal(t, "failed", connErr.Error()) } func TestSenderFlowFrameWithEcho(t *testing.T) { linkCredit := uint32(1) echo := make(chan struct{}) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := senderFrameHandler(0, SenderSettleModeUnsettled)(remoteChannel, req) if resp.Payload != nil || err != nil { return resp, err } switch tt := req.(type) { case *frames.PerformFlow: require.False(t, tt.Echo) defer func() { close(echo) }() // here we receive the echo. verify state if id := *tt.Handle; id != 0 { return fake.Response{}, fmt.Errorf("unexpected Handle %d", id) } if dc := *tt.DeliveryCount; dc != 0 { return fake.Response{}, fmt.Errorf("unexpected DeliveryCount %d", dc) } if lc := *tt.LinkCredit; lc != linkCredit { return fake.Response{}, fmt.Errorf("unexpected LinkCredit %d", lc) } return fake.Response{}, nil default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) sender, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) nextIncomingID := uint32(1) b, err := fake.EncodeFrame(frames.TypeAMQP, 0, &frames.PerformFlow{ Handle: &sender.l.outputHandle, NextIncomingID: &nextIncomingID, IncomingWindow: 100, OutgoingWindow: 100, NextOutgoingID: 1, LinkCredit: &linkCredit, Echo: true, }) require.NoError(t, err) netConn.SendFrame(b) <-echo ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = sender.Close(ctx) cancel() require.NoError(t, err) require.NoError(t, client.Close()) } func TestNewSenderTimedOut(t *testing.T) { var senderCount uint32 responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch fr := req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformAttach: if senderCount == 0 { senderCount++ b, err := fake.SenderAttach(0, fr.Name, fr.Handle, SenderSettleModeMixed) if err != nil { return fake.Response{}, err } // include a write delay so NewSender times out return fake.Response{Payload: b, WriteDelay: 100 * time.Millisecond}, nil } return newResponse(fake.SenderAttach(0, fr.Name, fr.Handle, SenderSettleModeMixed)) case *frames.PerformDetach: return newResponse(fake.PerformDetach(0, fr.Handle, nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) // first sender fails due to deadline exceeded ctx, cancel = context.WithTimeout(context.Background(), 20*time.Millisecond) snd, err := session.NewSender(ctx, "target", nil) cancel() require.ErrorIs(t, err, context.DeadlineExceeded) require.Nil(t, snd) // should have one sender to clean up require.Len(t, session.abandonedLinks, 1) require.Len(t, session.linksByKey, 1) // creating a new sender cleans up the old one ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err = session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) require.NotNil(t, snd) require.Empty(t, session.abandonedLinks) require.Len(t, session.linksByKey, 1) } func TestNewSenderWriteError(t *testing.T) { detachAck := make(chan struct{}) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformAttach: return fake.Response{}, errors.New("write error") case *frames.PerformDetach: close(detachAck) return newResponse(fake.PerformEnd(0, nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() var connErr *ConnError require.ErrorAs(t, err, &connErr) require.Equal(t, "write error", connErr.Error()) require.Nil(t, snd) select { case <-time.After(time.Second): // expected case <-detachAck: t.Fatal("unexpected ack") } // cannot check handle count as this kills the connection } func TestNewSenderContextCancelled(t *testing.T) { senderCtx, senderCancel := context.WithCancel(context.Background()) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformEnd: return newResponse(fake.PerformEnd(0, nil)) case *frames.PerformAttach: // cancel the context to trigger early exit and clean-up senderCancel() return fake.Response{}, nil case *frames.PerformDetach: return newResponse(fake.PerformDetach(0, 0, nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) snd, err := session.NewSender(senderCtx, "target", nil) require.ErrorIs(t, err, context.Canceled) require.Nil(t, snd) } func TestSenderUnexpectedFrame(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) require.NotNil(t, snd) // senders don't receive transfer frames fr, err := fake.PerformTransfer(0, 0, 1, []byte("boom")) require.NoError(t, err) netConn.SendFrame(fr) // sender should now be dead ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) err = snd.Send(ctx, NewMessage([]byte("hello")), nil) cancel() var linkErr *LinkError require.ErrorAs(t, err, &linkErr) require.NotNil(t, linkErr.inner) require.ErrorContains(t, err, "unexpected frame *frames.PerformTransfer") require.NoError(t, client.Close()) } func TestSenderSendFails(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { resp, err := senderFrameHandler(0, SenderSettleModeUnsettled)(remoteChannel, req) if err != nil || resp.Payload != nil { return resp, err } switch req.(type) { case *frames.PerformTransfer: return fake.Response{}, errors.New("send failed") default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.NoError(t, err) const linkCredit = 100 sendInitialFlowFrame(t, 0, netConn, 0, linkCredit) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) msg := NewMessage([]byte("test")) connErr := &ConnError{} require.ErrorAs(t, snd.Send(ctx, msg, nil), &connErr) cancel() ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) require.ErrorAs(t, session.Close(ctx), &connErr) cancel() ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) require.ErrorAs(t, snd.Close(ctx), &connErr) cancel() require.ErrorAs(t, client.Close(), &connErr) } func TestSenderSendCancelled(t *testing.T) { // selectSem allows three signals: flow frame from peer, sending the transfer frame, rollback selectSem := test.NewMuxSemaphore(3) // transferSem blocks before the transfer frame is send to the session mux transferSem := test.NewMuxSemaphore(0) netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := newSenderForSession(ctx, session, "target", nil, senderTestHooks{ MuxSelect: selectSem.OnLoop, MuxTransfer: transferSem.OnLoop, }) cancel() require.NoError(t, err) require.NotNil(t, snd) const linkCredit = uint32(100) sendInitialFlowFrame(t, 0, netConn, 0, linkCredit) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) sendErr := make(chan error) go func() { sendErr <- snd.Send(ctx, NewMessage([]byte("hello")), nil) }() transferSem.Wait() // the sender's mux is now paused, cancel the context so the frame isn't written to net.Conn cancel() // close semaphore and resume mux transferSem.Release(-1) // wait for the send error require.ErrorIs(t, <-sendErr, context.Canceled) // wait for the mux to pause after receiving the rollback signal selectSem.Wait() // verify that the delivery count and link credit have been rolled back assert.Zero(t, snd.l.deliveryCount) assert.EqualValues(t, linkCredit, snd.l.linkCredit) selectSem.Release(-1) } golang-github-azure-go-amqp-1.0.2/session.go000066400000000000000000000647231454613650200207600ustar00rootroot00000000000000package amqp import ( "context" "errors" "fmt" "math" "sync" "github.com/Azure/go-amqp/internal/bitmap" "github.com/Azure/go-amqp/internal/debug" "github.com/Azure/go-amqp/internal/encoding" "github.com/Azure/go-amqp/internal/frames" "github.com/Azure/go-amqp/internal/queue" ) // Default session options const ( defaultWindow = 5000 ) // SessionOptions contains the optional settings for configuring an AMQP session. type SessionOptions struct { // MaxLinks sets the maximum number of links (Senders/Receivers) // allowed on the session. // // Minimum: 1. // Default: 4294967295. MaxLinks uint32 } // Session is an AMQP session. // // A session multiplexes Receivers. type Session struct { channel uint16 // session's local channel remoteChannel uint16 // session's remote channel, owned by conn.connReader conn *Conn // underlying conn tx chan frameBodyEnvelope // non-transfer frames to be sent; session must track disposition txTransfer chan transferEnvelope // transfer frames to be sent; session must track disposition // frames destined for this session are added to this queue by conn.connReader rxQ *queue.Holder[frames.FrameBody] // flow control incomingWindow uint32 outgoingWindow uint32 needFlowCount uint32 handleMax uint32 // link management linksMu sync.RWMutex // used to synchronize link handle allocation linksByKey map[linkKey]*link // mapping of name+role link outputHandles *bitmap.Bitmap // allocated output handles abandonedLinksMu sync.Mutex abandonedLinks []*link // used for gracefully closing session close chan struct{} // closed by calling Close(). it signals that the end performative should be sent closeOnce sync.Once // part of internal public surface area done chan struct{} // closed when the session has terminated (mux exited); DO NOT wait on this from within Session.mux() as it will never trigger! endSent chan struct{} // closed when the end performative has been sent; once this is closed, links MUST NOT send any frames! doneErr error // contains the mux error state; ONLY written to by the mux and MUST only be read from after done is closed! closeErr error // contains the error state returned from Close(); ONLY Close() reads/writes this! } func newSession(c *Conn, channel uint16, opts *SessionOptions) *Session { s := &Session{ conn: c, channel: channel, tx: make(chan frameBodyEnvelope), txTransfer: make(chan transferEnvelope), incomingWindow: defaultWindow, outgoingWindow: defaultWindow, handleMax: math.MaxUint32 - 1, linksMu: sync.RWMutex{}, linksByKey: make(map[linkKey]*link), close: make(chan struct{}), done: make(chan struct{}), endSent: make(chan struct{}), } if opts != nil { if opts.MaxLinks != 0 { // MaxLinks is the number of total links. // handleMax is the max handle ID which starts // at zero. so we decrement by one s.handleMax = opts.MaxLinks - 1 } } // create output handle map after options have been applied s.outputHandles = bitmap.New(s.handleMax) s.rxQ = queue.NewHolder(queue.New[frames.FrameBody](int(s.incomingWindow))) return s } // waitForFrame waits for an incoming frame to be queued. // it returns the next frame from the queue, or an error. // the error is either from the context or conn.doneErr. // not meant for consumption outside of session.go. func (s *Session) waitForFrame(ctx context.Context) (frames.FrameBody, error) { var q *queue.Queue[frames.FrameBody] select { case <-ctx.Done(): return nil, ctx.Err() case <-s.conn.done: return nil, s.conn.doneErr case q = <-s.rxQ.Wait(): // populated queue } fr := q.Dequeue() s.rxQ.Release(q) return *fr, nil } func (s *Session) begin(ctx context.Context) error { // send Begin to server begin := &frames.PerformBegin{ NextOutgoingID: 0, IncomingWindow: s.incomingWindow, OutgoingWindow: s.outgoingWindow, HandleMax: s.handleMax, } if err := s.txFrameAndWait(ctx, begin); err != nil { return err } // wait for response fr, err := s.waitForFrame(ctx) if err != nil { // if we exit before receiving the ack, our caller will clean up the channel. // however, it does mean that the peer will now have assigned an outgoing // channel ID that's not in use. return err } begin, ok := fr.(*frames.PerformBegin) if !ok { // this codepath is hard to hit (impossible?). if the response isn't a PerformBegin and we've not // yet seen the remote channel number, the default clause in conn.connReader will protect us from that. // if we have seen the remote channel number then it's likely the session.mux for that channel will // either swallow the frame or blow up in some other way, both causing this call to hang. // deallocate session on error. we can't call // s.Close() as the session mux hasn't started yet. debug.Log(1, "RX (Session %p): unexpected begin response frame %T", s, fr) s.conn.deleteSession(s) if err := s.conn.Close(); err != nil { return err } return &ConnError{inner: fmt.Errorf("unexpected begin response: %#v", fr)} } // start Session multiplexor go s.mux(begin) return nil } // Close closes the session. // - ctx controls waiting for the peer to acknowledge the session is closed // // If the context's deadline expires or is cancelled before the operation // completes, an error is returned. However, the operation will continue to // execute in the background. Subsequent calls will return a *SessionError // that contains the context's error message. func (s *Session) Close(ctx context.Context) error { var ctxErr error s.closeOnce.Do(func() { close(s.close) // once the mux has received the ack'ing end performative, the mux will // exit which deletes the session and closes s.done. select { case <-s.done: s.closeErr = s.doneErr case <-ctx.Done(): // notify the caller that the close timed out/was cancelled. // the mux will remain running and once the ack is received it will terminate. ctxErr = ctx.Err() // record that the close timed out/was cancelled. // subsequent calls to Close() will return this debug.Log(1, "TX (Session %p) channel %d: %v", s, s.channel, ctxErr) s.closeErr = &SessionError{inner: ctxErr} } }) if ctxErr != nil { return ctxErr } var sessionErr *SessionError if errors.As(s.closeErr, &sessionErr) && sessionErr.RemoteErr == nil && sessionErr.inner == nil { // an empty SessionError means the session was cleanly closed by the caller return nil } return s.closeErr } // txFrame sends a frame to the connWriter. // - ctx is used to provide the write deadline // - fr is the frame to write to net.Conn func (s *Session) txFrame(frameCtx *frameContext, fr frames.FrameBody) { debug.Log(2, "TX (Session %p) mux frame to Conn (%p): %s", s, s.conn, fr) s.conn.sendFrame(frameEnvelope{ FrameCtx: frameCtx, Frame: frames.Frame{ Type: frames.TypeAMQP, Channel: s.channel, Body: fr, }, }) } // txFrameAndWait sends a frame to the connWriter and waits for the write to complete // - ctx is used to provide the write deadline // - fr is the frame to write to net.Conn func (s *Session) txFrameAndWait(ctx context.Context, fr frames.FrameBody) error { frameCtx := frameContext{ Ctx: ctx, Done: make(chan struct{}), } s.txFrame(&frameCtx, fr) select { case <-frameCtx.Done: return frameCtx.Err case <-s.conn.done: return s.conn.doneErr case <-s.done: return s.doneErr } } // NewReceiver opens a new receiver link on the session. // - ctx controls waiting for the peer to create a sending terminus // - source is the name of the peer's sending terminus // - opts contains optional values, pass nil to accept the defaults // // If the context's deadline expires or is cancelled before the operation // completes, an error is returned. If the Receiver was successfully // created, it will be cleaned up in future calls to NewReceiver. func (s *Session) NewReceiver(ctx context.Context, source string, opts *ReceiverOptions) (*Receiver, error) { return newReceiverForSession(ctx, s, source, opts, receiverTestHooks{}) } // split out so tests can add hooks func newReceiverForSession(ctx context.Context, s *Session, source string, opts *ReceiverOptions, hooks receiverTestHooks) (*Receiver, error) { r, err := newReceiver(source, s, opts) if err != nil { return nil, err } if err = r.attach(ctx); err != nil { return nil, err } go r.mux(hooks) return r, nil } // NewSender opens a new sender link on the session. // - ctx controls waiting for the peer to create a receiver terminus // - target is the name of the peer's receiver terminus // - opts contains optional values, pass nil to accept the defaults // // If the context's deadline expires or is cancelled before the operation // completes, an error is returned. If the Sender was successfully // created, it will be cleaned up in future calls to NewSender. func (s *Session) NewSender(ctx context.Context, target string, opts *SenderOptions) (*Sender, error) { return newSenderForSession(ctx, s, target, opts, senderTestHooks{}) } // split out so tests can add hooks func newSenderForSession(ctx context.Context, s *Session, target string, opts *SenderOptions, hooks senderTestHooks) (*Sender, error) { l, err := newSender(target, s, opts) if err != nil { return nil, err } if err = l.attach(ctx); err != nil { return nil, err } go l.mux(hooks) return l, nil } func (s *Session) mux(remoteBegin *frames.PerformBegin) { defer func() { if s.doneErr == nil { s.doneErr = &SessionError{} } else if connErr := (&ConnError{}); !errors.As(s.doneErr, &connErr) { // only wrap non-ConnError error types var amqpErr *Error if errors.As(s.doneErr, &amqpErr) { s.doneErr = &SessionError{RemoteErr: amqpErr} } else { s.doneErr = &SessionError{inner: s.doneErr} } } // Signal goroutines waiting on the session. close(s.done) }() var ( // maps input (remote) handles to links linkFromInputHandle = make(map[uint32]*link) // maps local delivery IDs (sending transfers) to input (remote) handles inputHandleFromDeliveryID = make(map[uint32]uint32) // maps remote delivery IDs (receiving transfers) to input (remote) handles inputHandleFromRemoteDeliveryID = make(map[uint32]uint32) // maps delivery IDs to output (our) handles. used for multi-frame transfers deliveryIDFromOutputHandle = make(map[uint32]uint32) // maps delivery IDs to the settlement state channel settlementFromDeliveryID = make(map[uint32]chan encoding.DeliveryState) // tracks the next delivery ID for outgoing transfers nextDeliveryID uint32 // flow control values nextOutgoingID uint32 nextIncomingID = remoteBegin.NextOutgoingID remoteIncomingWindow = remoteBegin.IncomingWindow remoteOutgoingWindow = remoteBegin.OutgoingWindow closeInProgress bool // indicates the end performative has been sent ) closeWithError := func(e1 *Error, e2 error) { if closeInProgress { debug.Log(3, "TX (Session %p): close already pending, discarding %v", s, e1) return } closeInProgress = true s.doneErr = e2 s.txFrame(&frameContext{Ctx: context.Background()}, &frames.PerformEnd{Error: e1}) close(s.endSent) } for { txTransfer := s.txTransfer // disable txTransfer if flow control windows have been exceeded if remoteIncomingWindow == 0 || s.outgoingWindow == 0 { debug.Log(1, "TX (Session %p): disabling txTransfer - window exceeded. remoteIncomingWindow: %d outgoingWindow: %d", s, remoteIncomingWindow, s.outgoingWindow) txTransfer = nil } tx := s.tx closed := s.close if closeInProgress { // swap out channel so it no longer triggers closed = nil // once the end performative is sent, we're not allowed to send any frames tx = nil txTransfer = nil } // notes on client-side closing session // when session is closed, we must keep the mux running until the ack'ing end performative // has been received. during this window, the session is allowed to receive frames but cannot // send them. // client-side close happens either by user calling Session.Close() or due to mux initiated // close due to a violation of some invariant (see sending &Error{} to s.close). in the case // that both code paths have been triggered, we must be careful to preserve the error that // triggered the mux initiated close so it can be surfaced to the caller. select { // conn has completed, exit case <-s.conn.done: s.doneErr = s.conn.doneErr return case <-closed: if closeInProgress { // a client-side close due to protocol error is in progress continue } // session is being closed by the client closeInProgress = true s.txFrame(&frameContext{Ctx: context.Background()}, &frames.PerformEnd{}) close(s.endSent) // incoming frame case q := <-s.rxQ.Wait(): fr := *q.Dequeue() s.rxQ.Release(q) debug.Log(2, "RX (Session %p): %s", s, fr) switch body := fr.(type) { // Disposition frames can reference transfers from more than one // link. Send this frame to all of them. case *frames.PerformDisposition: start := body.First end := start if body.Last != nil { end = *body.Last } for deliveryID := start; deliveryID <= end; deliveryID++ { // find the input (remote) handle for this delivery ID. // default to the map for local delivery IDs. handles := inputHandleFromDeliveryID if body.Role == encoding.RoleSender { // the disposition frame is meant for a receiver // so look in the map for remote delivery IDs. handles = inputHandleFromRemoteDeliveryID } inputHandle, ok := handles[deliveryID] if !ok { debug.Log(2, "RX (Session %p): role %s: didn't find deliveryID %d in inputHandlesByDeliveryID map", s, body.Role, deliveryID) continue } delete(handles, deliveryID) if body.Settled && body.Role == encoding.RoleReceiver { // check if settlement confirmation was requested, if so // confirm by closing channel if done, ok := settlementFromDeliveryID[deliveryID]; ok { delete(settlementFromDeliveryID, deliveryID) select { case done <- body.State: default: } close(done) } } // now find the *link for this input (remote) handle link, ok := linkFromInputHandle[inputHandle] if !ok { closeWithError(&Error{ Condition: ErrCondUnattachedHandle, Description: "received disposition frame referencing a handle that's not in use", }, fmt.Errorf("received disposition frame with unknown link input handle %d", inputHandle)) continue } s.muxFrameToLink(link, fr) } continue case *frames.PerformFlow: if body.NextIncomingID == nil { // This is a protocol error: // "[...] MUST be set if the peer has received // the begin frame for the session" closeWithError(&Error{ Condition: ErrCondNotAllowed, Description: "next-incoming-id not set after session established", }, errors.New("protocol error: received flow without next-incoming-id after session established")) continue } // "When the endpoint receives a flow frame from its peer, // it MUST update the next-incoming-id directly from the // next-outgoing-id of the frame, and it MUST update the // remote-outgoing-window directly from the outgoing-window // of the frame." nextIncomingID = body.NextOutgoingID remoteOutgoingWindow = body.OutgoingWindow // "The remote-incoming-window is computed as follows: // // next-incoming-id(flow) + incoming-window(flow) - next-outgoing-id(endpoint) // // If the next-incoming-id field of the flow frame is not set, then remote-incoming-window is computed as follows: // // initial-outgoing-id(endpoint) + incoming-window(flow) - next-outgoing-id(endpoint)" remoteIncomingWindow = body.IncomingWindow - nextOutgoingID remoteIncomingWindow += *body.NextIncomingID debug.Log(3, "RX (Session %p): flow - remoteOutgoingWindow: %d remoteIncomingWindow: %d nextOutgoingID: %d", s, remoteOutgoingWindow, remoteIncomingWindow, nextOutgoingID) // Send to link if handle is set if body.Handle != nil { link, ok := linkFromInputHandle[*body.Handle] if !ok { closeWithError(&Error{ Condition: ErrCondUnattachedHandle, Description: "received flow frame referencing a handle that's not in use", }, fmt.Errorf("received flow frame with unknown link handle %d", body.Handle)) continue } s.muxFrameToLink(link, fr) continue } if body.Echo && !closeInProgress { niID := nextIncomingID resp := &frames.PerformFlow{ NextIncomingID: &niID, IncomingWindow: s.incomingWindow, NextOutgoingID: nextOutgoingID, OutgoingWindow: s.outgoingWindow, } s.txFrame(&frameContext{Ctx: context.Background()}, resp) } case *frames.PerformAttach: // On Attach response link should be looked up by name, then added // to the links map with the remote's handle contained in this // attach frame. // // Note body.Role is the remote peer's role, we reverse for the local key. s.linksMu.RLock() link, linkOk := s.linksByKey[linkKey{name: body.Name, role: !body.Role}] s.linksMu.RUnlock() if !linkOk { closeWithError(&Error{ Condition: ErrCondNotAllowed, Description: "received mismatched attach frame", }, fmt.Errorf("protocol error: received mismatched attach frame %+v", body)) continue } // track the input (remote) handle number for this link. // note that it might be a different value than our output handle. link.inputHandle = body.Handle linkFromInputHandle[link.inputHandle] = link s.muxFrameToLink(link, fr) debug.Log(1, "RX (Session %p): link %s attached, input handle %d, output handle %d", s, link.key.name, link.inputHandle, link.outputHandle) case *frames.PerformTransfer: s.needFlowCount++ // "Upon receiving a transfer, the receiving endpoint will // increment the next-incoming-id to match the implicit // transfer-id of the incoming transfer plus one, as well // as decrementing the remote-outgoing-window, and MAY // (depending on policy) decrement its incoming-window." nextIncomingID++ // don't loop to intmax if remoteOutgoingWindow > 0 { remoteOutgoingWindow-- } link, ok := linkFromInputHandle[body.Handle] if !ok { closeWithError(&Error{ Condition: ErrCondUnattachedHandle, Description: "received transfer frame referencing a handle that's not in use", }, fmt.Errorf("received transfer frame with unknown link handle %d", body.Handle)) continue } s.muxFrameToLink(link, fr) // if this message is received unsettled and link rcv-settle-mode == second, add to handlesByRemoteDeliveryID if !body.Settled && body.DeliveryID != nil && link.receiverSettleMode != nil && *link.receiverSettleMode == ReceiverSettleModeSecond { debug.Log(1, "RX (Session %p): adding handle %d to inputHandleFromRemoteDeliveryID. remote delivery ID: %d", s, body.Handle, *body.DeliveryID) inputHandleFromRemoteDeliveryID[*body.DeliveryID] = body.Handle } // Update peer's outgoing window if half has been consumed. if s.needFlowCount >= s.incomingWindow/2 && !closeInProgress { debug.Log(3, "RX (Session %p): channel %d: flow - s.needFlowCount(%d) >= s.incomingWindow(%d)/2\n", s, s.channel, s.needFlowCount, s.incomingWindow) s.needFlowCount = 0 nID := nextIncomingID flow := &frames.PerformFlow{ NextIncomingID: &nID, IncomingWindow: s.incomingWindow, NextOutgoingID: nextOutgoingID, OutgoingWindow: s.outgoingWindow, } s.txFrame(&frameContext{Ctx: context.Background()}, flow) } case *frames.PerformDetach: link, ok := linkFromInputHandle[body.Handle] if !ok { closeWithError(&Error{ Condition: ErrCondUnattachedHandle, Description: "received detach frame referencing a handle that's not in use", }, fmt.Errorf("received detach frame with unknown link handle %d", body.Handle)) continue } s.muxFrameToLink(link, fr) // we received a detach frame and sent it to the link. // this was either the response to a client-side initiated // detach or our peer detached us. either way, now that // the link has processed the frame it's detached so we // are safe to clean up its state. delete(linkFromInputHandle, link.inputHandle) delete(deliveryIDFromOutputHandle, link.outputHandle) s.deallocateHandle(link) case *frames.PerformEnd: // there are two possibilities: // - this is the ack to a client-side Close() // - the peer is ending the session so we must ack if closeInProgress { return } // peer detached us with an error, save it and send the ack if body.Error != nil { s.doneErr = body.Error } fr := frames.PerformEnd{} s.txFrame(&frameContext{Ctx: context.Background()}, &fr) // per spec, when end is received, we're no longer allowed to receive frames return default: debug.Log(1, "RX (Session %p): unexpected frame: %s\n", s, body) closeWithError(&Error{ Condition: ErrCondInternalError, Description: "session received unexpected frame", }, fmt.Errorf("internal error: unexpected frame %T", body)) } case env := <-txTransfer: fr := &env.Frame // record current delivery ID var deliveryID uint32 if fr.DeliveryID == &needsDeliveryID { deliveryID = nextDeliveryID fr.DeliveryID = &deliveryID nextDeliveryID++ deliveryIDFromOutputHandle[fr.Handle] = deliveryID if !fr.Settled { inputHandleFromDeliveryID[deliveryID] = env.InputHandle } } else { // if fr.DeliveryID is nil it must have been added // to deliveryIDByHandle already (multi-frame transfer) deliveryID = deliveryIDFromOutputHandle[fr.Handle] } // log after the delivery ID has been assigned debug.Log(2, "TX (Session %p): %d, %s", s, s.channel, fr) // frame has been sender-settled, remove from map. // this should only come into play for multi-frame transfers. if fr.Settled { delete(inputHandleFromDeliveryID, deliveryID) } s.txFrame(env.FrameCtx, fr) select { case <-env.FrameCtx.Done: if env.FrameCtx.Err != nil { // transfer wasn't sent, don't update state continue } // transfer was written to the network case <-s.conn.done: // the write failed, Conn is going down continue } // if not settled, add done chan to map if !fr.Settled && fr.Done != nil { settlementFromDeliveryID[deliveryID] = fr.Done } else if fr.Done != nil { // sender-settled, close done now that the transfer has been sent close(fr.Done) } // "Upon sending a transfer, the sending endpoint will increment // its next-outgoing-id, decrement its remote-incoming-window, // and MAY (depending on policy) decrement its outgoing-window." nextOutgoingID++ // don't decrement if we're at 0 or we could loop to int max if remoteIncomingWindow != 0 { remoteIncomingWindow-- } case env := <-tx: fr := env.FrameBody debug.Log(2, "TX (Session %p): %d, %s", s, s.channel, fr) switch fr := env.FrameBody.(type) { case *frames.PerformDisposition: if fr.Settled && fr.Role == encoding.RoleSender { // sender with a peer that's in mode second; sending confirmation of disposition. // disposition frames can reference a range of delivery IDs, although it's highly // likely in this case there will only be one. start := fr.First end := start if fr.Last != nil { end = *fr.Last } for deliveryID := start; deliveryID <= end; deliveryID++ { // send delivery state to the channel and close it to signal // that the delivery has completed. if done, ok := settlementFromDeliveryID[deliveryID]; ok { delete(settlementFromDeliveryID, deliveryID) select { case done <- fr.State: default: } close(done) } } } s.txFrame(env.FrameCtx, fr) case *frames.PerformFlow: niID := nextIncomingID fr.NextIncomingID = &niID fr.IncomingWindow = s.incomingWindow fr.NextOutgoingID = nextOutgoingID fr.OutgoingWindow = s.outgoingWindow s.txFrame(env.FrameCtx, fr) case *frames.PerformTransfer: panic("transfer frames must use txTransfer") default: s.txFrame(env.FrameCtx, fr) } } } } func (s *Session) allocateHandle(ctx context.Context, l *link) error { s.linksMu.Lock() defer s.linksMu.Unlock() // Check if link name already exists, if so then an error should be returned existing := s.linksByKey[l.key] if existing != nil { return fmt.Errorf("link with name '%v' already exists", l.key.name) } next, ok := s.outputHandles.Next() if !ok { if err := s.Close(ctx); err != nil { return err } // handle numbers are zero-based, report the actual count return &SessionError{inner: fmt.Errorf("reached session handle max (%d)", s.handleMax+1)} } l.outputHandle = next // allocate handle to the link s.linksByKey[l.key] = l // add to mapping return nil } func (s *Session) deallocateHandle(l *link) { s.linksMu.Lock() defer s.linksMu.Unlock() delete(s.linksByKey, l.key) s.outputHandles.Remove(l.outputHandle) } func (s *Session) abandonLink(l *link) { s.abandonedLinksMu.Lock() defer s.abandonedLinksMu.Unlock() s.abandonedLinks = append(s.abandonedLinks, l) } func (s *Session) freeAbandonedLinks(ctx context.Context) error { s.abandonedLinksMu.Lock() defer s.abandonedLinksMu.Unlock() debug.Log(3, "TX (Session %p): cleaning up %d abandoned links", s, len(s.abandonedLinks)) for _, l := range s.abandonedLinks { dr := &frames.PerformDetach{ Handle: l.outputHandle, Closed: true, } if err := s.txFrameAndWait(ctx, dr); err != nil { return err } } s.abandonedLinks = nil return nil } func (s *Session) muxFrameToLink(l *link, fr frames.FrameBody) { q := l.rxQ.Acquire() q.Enqueue(fr) l.rxQ.Release(q) debug.Log(2, "RX (Session %p): mux frame to link (%p): %s, %s", s, l, l.key.name, fr) } // transferEnvelope is used by senders to send transfer frames type transferEnvelope struct { FrameCtx *frameContext // the link's remote handle InputHandle uint32 Frame frames.PerformTransfer } // frameBodyEnvelope is used by senders and receivers to send frames. type frameBodyEnvelope struct { FrameCtx *frameContext FrameBody frames.FrameBody } // the address of this var is a sentinel value indicating // that a transfer frame is in need of a delivery ID var needsDeliveryID uint32 golang-github-azure-go-amqp-1.0.2/session_test.go000066400000000000000000000522721454613650200220130ustar00rootroot00000000000000package amqp import ( "context" "fmt" "testing" "time" "github.com/Azure/go-amqp/internal/encoding" "github.com/Azure/go-amqp/internal/fake" "github.com/Azure/go-amqp/internal/frames" "github.com/stretchr/testify/require" ) func TestSessionClose(t *testing.T) { channelNum := uint16(0) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: b, err := fake.PerformBegin(uint16(channelNum), remoteChannel) if err != nil { return fake.Response{}, err } channelNum++ return fake.Response{Payload: b}, nil case *frames.PerformEnd: // channelNum was incremented b, err := fake.PerformEnd(channelNum-1, nil) if err != nil { return fake.Response{}, err } channelNum-- return fake.Response{Payload: b}, nil case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) for i := 0; i < 4; i++ { ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoErrorf(t, err, "iteration %d", i) require.Equalf(t, uint16(0), session.channel, "iteration %d", i) require.Equalf(t, channelNum-1, session.remoteChannel, "iteration %d", i) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) err = session.Close(ctx) cancel() require.NoErrorf(t, err, "iteration %d", i) } require.NoError(t, client.Close()) } func TestSessionServerClose(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformEnd: return fake.Response{}, nil // swallow case *frames.PerformClose: return fake.Response{}, nil // swallow default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) // initiate server-side closing of session fr, err := fake.PerformEnd(0, &encoding.Error{Condition: "closing", Description: "server side close"}) require.NoError(t, err) netConn.SendFrame(fr) // wait a bit for connReader to read from the mock time.Sleep(100 * time.Millisecond) ctx, cancel = context.WithTimeout(context.Background(), time.Second) err = session.Close(ctx) cancel() require.Error(t, err) var sessionErr *SessionError require.ErrorAs(t, err, &sessionErr) require.NotNil(t, sessionErr.RemoteErr) require.Equal(t, ErrCond("closing"), sessionErr.RemoteErr.Condition) require.Equal(t, "server side close", sessionErr.RemoteErr.Description) require.NoError(t, client.Close()) } func TestSessionCloseTimeout(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformEnd: b, err := fake.PerformEnd(0, nil) if err != nil { return fake.Response{}, err } // introduce a delay to trigger session close timeout return fake.Response{Payload: b, WriteDelay: 1 * time.Second}, nil case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = session.Close(ctx) cancel() require.ErrorIs(t, err, context.DeadlineExceeded) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = session.Close(ctx) cancel() var sessionErr *SessionError require.ErrorAs(t, err, &sessionErr) require.Contains(t, sessionErr.Error(), context.DeadlineExceeded.Error()) require.NoError(t, client.Close()) } func TestConnCloseSessionClose(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) require.NoError(t, client.Close()) // closing the connection should close all sessions select { case <-session.done: // session was closed case <-time.After(500 * time.Millisecond): t.Fatal("session wasn't closed") } rcv, err := session.NewReceiver(context.Background(), "blah", nil) require.Nil(t, rcv) var connErr *ConnError require.ErrorAs(t, err, &connErr) } func TestSessionNewReceiverBadOptionFails(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) recv, err := session.NewReceiver(ctx, "source", &ReceiverOptions{ Properties: map[string]any{ "": "bad_key", }, }) cancel() require.Error(t, err) require.Nil(t, recv) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = session.Close(ctx) cancel() require.NoError(t, err) require.NoError(t, client.Close()) } func TestSessionNewReceiverMismatchedLinkName(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformEnd: return newResponse(fake.PerformEnd(0, nil)) case *frames.PerformAttach: return newResponse(fake.ReceiverAttach(0, "wrong_name", 0, ReceiverSettleModeFirst, nil)) case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) recv, err := session.NewReceiver(ctx, "source", &ReceiverOptions{ Credit: 10, }) cancel() require.Error(t, err) require.Nil(t, recv) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = session.Close(ctx) cancel() require.Error(t, err) require.NoError(t, client.Close()) } func TestSessionNewSenderBadOptionFails(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", &SenderOptions{ Properties: map[string]any{ "": "bad_key", }, }) cancel() require.Error(t, err) require.Nil(t, snd) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = session.Close(ctx) cancel() require.NoError(t, err) require.NoError(t, client.Close()) } func TestSessionNewSenderMismatchedLinkName(t *testing.T) { responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformEnd: return newResponse(fake.PerformEnd(0, nil)) case *frames.PerformAttach: return newResponse(fake.SenderAttach(0, "wrong_name", 0, SenderSettleModeUnsettled)) case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.Error(t, err) require.Nil(t, snd) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = session.Close(ctx) cancel() require.Error(t, err) require.NoError(t, client.Close()) } func TestSessionNewSenderDuplicateLinks(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", &SenderOptions{ Name: "test", }) cancel() require.NoError(t, err) require.NotNil(t, snd) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err = session.NewSender(ctx, "target", &SenderOptions{ Name: "test", }) cancel() require.Error(t, err) require.Nil(t, snd) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = session.Close(ctx) cancel() require.NoError(t, err) require.NoError(t, client.Close()) } func TestSessionNewSenderMaxHandles(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, &SessionOptions{MaxLinks: 1}) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", &SenderOptions{ Name: "test1", }) cancel() require.NoError(t, err) require.NotNil(t, snd) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err = session.NewSender(ctx, "target", &SenderOptions{ Name: "test2", }) cancel() require.Error(t, err) require.Nil(t, snd) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = session.Close(ctx) cancel() require.NoError(t, err) require.NoError(t, client.Close()) } func TestSessionUnexpectedFrame(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) // this frame causes the session to terminate b, err := fake.EncodeFrame(frames.TypeSASL, 0, &frames.SASLMechanisms{}) require.NoError(t, err) netConn.SendFrame(b) // sleep for a bit so that the session mux has time to process the invalid frame before we close time.Sleep(50 * time.Millisecond) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) err = session.Close(ctx) cancel() require.Error(t, err) var sessionErr *SessionError require.ErrorAs(t, err, &sessionErr) require.NotNil(t, sessionErr.inner) require.ErrorContains(t, err, "unexpected frame *frames.SASLMechanisms") require.NoError(t, client.Close()) } func TestSessionInvalidFlowFrame(t *testing.T) { netConn := fake.NewNetConn(senderFrameHandlerNoUnhandled(0, SenderSettleModeUnsettled)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) // NextIncomingID cannot be nil once the session has been established b, err := fake.EncodeFrame(frames.TypeAMQP, 0, &frames.PerformFlow{}) require.NoError(t, err) netConn.SendFrame(b) // wait a bit for connReader to read from the mock time.Sleep(100 * time.Millisecond) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = session.Close(ctx) cancel() require.Error(t, err) require.NoError(t, client.Close()) } func TestSessionFlowFrameWithEcho(t *testing.T) { nextIncomingID := uint32(1) const nextOutgoingID = 2 echo := make(chan struct{}) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch tt := req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformFlow: defer func() { close(echo) }() // here we receive the echo. verify state if id := *tt.NextIncomingID; id != nextOutgoingID { return fake.Response{}, fmt.Errorf("unexpected NextIncomingID %d", id) } if id := tt.NextOutgoingID; id != 0 { return fake.Response{}, fmt.Errorf("unexpected NextOutgoingID %d", id) } if w := tt.IncomingWindow; w != defaultWindow { return fake.Response{}, fmt.Errorf("unexpected IncomingWindow %d", w) } if w := tt.OutgoingWindow; w != defaultWindow { return fake.Response{}, fmt.Errorf("unexpected OutgoingWindow %d", w) } return fake.Response{}, nil case *frames.PerformEnd: return newResponse(fake.PerformEnd(0, nil)) case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) b, err := fake.EncodeFrame(frames.TypeAMQP, 0, &frames.PerformFlow{ NextIncomingID: &nextIncomingID, IncomingWindow: 100, OutgoingWindow: 100, NextOutgoingID: nextOutgoingID, Echo: true, }) require.NoError(t, err) netConn.SendFrame(b) ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond) err = session.Close(ctx) cancel() require.NoError(t, err) require.NoError(t, client.Close()) } func TestSessionInvalidAttachDeadlock(t *testing.T) { var enqueueFrames func(string) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch tt := req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformBegin: return newResponse(fake.PerformBegin(0, remoteChannel)) case *frames.PerformEnd: return newResponse(fake.PerformEnd(0, nil)) case *frames.PerformAttach: enqueueFrames(tt.Name) return fake.Response{}, nil case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, netConn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) enqueueFrames = func(n string) { // send an invalid attach response b, err := fake.EncodeFrame(frames.TypeAMQP, 0, &frames.PerformAttach{ Name: "mismatched", Role: encoding.RoleReceiver, }) require.NoError(t, err) netConn.SendFrame(b) // now follow up with a detach frame b, err = fake.EncodeFrame(frames.TypeAMQP, 0, &frames.PerformDetach{ Error: &encoding.Error{ Condition: "boom", Description: "failed", }, }) require.NoError(t, err) netConn.SendFrame(b) } ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) snd, err := session.NewSender(ctx, "target", nil) cancel() require.Error(t, err) require.Nil(t, snd) require.NoError(t, client.Close()) } func TestNewSessionContextCancelled(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) responder := func(remoteChannel uint16, req frames.FrameBody) (fake.Response, error) { switch req.(type) { case *fake.AMQPProto: return newResponse(fake.ProtoHeader(fake.ProtoAMQP)) case *frames.PerformOpen: return newResponse(fake.PerformOpen("container")) case *frames.PerformClose: return newResponse(fake.PerformClose(nil)) case *frames.PerformBegin: cancel() // swallow frame to prevent non-determinism of cancellation return fake.Response{}, nil case *fake.KeepAlive: return fake.Response{}, nil default: return fake.Response{}, fmt.Errorf("unhandled frame %T", req) } } netConn := fake.NewNetConn(responder) newCtx, newCancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(newCtx, netConn, nil) newCancel() require.NoError(t, err) session, err := client.NewSession(ctx, nil) require.ErrorIs(t, err, context.Canceled) require.Nil(t, session) } func TestSessionReceiveTransferNoHandle(t *testing.T) { conn := fake.NewNetConn(receiverFrameHandlerNoUnhandled(0, ReceiverSettleModeFirst)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) // send transfer when there's no link b, err := fake.PerformTransfer(0, 0, 1, []byte("message 1")) require.NoError(t, err) conn.SendFrame(b) // wait for the messages to "arrive" time.Sleep(time.Second) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) var sessionErr *SessionError require.ErrorAs(t, session.Close(ctx), &sessionErr) require.Contains(t, sessionErr.Error(), "transfer frame with unknown link handle") cancel() } func TestSessionReceiveDetachrNoHandle(t *testing.T) { conn := fake.NewNetConn(receiverFrameHandlerNoUnhandled(0, ReceiverSettleModeFirst)) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) client, err := NewConn(ctx, conn, nil) cancel() require.NoError(t, err) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) session, err := client.NewSession(ctx, nil) cancel() require.NoError(t, err) // send transfer when there's no link b, err := fake.PerformDetach(0, 0, nil) require.NoError(t, err) conn.SendFrame(b) // wait for the messages to "arrive" time.Sleep(time.Second) ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) var sessionErr *SessionError require.ErrorAs(t, session.Close(ctx), &sessionErr) require.Contains(t, sessionErr.Error(), "detach frame with unknown link handle") cancel() }