-
Notifications
You must be signed in to change notification settings - Fork 231
Description
this problem of "phantom imports" from here WebAssembly/component-model#295 (comment) https://github.com/jcbhmr/unicode-math-class.wasm/actions/runs/7631660252
package typst-community:unicode-math-class@2.0.0+0.1.0;
interface types {
/// <https://docs.rs/unicode-math-class/0.1.0/unicode_math_class/enum.MathClass.html>
enum math-class {
normal,
alphabetic,
binary,
closing,
diacritic,
fence,
glyph-part,
large,
opening,
punctuation,
relation,
space,
unary,
vary,
special,
}
}
/// <https://docs.rs/unicode-math-class/0.1.0/unicode_math_class/>
world unicode-math-class {
export types;
use types.{math-class};
/// <https://docs.rs/unicode-math-class/0.1.0/unicode_math_class/constant.REVISION.html>
export revision: func() -> u8;
/// <https://docs.rs/unicode-math-class/0.1.0/unicode_math_class/fn.class.html>
export class: func(c: string) -> option<math-class>;
}
mod my_macros;
cargo_component_bindings::generate!();
use my_macros::rs_wit_parallel_enum;
use unicode_math_class;
pub struct Component;
impl bindings::Guest for Component {
fn revision() -> u8 {
unicode_math_class::REVISION
}
fn class(c: String) -> Option<bindings::MathClass> {
let c = c.chars().next().expect("non-empty string");
unicode_math_class::class(c).map(|x| x.into())
}
}
rs_wit_parallel_enum!(unicode_math_class::MathClass, bindings::MathClass, {
Normal,
Alphabetic,
Binary,
Closing,
Diacritic,
Fence,
GlyphPart,
Large,
Opening,
Punctuation,
Relation,
Space,
Unary,
Vary,
Special,
});
// wasm-tools component wit
package root:component;
world root {
import typst-community:unicode-math-class/types@2.0.0+0.1.0;
use typst-community:unicode-math-class/types@2.0.0+0.1.0.{math-class};
export revision: func() -> u8;
export class: func(c: string) -> option<math-class>;
export typst-community:unicode-math-class/types@2.0.0+0.1.0;
}
has happened to me again in a much worse way; cargo-component (which uses wit-bindgen iirc) is using this phantom imported type instead of the locally declared exported type which has the needed data (the 0
th tuple item) that i need to use to perform various library operations.
here's the wit:
im trying to provide bindings for this https://docs.rs/subsetter/latest/subsetter/ rust crate in wit
package typst-community:subsetter@1.0.0+0.1.1;
interface types {
resource profile {
pdf: static func(glyphs: list<u16>) -> profile;
}
record tag {
tuple0: tuple<u8, u8, u8, u8>,
}
variant error {
unknown-kind,
invalid-offset,
missing-data,
invalid-data,
missing-table(tag),
}
}
world subsetter {
export types;
use types.{profile, tag, error};
export subset: func(data: list<u8>, index: u32, profile: profile) -> result<list<u8>, error>;
}
and here's the code
cargo_component_bindings::generate!();
use bindings::exports::typst_community::subsetter::types;
use subsetter;
pub struct Component;
impl bindings::Guest for Component {
// SHOULD BE using the bindings::exports::* stuff
// fn subset(data: Vec<u8>, index: u32, profile: types::Profile) -> Result<Vec<u8>, types::Error> {
// todo!()
// }
// BUT IS using the IMPORTED types which means I can't extract the
// inner tuple 0 item from the profile struct to operate on it
fn subset(
data: Vec<u8>,
index: u32,
profile: bindings::typst_community::subsetter::types::Profile,
) -> Result<Vec<u8>, bindings::typst_community::subsetter::types::Error> {
todo!()
}
}
pub struct Profile(subsetter::Profile<'static>);
impl types::GuestProfile for Profile {
fn pdf(glyphs: Vec<u16>) -> types::OwnProfile {
todo!()
}
}
and when that compiles (with using the rust code as shown above) it gives some weird wit when using wasm-tools component wit
@jcbhmr ➜ /workspaces/subsetter.wasm (main) $ wasm-tools component wit ./target/wasm32-unknown-unknown/debug/subsetter.wasm
package root:component;
world root {
import typst-community:subsetter/types@1.0.0+0.1.1;
use typst-community:subsetter/types@1.0.0+0.1.1.{profile, tag, error};
export subset: func(data: list<u8>, index: u32, profile: profile) -> result<list<u8>, error>;
export typst-community:subsetter/types@1.0.0+0.1.1;
}
reproduction: https://github.com/jcbhmr/subsetter.wasm/tree/9b1d7c65a48bdb9a92f6d3bf48ee97b8485fbb64
basically what i understand to be happening in error is that the use types.{...}
is somehow importing the things from the interface types {}
? and then when it generates the rust bindings.rs it generates the imported types and then uses those imported types instead of the exported types that i want it to use.
the end result is that i cannot get the profile.0
. 🤷♂️
idk if im even explaining this right or what. all i know is that the types that i want and the types that i got are mismatched and idk what to do if this is a bug or if this is how WIT is supposed to work or what lol
cc @lukewagner
bindings.rs copy pasted here
// Generated by `wit-bindgen` 0.16.0. DO NOT EDIT!
pub type Profile = typst_community::subsetter::types::Profile;
pub type Error = typst_community::subsetter::types::Error;
const _: () = {
#[doc(hidden)]
#[export_name = "subset"]
#[allow(non_snake_case)]
unsafe extern "C" fn __export_subset(arg0: i32,arg1: i32,arg2: i32,arg3: i32,) -> i32 {
#[allow(unused_imports)]
use ::cargo_component_bindings::rt::{alloc, vec::Vec, string::String};
// Before executing any other code, use this function to run all static
// constructors, if they have not yet been run. This is a hack required
// to work around wasi-libc ctors calling import functions to initialize
// the environment.
//
// This functionality will be removed once rust 1.69.0 is stable, at which
// point wasi-libc will no longer have this behavior.
//
// See
// https://github.com/bytecodealliance/preview2-prototyping/issues/99
// for more details.
#[cfg(target_arch="wasm32")]
::cargo_component_bindings::rt::run_ctors_once();
let len0 = arg1 as usize;
let result1 = <_GuestImpl as Guest>::subset(Vec::from_raw_parts(arg0 as *mut _, len0, len0), arg2 as u32, typst_community::subsetter::types::Profile::from_handle(arg3 as u32));
let ptr2 = _RET_AREA.0.as_mut_ptr() as i32;
match result1 {
Ok(e) => { {
*((ptr2 + 0) as *mut u8) = (0i32) as u8;
let vec3 = (e).into_boxed_slice();
let ptr3 = vec3.as_ptr() as i32;
let len3 = vec3.len() as i32;
::core::mem::forget(vec3);
*((ptr2 + 8) as *mut i32) = len3;
*((ptr2 + 4) as *mut i32) = ptr3;
} },
Err(e) => { {
*((ptr2 + 0) as *mut u8) = (1i32) as u8;
use typst_community::subsetter::types::Error as V6;
match e {
V6::UnknownKind=> {
{
*((ptr2 + 4) as *mut u8) = (0i32) as u8;
}
}
V6::InvalidOffset=> {
{
*((ptr2 + 4) as *mut u8) = (1i32) as u8;
}
}
V6::MissingData=> {
{
*((ptr2 + 4) as *mut u8) = (2i32) as u8;
}
}
V6::InvalidData=> {
{
*((ptr2 + 4) as *mut u8) = (3i32) as u8;
}
}
V6::MissingTable(e) => {
*((ptr2 + 4) as *mut u8) = (4i32) as u8;
let typst_community::subsetter::types::Tag{ tuple0:tuple04, } = e;
let (t5_0, t5_1, t5_2, t5_3, ) = tuple04;
*((ptr2 + 5) as *mut u8) = (::cargo_component_bindings::rt::as_i32(t5_0)) as u8;
*((ptr2 + 6) as *mut u8) = (::cargo_component_bindings::rt::as_i32(t5_1)) as u8;
*((ptr2 + 7) as *mut u8) = (::cargo_component_bindings::rt::as_i32(t5_2)) as u8;
*((ptr2 + 8) as *mut u8) = (::cargo_component_bindings::rt::as_i32(t5_3)) as u8;
},
}
} },
};ptr2
}
const _: () = {
#[doc(hidden)]
#[export_name = "cabi_post_subset"]
#[allow(non_snake_case)]
unsafe extern "C" fn __post_return_subset(arg0: i32,) {
let l0 = i32::from(*((arg0 + 0) as *const u8));
match l0 {
0 => {
let l1 = *((arg0 + 4) as *const i32);
let l2 = *((arg0 + 8) as *const i32);
let base3 = l1;
let len3 = l2;
::cargo_component_bindings::rt::dealloc(base3, (len3 as usize) * 1, 1);
},
_ => (),
}
}
};
};
use super::Component as _GuestImpl;
pub trait Guest {
fn subset(data: ::cargo_component_bindings::rt::vec::Vec::<u8>,index: u32,profile: Profile,) -> Result<::cargo_component_bindings::rt::vec::Vec::<u8>,Error>;
}
#[allow(unused_imports)]
use ::cargo_component_bindings::rt::{alloc, vec::Vec, string::String};
#[repr(align(4))]
struct _RetArea([u8; 12]);
static mut _RET_AREA: _RetArea = _RetArea([0; 12]);
pub mod typst_community {
pub mod subsetter {
#[allow(clippy::all)]
pub mod types {
#[used]
#[doc(hidden)]
#[cfg(target_arch = "wasm32")]
static __FORCE_SECTION_REF: fn() = super::super::super::__link_section;
#[derive(Debug)]
#[repr(transparent)]
pub struct Profile{
handle: ::cargo_component_bindings::rt::Resource<Profile>,
}
impl Profile{
#[doc(hidden)]
pub unsafe fn from_handle(handle: u32) -> Self {
Self {
handle: ::cargo_component_bindings::rt::Resource::from_handle(handle),
}
}
#[doc(hidden)]
pub fn into_handle(self) -> u32 {
::cargo_component_bindings::rt::Resource::into_handle(self.handle)
}
#[doc(hidden)]
pub fn handle(&self) -> u32 {
::cargo_component_bindings::rt::Resource::handle(&self.handle)
}
}
unsafe impl ::cargo_component_bindings::rt::WasmResource for Profile{
#[inline]
unsafe fn drop(_handle: u32) {
#[cfg(not(target_arch = "wasm32"))]
unreachable!();
#[cfg(target_arch = "wasm32")]
{
#[link(wasm_import_module = "typst-community:subsetter/[email protected]+0.1.1")]
extern "C" {
#[link_name = "[resource-drop]profile"]
fn drop(_: u32);
}
drop(_handle);
}
}
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct Tag {
pub tuple0: (u8,u8,u8,u8,),
}
impl ::core::fmt::Debug for Tag {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
f.debug_struct("Tag").field("tuple0", &self.tuple0).finish()
}
}
#[derive(Clone, Copy)]
pub enum Error{
UnknownKind,
InvalidOffset,
MissingData,
InvalidData,
MissingTable(Tag),
}
impl ::core::fmt::Debug for Error {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
match self {
Error::UnknownKind => {
f.debug_tuple("Error::UnknownKind").finish()
}
Error::InvalidOffset => {
f.debug_tuple("Error::InvalidOffset").finish()
}
Error::MissingData => {
f.debug_tuple("Error::MissingData").finish()
}
Error::InvalidData => {
f.debug_tuple("Error::InvalidData").finish()
}
Error::MissingTable(e) => {
f.debug_tuple("Error::MissingTable").field(e).finish()
}
}
}
}
impl ::core::fmt::Display for Error {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
write!(f, "{:?}", self)
}
}
impl std::error::Error for Error {}
impl Profile {
#[allow(unused_unsafe, clippy::all)]
pub fn pdf(glyphs: &[u16],) -> Profile{
#[allow(unused_imports)]
use ::cargo_component_bindings::rt::{alloc, vec::Vec, string::String};
unsafe {
let vec0 = glyphs;
let ptr0 = vec0.as_ptr() as i32;
let len0 = vec0.len() as i32;
#[cfg(target_arch = "wasm32")]
#[link(wasm_import_module = "typst-community:subsetter/[email protected]+0.1.1")]
extern "C" {
#[link_name = "[static]profile.pdf"]
fn wit_import(_: i32, _: i32, ) -> i32;
}
#[cfg(not(target_arch = "wasm32"))]
fn wit_import(_: i32, _: i32, ) -> i32{ unreachable!() }
let ret = wit_import(ptr0, len0);
Profile::from_handle(ret as u32)
}
}
}
}
}
}
pub mod exports {
pub mod typst_community {
pub mod subsetter {
#[allow(clippy::all)]
pub mod types {
#[used]
#[doc(hidden)]
#[cfg(target_arch = "wasm32")]
static __FORCE_SECTION_REF: fn() = super::super::super::super::__link_section;
pub use super::super::super::super::super::Profile as Profile;
const _: () = {
#[doc(hidden)]
#[export_name = "typst-community:subsetter/[email protected]+0.1.1#[dtor]profile"]
#[allow(non_snake_case)]
unsafe extern "C" fn dtor(rep: usize) {
::cargo_component_bindings::rt::Resource::<Profile>::dtor(rep)
}
};
unsafe impl ::cargo_component_bindings::rt::RustResource for Profile{
unsafe fn new(_rep: usize) -> u32 {
#[cfg(not(target_arch = "wasm32"))]
unreachable!();
#[cfg(target_arch = "wasm32")]
{
#[link(wasm_import_module = "[export]typst-community:subsetter/[email protected]+0.1.1")]
extern "C" {
#[link_name = "[resource-new]profile"]
fn new(_: usize) -> u32;
}
new(_rep)
}
}
unsafe fn rep(_handle: u32) -> usize {
#[cfg(not(target_arch = "wasm32"))]
unreachable!();
#[cfg(target_arch = "wasm32")]
{
#[link(wasm_import_module = "[export]typst-community:subsetter/[email protected]+0.1.1")]
extern "C" {
#[link_name = "[resource-rep]profile"]
fn rep(_: u32) -> usize;
}
rep(_handle)
}
}
}
pub type OwnProfile = ::cargo_component_bindings::rt::Resource<Profile>;
unsafe impl ::cargo_component_bindings::rt::WasmResource for Profile{
#[inline]
unsafe fn drop(_handle: u32) {
#[cfg(not(target_arch = "wasm32"))]
unreachable!();
#[cfg(target_arch = "wasm32")]
{
#[link(wasm_import_module = "[export]typst-community:subsetter/[email protected]+0.1.1")]
extern "C" {
#[link_name = "[resource-drop]profile"]
fn drop(_: u32);
}
drop(_handle);
}
}
}
#[repr(C)]
#[derive(Clone, Copy)]
pub struct Tag {
pub tuple0: (u8,u8,u8,u8,),
}
impl ::core::fmt::Debug for Tag {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
f.debug_struct("Tag").field("tuple0", &self.tuple0).finish()
}
}
#[derive(Clone, Copy)]
pub enum Error{
UnknownKind,
InvalidOffset,
MissingData,
InvalidData,
MissingTable(Tag),
}
impl ::core::fmt::Debug for Error {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
match self {
Error::UnknownKind => {
f.debug_tuple("Error::UnknownKind").finish()
}
Error::InvalidOffset => {
f.debug_tuple("Error::InvalidOffset").finish()
}
Error::MissingData => {
f.debug_tuple("Error::MissingData").finish()
}
Error::InvalidData => {
f.debug_tuple("Error::InvalidData").finish()
}
Error::MissingTable(e) => {
f.debug_tuple("Error::MissingTable").field(e).finish()
}
}
}
}
impl ::core::fmt::Display for Error {
fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
write!(f, "{:?}", self)
}
}
impl std::error::Error for Error {}
const _: () = {
#[doc(hidden)]
#[export_name = "typst-community:subsetter/[email protected]+0.1.1#[static]profile.pdf"]
#[allow(non_snake_case)]
unsafe extern "C" fn __export_static_profile_pdf(arg0: i32,arg1: i32,) -> i32 {
#[allow(unused_imports)]
use ::cargo_component_bindings::rt::{alloc, vec::Vec, string::String};
// Before executing any other code, use this function to run all static
// constructors, if they have not yet been run. This is a hack required
// to work around wasi-libc ctors calling import functions to initialize
// the environment.
//
// This functionality will be removed once rust 1.69.0 is stable, at which
// point wasi-libc will no longer have this behavior.
//
// See
// https://github.com/bytecodealliance/preview2-prototyping/issues/99
// for more details.
#[cfg(target_arch="wasm32")]
::cargo_component_bindings::rt::run_ctors_once();
let len0 = arg1 as usize;
let result1 = <_ProfileImpl as GuestProfile>::pdf(Vec::from_raw_parts(arg0 as *mut _, len0, len0));
::cargo_component_bindings::rt::Resource::into_handle(result1) as i32
}
};
use super::super::super::super::super::Profile as _ProfileImpl;
pub trait GuestProfile {
fn pdf(glyphs: ::cargo_component_bindings::rt::vec::Vec::<u16>,) -> OwnProfile;
}
}
}
}
}
#[cfg(target_arch = "wasm32")]
#[link_section = "component-type:subsetter"]
#[doc(hidden)]
pub static __WIT_BINDGEN_COMPONENT_TYPE: [u8; 998] = [3, 0, 9, 115, 117, 98, 115, 101, 116, 116, 101, 114, 0, 97, 115, 109, 13, 0, 1, 0, 7, 229, 1, 1, 65, 2, 1, 66, 10, 4, 0, 7, 112, 114, 111, 102, 105, 108, 101, 3, 1, 1, 111, 4, 125, 125, 125, 125, 1, 114, 1, 6, 116, 117, 112, 108, 101, 48, 1, 4, 0, 3, 116, 97, 103, 3, 0, 2, 1, 113, 5, 12, 117, 110, 107, 110, 111, 119, 110, 45, 107, 105, 110, 100, 0, 0, 14, 105, 110, 118, 97, 108, 105, 100, 45, 111, 102, 102, 115, 101, 116, 0, 0, 12, 109, 105, 115, 115, 105, 110, 103, 45, 100, 97, 116, 97, 0, 0, 12, 105, 110, 118, 97, 108, 105, 100, 45, 100, 97, 116, 97, 0, 0, 13, 109, 105, 115, 115, 105, 110, 103, 45, 116, 97, 98, 108, 101, 1, 3, 0, 4, 0, 5, 101, 114, 114, 111, 114, 3, 0, 4, 1, 112, 123, 1, 105, 0, 1, 64, 1, 6, 103, 108, 121, 112, 104, 115, 6, 0, 7, 4, 0, 19, 91, 115, 116, 97, 116, 105, 99, 93, 112, 114, 111, 102, 105, 108, 101, 46, 112, 100, 102, 1, 8, 4, 1, 43, 116, 121, 112, 115, 116, 45, 99, 111, 109, 109, 117, 110, 105, 116, 121, 58, 115, 117, 98, 115, 101, 116, 116, 101, 114, 47, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 43, 48, 46, 49, 46, 49, 5, 0, 11, 11, 1, 0, 5, 116, 121, 112, 101, 115, 3, 0, 0, 7, 239, 4, 1, 65, 2, 1, 65, 15, 1, 66, 10, 4, 0, 7, 112, 114, 111, 102, 105, 108, 101, 3, 1, 1, 111, 4, 125, 125, 125, 125, 1, 114, 1, 6, 116, 117, 112, 108, 101, 48, 1, 4, 0, 3, 116, 97, 103, 3, 0, 2, 1, 113, 5, 12, 117, 110, 107, 110, 111, 119, 110, 45, 107, 105, 110, 100, 0, 0, 14, 105, 110, 118, 97, 108, 105, 100, 45, 111, 102, 102, 115, 101, 116, 0, 0, 12, 109, 105, 115, 115, 105, 110, 103, 45, 100, 97, 116, 97, 0, 0, 12, 105, 110, 118, 97, 108, 105, 100, 45, 100, 97, 116, 97, 0, 0, 13, 109, 105, 115, 115, 105, 110, 103, 45, 116, 97, 98, 108, 101, 1, 3, 0, 4, 0, 5, 101, 114, 114, 111, 114, 3, 0, 4, 1, 112, 123, 1, 105, 0, 1, 64, 1, 6, 103, 108, 121, 112, 104, 115, 6, 0, 7, 4, 0, 19, 91, 115, 116, 97, 116, 105, 99, 93, 112, 114, 111, 102, 105, 108, 101, 46, 112, 100, 102, 1, 8, 3, 1, 43, 116, 121, 112, 115, 116, 45, 99, 111, 109, 109, 117, 110, 105, 116, 121, 58, 115, 117, 98, 115, 101, 116, 116, 101, 114, 47, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 43, 48, 46, 49, 46, 49, 5, 0, 2, 3, 0, 0, 7, 112, 114, 111, 102, 105, 108, 101, 3, 0, 7, 112, 114, 111, 102, 105, 108, 101, 3, 0, 1, 2, 3, 0, 0, 3, 116, 97, 103, 3, 0, 3, 116, 97, 103, 3, 0, 3, 2, 3, 0, 0, 5, 101, 114, 114, 111, 114, 3, 0, 5, 101, 114, 114, 111, 114, 3, 0, 5, 1, 112, 125, 1, 105, 2, 1, 106, 1, 7, 1, 6, 1, 64, 3, 4, 100, 97, 116, 97, 7, 5, 105, 110, 100, 101, 120, 121, 7, 112, 114, 111, 102, 105, 108, 101, 8, 0, 9, 4, 0, 6, 115, 117, 98, 115, 101, 116, 1, 10, 1, 66, 10, 4, 0, 7, 112, 114, 111, 102, 105, 108, 101, 3, 1, 1, 111, 4, 125, 125, 125, 125, 1, 114, 1, 6, 116, 117, 112, 108, 101, 48, 1, 4, 0, 3, 116, 97, 103, 3, 0, 2, 1, 113, 5, 12, 117, 110, 107, 110, 111, 119, 110, 45, 107, 105, 110, 100, 0, 0, 14, 105, 110, 118, 97, 108, 105, 100, 45, 111, 102, 102, 115, 101, 116, 0, 0, 12, 109, 105, 115, 115, 105, 110, 103, 45, 100, 97, 116, 97, 0, 0, 12, 105, 110, 118, 97, 108, 105, 100, 45, 100, 97, 116, 97, 0, 0, 13, 109, 105, 115, 115, 105, 110, 103, 45, 116, 97, 98, 108, 101, 1, 3, 0, 4, 0, 5, 101, 114, 114, 111, 114, 3, 0, 4, 1, 112, 123, 1, 105, 0, 1, 64, 1, 6, 103, 108, 121, 112, 104, 115, 6, 0, 7, 4, 0, 19, 91, 115, 116, 97, 116, 105, 99, 93, 112, 114, 111, 102, 105, 108, 101, 46, 112, 100, 102, 1, 8, 4, 1, 43, 116, 121, 112, 115, 116, 45, 99, 111, 109, 109, 117, 110, 105, 116, 121, 58, 115, 117, 98, 115, 101, 116, 116, 101, 114, 47, 116, 121, 112, 101, 115, 64, 49, 46, 48, 46, 48, 43, 48, 46, 49, 46, 49, 5, 11, 4, 1, 47, 116, 121, 112, 115, 116, 45, 99, 111, 109, 109, 117, 110, 105, 116, 121, 58, 115, 117, 98, 115, 101, 116, 116, 101, 114, 47, 115, 117, 98, 115, 101, 116, 116, 101, 114, 64, 49, 46, 48, 46, 48, 43, 48, 46, 49, 46, 49, 4, 0, 11, 15, 1, 0, 9, 115, 117, 98, 115, 101, 116, 116, 101, 114, 3, 2, 0, 0, 16, 12, 112, 97, 99, 107, 97, 103, 101, 45, 100, 111, 99, 115, 0, 123, 125, 0, 70, 9, 112, 114, 111, 100, 117, 99, 101, 114, 115, 1, 12, 112, 114, 111, 99, 101, 115, 115, 101, 100, 45, 98, 121, 2, 13, 119, 105, 116, 45, 99, 111, 109, 112, 111, 110, 101, 110, 116, 6, 48, 46, 49, 56, 46, 50, 16, 119, 105, 116, 45, 98, 105, 110, 100, 103, 101, 110, 45, 114, 117, 115, 116, 6, 48, 46, 49, 54, 46, 48];
#[inline(never)]
#[doc(hidden)]
#[cfg(target_arch = "wasm32")]
pub fn __link_section() {}