Skip to main content

File parser and writer for optical time-domain reflectometry interchange files (Bellcore SOR)

Project description

otdrs

otdrs is a Rust implementation of a SOR file parser and generator. SOR files are used as a storage format for optical time-domain reflectometry (OTDR) tests, which are commonly used to characterise and validate the proper construction of fibre optic networks. SOR is formally known as the Bellcore OTDR interchange format, specified in Telcordia SR-4731, a proprietary standard. OTDR testing involves firing short pulses of light down fibres under test, and measuring the intensity of returned light over time.

otdrs is intended as a minimal but valid and robust parser implementation to enable a translation from the closed binary format to open, self-documenting formats, to permit easy development of analysis tools without having to deal with the complexities of managing a binary format that is broadly undocumented and difficult to parse. It also provides Rust primitives for OTDR files and a writer to allow files to be loaded, modified, and written back.

Wherever possible, translation preserves the input format; otdrs does not try to fix peculiarities of particular test equipment or post-processing software or work around quirks in their input, except where they would break parsing of the format. No normalisation is attempted.

Where the parser cannot reliably extract information it is omitted; in this sense, otdrs is a best-effort parser.

Writing of files is performed with as much care as possible and the optional checksum block is computed. Generated files open without issue in several professional applications, and proprietary data is preserved losslessly.

Rust was chosen for its robustness, type-safety, and the excellent nom parser library. serde is used for serialisation for output.

Rust Cargo Downloads Python

Usage

otdrs takes one positional argument, the path to a SOR file. Its output is a single JSON or CBOR blob which contains the information within the SOR file; flags are used to set the output path (default is stdout) or the format to output. otdrs --help shows the available options.

A post-processing example is shown in the demo.py script in this repository, which will plot the data from an OTDR file.

Installing

If you have Rust/Cargo installed you can install otdrs with cargo install otdrs. otdrs is not otherwise packaged currently.

Library Usage

You can use otdrs as a Rust library to read, modify, and write SOR files. For instance, the following minimal program will modify the fiber ID and cable ID of the file, and print the nominal wavelength of the file to the terminal.

use otdrs::parser::parse_file;
use std::fs::File;
use std::io::prelude::*;
fn main() -> std::io::Result<()>  {
    // Read the file into memory
    let mut in_file = File::open("input.sor")?;
    let mut in_data = Vec::new();
    in_file.read_to_end(&mut in_data)?;
    // Parse the file
    let mut sor = parse_file(&in_data).unwrap().1;
    // Most blocks are Options because the parser can't guarantee them
    // This is true even of "required" blocks in the spec, because otdrs is permissive.
    match sor.general_parameters.as_mut() {
        Some(mut gp) => {
            // If we've got a block we can read and modify it!
            println!("Nominal wavelength of this SOR record: {:?}", gp.nominal_wavelength);
            gp.fiber_id = "Hello world";
            gp.cable_id = "Foo bar";
            // Note that we don't check the values you write a valid, outside of type enforcement
            // Even then you need to be careful to adhere to the spec. e.g. no UTF-8 glyphs
            // No emojis in your comments field 😭😭😭
        }
        None => {
            println!("Your SOR file has no General Parameters block!")
        }
    }
    // Encode the SORFile structure to a binary SOR file again...
    // Note you'd normally want to handle errors properly here, but we're an example, so...
    let bytes_to_write = sor.to_bytes().unwrap();
    // Write the file out to disk!
    let mut out_file = File::create("output.sor").unwrap();
    out_file.write_all(&bytes_to_write)?;
    return Ok(());
}

Python module

otdrs is also available as a Python module, with limited functionality. Currently, reading SOR files is supported.

import otdrs
sor_from_file = otdrs.parse_file("input.sor")
sor_from_file.fixed_parameters.acquisition_offset #=> returns the acquisition offset, and so on
file = open("input.sor", "rb")
sor_from_bytes = otdrs.parse_bytes(file.read())
sor_from_bytes == sor_from_file #=> True

The resulting objects and methods are fully type hinted.

Checksums and file validation

otdrs computes checksums when generating SOR file bytes, and can be used to validate checksums after files are parsed.

Checksums are optional and most software doesn't either produce or validate them, but otdrs will try several strategies (given the vagueness of the spec) to match any supplied checksum against bytes in the file, and return an enum containing details of the match. Callers can then surface this information or ignore it.

Code Quality, Conformance/Compliance

This is the author's first major Rust project, so use with caution.

This is absolutely not guaranteed to work in all cases with all files or produce correct output in all cases (or indeed any). Check the output with the files you're using and a known-good viewer if you care about what you're doing.

Security Considerations

As otdrs handles arbitrary binary input and performs some arithmetic on it which can potentially lead to underruns and overruns as well as exciting undefined behaviour.

While Rust is a very good language to write such tools in, since runtime errors such as this are handled, otdrs makes an effort to avoid obvious situations where slice pointers violate bounds or where arithmetic on SOR contents may lead to unexpected situations. cargo-fuzz is used to fuzz with libFuzzer (on Linux only at present) to discover scenarios in which this can occur, including through writing and round-tripping OTDR files and structure-aware fuzzing. AFL can also be used for fuzzing, though given the large binary inputs this isn't recommended.

Checking of result validity is not performed on all fields, and users of the tool should take care to avoid trusting input parsed from SOR files. Sanitise your inputs.

Known Issues

  • The "link parameters" block is not currently decoded, as the author does not have files which contain it for testing. This is not used in common OTDR sets.
  • Testing is not as comprehensive and extensive as it should be, particularly for writing files.

There is no application of fixed scaling factors described in SR-4731. This is generally intentional, to permit correct post-processing as required in other applications.

Proprietary Blocks

While SOR files are standardised, not all of the content is; there are a set of standard and required blocks for the basic information, and otdrs only attempts to parse the standard blocks in a SOR file.

The content of proprietary blocks is dumped for analysis by upstream tools that may either have knowledge of proprietary formats or wish to simply know of the existence of such blocks. The map block will in all cases list all blocks within the file.

Writing SORs

otdrs has experimental support for generating SORs from Rust data structures. Strictly, the map block is heavily recomputed when writing; a BlockInfo block with a revision number and header will be expected for all blocks, but sizes and counters are dynamically generated. This is because it is practically impossible (or very difficult, at least) to compute sizes before serialising data, so this is best done at the point of writing.

Editors are responsible for ensuring that any modification of data elsewhere in the file makes sense, e.g. if the number of points within a DataPointsAtScaleFactor struct is changed, then the n_points field must be amended by the editor; otdrs will not do this for you.

Currently, landmarks and LinkParameters are not written out, as these are very rarely used in practice and no example data is currently available to support testing.

Testing

The parser has been tested on SOR files generated from:

  • Noyes OFL280 OTDRs, including those re-exported from EXFO FastReporter3
  • Anritsu Access Master OTDRs
  • EXFO MaxTester 730C and FTB-4/FTBx730 OTDRs
  • EXFO iOLM files exported to SOR from EXFO FastReporter3
  • EXFO 735C-SM7R modules in centralised PON test deployments (shooting through splitters to high-reflectance devices)

Round-trip testing has also confirmed that all of the above files can be read and written out by otdrs with no loss or alteration of data.

Further test files are desired and should be submitted to the author or as a pull request with tests against known values.

Interpretation

To actually interpet any of this data correctly you are probably going to need to read SR-4731, which can be found here for around $750.

This parser makes no attempt to correctly interpret the resulting data from the SOR file format, merely to make it accessible for applications to perform correct interpretation. Actually locating events and measuring cable data based on OTDR data requires careful consideration of data offsets (e.g. front panel to user offset, scaling factors, etc).

Vendor Quirks

As with pretty much every standard out there, every vendor has interpreted it differently. For one example, some Noyes OTDRs store a 30 second averaging period as 3000 whereas EXFO and Anritsu record it as 30. The specification, of course, says this should be stored as 300. Professional software struggles with this - for instance, EXFO's FastReporter3 software misinterprets the Noyes result.

Documentation of storage quirks compared to "standard" behaviour such as the above, against known behaviour would be helpful for those developing post-processing software; if you have access to test equipment, you can helpfully run a controlled test, write down the actual values displayed by the tester etc and store the SOR file directly.

While "fixing" vendor quirks to generate a standards-compliant output is not currently in the scope of otdrs, this is something that could be added as an optional post-processing step.

Versions

  • 1.0.5 - License change from GPLv3 to LGPLv3
  • 1.0.4 - Python module type hints, dependency fix
  • 1.0.3 - Python module fixes
  • 1.0.2 - Python module added as an optional feature
  • 1.0.1 - upgraded nom to 8.0.0, clap to 4.x
  • 1.0.0 - refactored to avoid some beginner Rust errors; SORFile now owns its data. Updated dependencies.
  • 0.4.2 - upgraded nom to 7.1.0, clap to 3.0.0-rc7
  • 0.4.1 - upgraded nom to 6.1.2, improved README and demo scripts
  • 0.4.0 - added SORFile#to_bytes and a whole bunch of related functions and macros which altogether mean that otdrs can now write OTDR files
  • 0.3.0 - switched to using clap for command-line argument handling for better error handling, added option to write to file instead of stdout and added CBOR export support
  • 0.2.0 - restructured to allow use as a library, added fuzzing and fixed a number of bounds-check/error propogation problems
  • 0.1.0 - initial release

License

Versions of otdrs up to 1.0.4 were licensed under the GPL version 3. GPLv3 was selected specifically to drive improved open source engagement with equipment manufacturers and developers of OTDR processing software in an industry that has struggled with open data exchange, proprietary (and vendor-locked) software, and poor maintenance of existing software.

Version 1.0.5 onwards is licensed under the LGPL version 3, which unambiguously allows use of otdrs as a library in proprietary tools and services, to encourage use of open-source tooling in proprietary services.

otdrs - a SOR file parsing tool Copyright (C) 2021, 2022, 2023, 2025 James Harrison

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

otdrs-1.1.0.tar.gz (665.4 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

otdrs-1.1.0-cp313-cp313t-win_amd64.whl (222.4 kB view details)

Uploaded CPython 3.13tWindows x86-64

otdrs-1.1.0-cp313-cp313t-win32.whl (208.0 kB view details)

Uploaded CPython 3.13tWindows x86

otdrs-1.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl (544.7 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ x86-64

otdrs-1.1.0-cp313-cp313t-musllinux_1_2_i686.whl (573.4 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ i686

otdrs-1.1.0-cp313-cp313t-musllinux_1_2_armv7l.whl (637.2 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARMv7l

otdrs-1.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl (549.1 kB view details)

Uploaded CPython 3.13tmusllinux: musl 1.2+ ARM64

otdrs-1.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (327.4 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ x86-64

otdrs-1.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl (354.9 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ i686

otdrs-1.1.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (302.1 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ ARMv7l

otdrs-1.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (311.5 kB view details)

Uploaded CPython 3.13tmanylinux: glibc 2.17+ ARM64

otdrs-1.1.0-cp313-cp313t-macosx_11_0_arm64.whl (333.0 kB view details)

Uploaded CPython 3.13tmacOS 11.0+ ARM64

otdrs-1.1.0-cp313-cp313t-macosx_10_12_x86_64.whl (345.2 kB view details)

Uploaded CPython 3.13tmacOS 10.12+ x86-64

otdrs-1.1.0-cp37-abi3-win_amd64.whl (225.2 kB view details)

Uploaded CPython 3.7+Windows x86-64

otdrs-1.1.0-cp37-abi3-win32.whl (212.1 kB view details)

Uploaded CPython 3.7+Windows x86

otdrs-1.1.0-cp37-abi3-musllinux_1_2_x86_64.whl (549.4 kB view details)

Uploaded CPython 3.7+musllinux: musl 1.2+ x86-64

otdrs-1.1.0-cp37-abi3-musllinux_1_2_i686.whl (579.1 kB view details)

Uploaded CPython 3.7+musllinux: musl 1.2+ i686

otdrs-1.1.0-cp37-abi3-musllinux_1_2_armv7l.whl (642.3 kB view details)

Uploaded CPython 3.7+musllinux: musl 1.2+ ARMv7l

otdrs-1.1.0-cp37-abi3-musllinux_1_2_aarch64.whl (552.5 kB view details)

Uploaded CPython 3.7+musllinux: musl 1.2+ ARM64

otdrs-1.1.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (332.4 kB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ x86-64

otdrs-1.1.0-cp37-abi3-manylinux_2_17_i686.manylinux2014_i686.whl (360.2 kB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ i686

otdrs-1.1.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (305.5 kB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ ARMv7l

otdrs-1.1.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (315.6 kB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ ARM64

otdrs-1.1.0-cp37-abi3-macosx_11_0_arm64.whl (346.2 kB view details)

Uploaded CPython 3.7+macOS 11.0+ ARM64

otdrs-1.1.0-cp37-abi3-macosx_10_12_x86_64.whl (358.4 kB view details)

Uploaded CPython 3.7+macOS 10.12+ x86-64

File details

Details for the file otdrs-1.1.0.tar.gz.

File metadata

  • Download URL: otdrs-1.1.0.tar.gz
  • Upload date:
  • Size: 665.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for otdrs-1.1.0.tar.gz
Algorithm Hash digest
SHA256 27e7b4ef49b0d2b6e1fa75d22749306500644b274a53a57cf3bccfcb03a29c27
MD5 ea34c9d8b3f841f5b7e460770853055e
BLAKE2b-256 2642853b1b0cedd7ea61500bb864f9cfa05ee0afa6070ff92ec4bf6e2efbba36

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp313-cp313t-win_amd64.whl.

File metadata

  • Download URL: otdrs-1.1.0-cp313-cp313t-win_amd64.whl
  • Upload date:
  • Size: 222.4 kB
  • Tags: CPython 3.13t, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for otdrs-1.1.0-cp313-cp313t-win_amd64.whl
Algorithm Hash digest
SHA256 5a8e264a41869f227b86a352d630885fce1564e1209d312808e70321980d7b0b
MD5 4686850bbb5eee58dc3b8523ae3952b3
BLAKE2b-256 8fc3dc538fc3dfc562bbcd6eafe511feb5010e4b5494f6f26b144fa71f5a9c92

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp313-cp313t-win32.whl.

File metadata

  • Download URL: otdrs-1.1.0-cp313-cp313t-win32.whl
  • Upload date:
  • Size: 208.0 kB
  • Tags: CPython 3.13t, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for otdrs-1.1.0-cp313-cp313t-win32.whl
Algorithm Hash digest
SHA256 3c7ef71df9937306c31914efb3058937b306b877b4961ce5066ed261f0f9d869
MD5 decbaf6993e4c41bb9543e3c9897f144
BLAKE2b-256 b384fabc61e021e7e9ed40f23d9811835ce40d676e1981dbe74fb6a40281a04d

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 91c408f00dc3c63d2b112555ba2221a79f9ba19e4d788515af54c340f4442c07
MD5 e893f0c8541e6ffcc9d51ab90c07952f
BLAKE2b-256 a6db82a8040653f52de1d8cc3df4d432b71d88bdbe78026c7b2ee10bfac8cce7

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp313-cp313t-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp313-cp313t-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 3549c90e9b13f03b5f98f46bcbfcc0fe369dc3fe6c1fc66ead4f81557c1c8912
MD5 a7dda62665b3d686d19611395347f24b
BLAKE2b-256 73f285ac194ddea787205713b14e9bc7ae82cae8fa744eda05574472e1a67051

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp313-cp313t-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp313-cp313t-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 1ba3862f30d6186d7b595168d6ed25df82f6724dff79cc5f3c20652de13101e2
MD5 bc5319d791b12a77783a98dd33f67a09
BLAKE2b-256 06334bb864276e6c24e95b762ab360280634841dc0728c33023b7d2db6cf2d71

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 819fafc8d59b0b0f833ef60b55dbe31908832608aec8b3a4fb5ff01aafcd6d4e
MD5 979e2d80c0573a734aa52c2fb37a1efb
BLAKE2b-256 24e46ea706c33ac15cb19e57a992fb9c2cbd5b366a7fc0397ebbc88614c8e90d

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c30815a66ae64a7444f8c93f9b0c7528507751a6676f8f6be2ca88c9f523619c
MD5 5e79980efdf41485bd2f26e4e380f672
BLAKE2b-256 25f193dd76fd00a6c47d531fb7d471255bfa8a5b1a57b4ffc9e67713119a1d21

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 3cf830f7999762a5a6bf6aa8bbb61a0208842cfa7885aee19eabbef266f363e7
MD5 e4d3fc22238f9641f9508c285c8046a5
BLAKE2b-256 55003459c866358a36b3e38e729ca357e3ed3461fb0ed2a3dbef890e3cd9c800

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 6002c09a4fd26ba385e605b7a19e3d3864f96bbfba4ed08bd944bc6bee8451bf
MD5 76bd5e735fef775d672376b19a78180e
BLAKE2b-256 cf5ae5a6ccdf8160e78e2a199b0e7d79fd6466d5877780c4b5ae36ad7a545384

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c7c0a31bc854fb091fe0c15f3a939e7642ad37c862e4d034e446d3def010f9db
MD5 942a45901bea59d24ac910ea33d92689
BLAKE2b-256 475640e3c27c8982fc954c5238eaf8a82baa45d6c42c9c3545fba3879999d5f2

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp313-cp313t-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp313-cp313t-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 562b0683258debe84d58c81792ba1a1359f75c7c6092afa8f858b63e8ec5a3a5
MD5 57eea33839edeb2f35046e8f63066acc
BLAKE2b-256 bff6890b36349544545379a1d33a39d8f75785dad2cb137094a85516c9e8f94e

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp313-cp313t-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp313-cp313t-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 984675cefd62065a50792ea7c4e3e345d8135be217906b93de3382841b4d69a9
MD5 52c26ae3f3bf23a59702c34f99b41961
BLAKE2b-256 dafb3d8acdc8247db9bafc0e6bb84fc92d7fe91f46866216e463e7e0c30a9b5e

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp37-abi3-win_amd64.whl.

File metadata

  • Download URL: otdrs-1.1.0-cp37-abi3-win_amd64.whl
  • Upload date:
  • Size: 225.2 kB
  • Tags: CPython 3.7+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for otdrs-1.1.0-cp37-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 657e2760453b2a1b35ea8c1aad05d3d4977b42dd49d484770f14eee91401d403
MD5 620667a26bcaaf2149b1f843d7aafacd
BLAKE2b-256 3ba1e3eb8e6b7e31800624b6b00cce67eabf268e990c8cbc27c381a1a9fb1cc3

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp37-abi3-win32.whl.

File metadata

  • Download URL: otdrs-1.1.0-cp37-abi3-win32.whl
  • Upload date:
  • Size: 212.1 kB
  • Tags: CPython 3.7+, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.9.3

File hashes

Hashes for otdrs-1.1.0-cp37-abi3-win32.whl
Algorithm Hash digest
SHA256 7bf161977a3c427a5042464e0182b527dbdbe4d96541b6761c11d5585c019e47
MD5 7a5cd735a16162a6aeed52e3aa3e3ddf
BLAKE2b-256 006491893a3dc898f978f166d44829b97929deb01ac25747843dd81a6ac548bc

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp37-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp37-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 cf46cffcf6ab68da86fbe5a899fd6b7da34888b0b0f2090c03e6313d6b440ef4
MD5 1b6e87d77ed084f23f13bcdde178d106
BLAKE2b-256 180455ad681c985c25ad62eb39e056fa87d58ca365ef110987454d6c17c18a7d

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp37-abi3-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp37-abi3-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 2ca0321ebd11dab4cbde32c4f44ad57460f43361c0afb6069c3f23007bf8e60f
MD5 f1d8959d5925987ad4ac9716d2fa1be9
BLAKE2b-256 422b4404b6e9798329dbc460c875837acdc96e249a6b22ff43580da4ad871fa7

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp37-abi3-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp37-abi3-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 bd65788a33416beaf625422ec1698d596fb31305a08b9a5099db7a8c8c4f0b7d
MD5 287889b60c7ef76e8b40b9e5618d92eb
BLAKE2b-256 1d9a5a6490f991c22375cd99185e84381d5338a465cb22bf62494d645e7c25e5

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp37-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp37-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 47ca6db401d014fbdd72d60bf28ce93c2e7899e3cf4bfcdb4963b5ced7eed16d
MD5 9c6bdc35cf8bc29f4ff747b1090555b2
BLAKE2b-256 523264264861dcefe6225504437066540834da45e12f04967b8ea868a202d439

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 17d13447b93037a6436d063af4da16bf51c7558687b10941f04c4429e587296b
MD5 777af9eaae194c8d259aca12cebb9ce5
BLAKE2b-256 afc5fe4114f67b53f7c59287196c618cbb55d0f6ed60e15804cba8d22daddced

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp37-abi3-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp37-abi3-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 dea72df6fd6175fb7be1389c06a48f7f337b62bfd1ee5c3e83f948fbec02154f
MD5 02100ce7825c3e8f19ca4a37ca70c96e
BLAKE2b-256 59604f055f610f532b068938f9902f3318316b45306873990c8f7da142dc6822

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 b1ec122df28ed26763e67fbccac2d8da47e22143ca5bede8fa1a14b6a813e5fb
MD5 2d436310313108f22e1854cc08db39ea
BLAKE2b-256 b54b19204fc83c9ad770ac20395ae3ad480171d837d0eac7aacbd1e5cf649221

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 83f28995b512ee7c56b3fd7976d51b49418b2564ca3ecedfdf1169c0af674b7f
MD5 ea1590a33e31a48c3a948b42e48a01d7
BLAKE2b-256 439f3c55fd7c5ed2285bacffc52bf1adc88991f17ef68b3d9e98a79cd6103e45

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp37-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp37-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b103a5acb52686db78a5bea94d26abac1b77dc173e19768edf3d75b405cb3f74
MD5 c39b0b8b2a87944b18d4b20d04858bd2
BLAKE2b-256 f3e741bf310418008907604d19f6a7cfc9af7e5db978ef1fb9f4f170903a85a8

See more details on using hashes here.

File details

Details for the file otdrs-1.1.0-cp37-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for otdrs-1.1.0-cp37-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 18b1771165175effc3df1898aa6366032498d6d5cbddb27cea0c90817e2b022f
MD5 6d1e63725b4a81ce7c62da8671c359cd
BLAKE2b-256 7e37d68edf9c9b93c42ca08a9628274ef4d0256db6aabdb5b2990f47f6fd2b1a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page