Remove now-unneeded mod type annotations
Most of the mod type annotations can now be changed to MOD_BOTH, because if you pass a mask which can only contain real mods in the first place to e.g. ModMaskText, then MOD_REAL and MOD_BOTH will give the same result. In the cases where MOD_BOTH is only ever the argument, we just remove it. What's left is where it really "matters". Signed-off-by: Ran Benita <ran234@gmail.com>master
parent
e6e3bda393
commit
39232e6dae
|
@ -281,7 +281,7 @@ write_types(struct xkb_keymap *keymap, struct buf *buf)
|
||||||
write_buf(buf, "\t\ttype \"%s\" {\n",
|
write_buf(buf, "\t\ttype \"%s\" {\n",
|
||||||
xkb_atom_text(keymap->ctx, type->name));
|
xkb_atom_text(keymap->ctx, type->name));
|
||||||
write_buf(buf, "\t\t\tmodifiers= %s;\n",
|
write_buf(buf, "\t\t\tmodifiers= %s;\n",
|
||||||
ModMaskText(keymap, type->mods.mods, MOD_BOTH));
|
ModMaskText(keymap, type->mods.mods));
|
||||||
|
|
||||||
for (j = 0; j < type->num_entries; j++) {
|
for (j = 0; j < type->num_entries; j++) {
|
||||||
const char *str;
|
const char *str;
|
||||||
|
@ -294,7 +294,7 @@ write_types(struct xkb_keymap *keymap, struct buf *buf)
|
||||||
if (entry->level == 0 && entry->preserve.mods == 0)
|
if (entry->level == 0 && entry->preserve.mods == 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
str = ModMaskText(keymap, entry->mods.mods, MOD_BOTH);
|
str = ModMaskText(keymap, entry->mods.mods);
|
||||||
write_buf(buf, "\t\t\tmap[%s]= Level%d;\n",
|
write_buf(buf, "\t\t\tmap[%s]= Level%d;\n",
|
||||||
str, entry->level + 1);
|
str, entry->level + 1);
|
||||||
|
|
||||||
|
@ -303,7 +303,7 @@ write_types(struct xkb_keymap *keymap, struct buf *buf)
|
||||||
|
|
||||||
write_buf(buf, "\t\t\tpreserve[%s]= ", str);
|
write_buf(buf, "\t\t\tpreserve[%s]= ", str);
|
||||||
write_buf(buf, "%s;\n",
|
write_buf(buf, "%s;\n",
|
||||||
ModMaskText(keymap, entry->preserve.mods, MOD_BOTH));
|
ModMaskText(keymap, entry->preserve.mods));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type->level_names) {
|
if (type->level_names) {
|
||||||
|
@ -344,7 +344,7 @@ write_indicator_map(struct xkb_keymap *keymap, struct buf *buf, int num)
|
||||||
get_indicator_state_text(led->which_mods));
|
get_indicator_state_text(led->which_mods));
|
||||||
}
|
}
|
||||||
write_buf(buf, "\t\t\tmodifiers= %s;\n",
|
write_buf(buf, "\t\t\tmodifiers= %s;\n",
|
||||||
ModMaskText(keymap, led->mods.mods, MOD_BOTH));
|
ModMaskText(keymap, led->mods.mods));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (led->ctrls) {
|
if (led->ctrls) {
|
||||||
|
@ -378,7 +378,7 @@ write_action(struct xkb_keymap *keymap, struct buf *buf,
|
||||||
if (action->mods.flags & ACTION_MODS_LOOKUP_MODMAP)
|
if (action->mods.flags & ACTION_MODS_LOOKUP_MODMAP)
|
||||||
args = "modMapMods";
|
args = "modMapMods";
|
||||||
else
|
else
|
||||||
args = ModMaskText(keymap, action->mods.mods.mods, MOD_BOTH);
|
args = ModMaskText(keymap, action->mods.mods.mods);
|
||||||
write_buf(buf, "%s%s(modifiers=%s%s%s)%s", prefix, type, args,
|
write_buf(buf, "%s%s(modifiers=%s%s%s)%s", prefix, type, args,
|
||||||
(action->type != ACTION_TYPE_MOD_LOCK &&
|
(action->type != ACTION_TYPE_MOD_LOCK &&
|
||||||
(action->mods.flags & ACTION_LOCK_CLEAR)) ?
|
(action->mods.flags & ACTION_LOCK_CLEAR)) ?
|
||||||
|
@ -524,11 +524,11 @@ write_compat(struct xkb_keymap *keymap, struct buf *buf)
|
||||||
write_buf(buf, "\t\tinterpret %s+%s(%s) {\n",
|
write_buf(buf, "\t\tinterpret %s+%s(%s) {\n",
|
||||||
keysym_name,
|
keysym_name,
|
||||||
SIMatchText(interp->match),
|
SIMatchText(interp->match),
|
||||||
ModMaskText(keymap, interp->mods, MOD_REAL));
|
ModMaskText(keymap, interp->mods));
|
||||||
|
|
||||||
if (interp->virtual_mod != XKB_MOD_INVALID)
|
if (interp->virtual_mod != XKB_MOD_INVALID)
|
||||||
write_buf(buf, "\t\t\tvirtualModifier= %s;\n",
|
write_buf(buf, "\t\t\tvirtualModifier= %s;\n",
|
||||||
ModIndexText(keymap, interp->virtual_mod, MOD_VIRT));
|
ModIndexText(keymap, interp->virtual_mod));
|
||||||
|
|
||||||
if (interp->match & MATCH_LEVEL_ONE_ONLY)
|
if (interp->match & MATCH_LEVEL_ONE_ONLY)
|
||||||
write_buf(buf, "\t\t\tuseModMapMods=level1;\n");
|
write_buf(buf, "\t\t\tuseModMapMods=level1;\n");
|
||||||
|
@ -668,7 +668,7 @@ write_symbols(struct xkb_keymap *keymap, struct buf *buf)
|
||||||
|
|
||||||
if (key->vmodmap && (key->explicit & EXPLICIT_VMODMAP))
|
if (key->vmodmap && (key->explicit & EXPLICIT_VMODMAP))
|
||||||
write_buf(buf, "\n\t\t\tvirtualMods= %s,",
|
write_buf(buf, "\n\t\t\tvirtualMods= %s,",
|
||||||
ModMaskText(keymap, key->vmodmap, MOD_VIRT));
|
ModMaskText(keymap, key->vmodmap));
|
||||||
|
|
||||||
switch (key->out_of_range_group_action) {
|
switch (key->out_of_range_group_action) {
|
||||||
case RANGE_SATURATE:
|
case RANGE_SATURATE:
|
||||||
|
|
19
src/text.c
19
src/text.c
|
@ -232,31 +232,26 @@ GetBuffer(size_t size)
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
ModMaskText(const struct xkb_keymap *keymap, xkb_mod_mask_t mask,
|
ModMaskText(const struct xkb_keymap *keymap, xkb_mod_mask_t mask)
|
||||||
enum mod_type type)
|
|
||||||
{
|
{
|
||||||
xkb_mod_index_t i;
|
xkb_mod_index_t i;
|
||||||
xkb_mod_mask_t rmask, vmask;
|
|
||||||
size_t len;
|
size_t len;
|
||||||
ssize_t rem;
|
ssize_t rem;
|
||||||
char *str;
|
char *str;
|
||||||
char buf[BUFFER_SIZE];
|
char buf[BUFFER_SIZE];
|
||||||
const struct xkb_mod *mod;
|
const struct xkb_mod *mod;
|
||||||
|
|
||||||
rmask = (type & MOD_REAL ? mask : 0) & 0xff;
|
if (mask == 0)
|
||||||
vmask = (type & MOD_VIRT ? mask : 0) & (~0xff);
|
|
||||||
|
|
||||||
if (rmask == 0 && vmask == 0)
|
|
||||||
return "none";
|
return "none";
|
||||||
|
|
||||||
if (rmask == 0xff && vmask == 0)
|
if (mask == 0xff)
|
||||||
return "all";
|
return "all";
|
||||||
|
|
||||||
str = buf;
|
str = buf;
|
||||||
buf[0] = '\0';
|
buf[0] = '\0';
|
||||||
rem = BUFFER_SIZE;
|
rem = BUFFER_SIZE;
|
||||||
darray_enumerate(i, mod, keymap->mods) {
|
darray_enumerate(i, mod, keymap->mods) {
|
||||||
if (!(mod->type & type) || !(mask & (1 << i)))
|
if (!(mask & (1 << i)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
len = snprintf(str, rem, "%s%s",
|
len = snprintf(str, rem, "%s%s",
|
||||||
|
@ -279,14 +274,12 @@ ModMaskText(const struct xkb_keymap *keymap, xkb_mod_mask_t mask,
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
ModIndexText(const struct xkb_keymap *keymap, xkb_mod_index_t ndx,
|
ModIndexText(const struct xkb_keymap *keymap, xkb_mod_index_t ndx)
|
||||||
enum mod_type type)
|
|
||||||
{
|
{
|
||||||
if (ndx == XKB_MOD_INVALID)
|
if (ndx == XKB_MOD_INVALID)
|
||||||
return "none";
|
return "none";
|
||||||
|
|
||||||
if (ndx >= darray_size(keymap->mods) ||
|
if (ndx >= darray_size(keymap->mods))
|
||||||
!(darray_item(keymap->mods, ndx).type & type))
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return xkb_atom_text(keymap->ctx, darray_item(keymap->mods, ndx).name);
|
return xkb_atom_text(keymap->ctx, darray_item(keymap->mods, ndx).name);
|
||||||
|
|
|
@ -48,12 +48,10 @@ extern const LookupEntry actionTypeNames[];
|
||||||
extern const LookupEntry symInterpretMatchMaskNames[];
|
extern const LookupEntry symInterpretMatchMaskNames[];
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
ModMaskText(const struct xkb_keymap *keymap, xkb_mod_mask_t mask,
|
ModMaskText(const struct xkb_keymap *keymap, xkb_mod_mask_t mask);
|
||||||
enum mod_type type);
|
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
ModIndexText(const struct xkb_keymap *keymap, xkb_mod_index_t ndx,
|
ModIndexText(const struct xkb_keymap *keymap, xkb_mod_index_t ndx);
|
||||||
enum mod_type type);
|
|
||||||
|
|
||||||
xkb_mod_index_t
|
xkb_mod_index_t
|
||||||
ModNameToIndex(const struct xkb_keymap *keymap, xkb_atom_t name,
|
ModNameToIndex(const struct xkb_keymap *keymap, xkb_atom_t name,
|
||||||
|
|
|
@ -210,7 +210,7 @@ siText(SymInterpInfo *si, CompatInfo *info)
|
||||||
snprintf(buf, sizeof(buf), "%s+%s(%s)",
|
snprintf(buf, sizeof(buf), "%s+%s(%s)",
|
||||||
KeysymText(si->interp.sym),
|
KeysymText(si->interp.sym),
|
||||||
SIMatchText(si->interp.match),
|
SIMatchText(si->interp.match),
|
||||||
ModMaskText(info->keymap, si->interp.mods, MOD_REAL));
|
ModMaskText(info->keymap, si->interp.mods));
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,7 @@ ComputeEffectiveMask(struct xkb_keymap *keymap, struct xkb_mods *mods)
|
||||||
mods->mask = mods->mods & 0xff;
|
mods->mask = mods->mods & 0xff;
|
||||||
|
|
||||||
darray_enumerate(i, mod, keymap->mods)
|
darray_enumerate(i, mod, keymap->mods)
|
||||||
if (mod->type == MOD_VIRT && mods->mods & (1 << i))
|
if (mods->mods & (1 << i))
|
||||||
mods->mask |= mod->mapping;
|
mods->mask |= mod->mapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,7 +198,7 @@ UpdateDerivedKeymapFields(struct xkb_keymap *keymap)
|
||||||
/* Update keymap->mods, the virtual -> real mod mapping. */
|
/* Update keymap->mods, the virtual -> real mod mapping. */
|
||||||
xkb_foreach_key(key, keymap)
|
xkb_foreach_key(key, keymap)
|
||||||
darray_enumerate(i, mod, keymap->mods)
|
darray_enumerate(i, mod, keymap->mods)
|
||||||
if (mod->type == MOD_VIRT && key->vmodmap & (1 << i))
|
if (key->vmodmap & (1 << i))
|
||||||
mod->mapping |= key->modmap;
|
mod->mapping |= key->modmap;
|
||||||
|
|
||||||
/* Now update the level masks for all the types to reflect the vmods. */
|
/* Now update the level masks for all the types to reflect the vmods. */
|
||||||
|
|
|
@ -463,8 +463,8 @@ AddModMapEntry(SymbolsInfo *info, ModMapEntry *new)
|
||||||
"%s added to symbol map for multiple modifiers; "
|
"%s added to symbol map for multiple modifiers; "
|
||||||
"Using %s, ignoring %s.\n",
|
"Using %s, ignoring %s.\n",
|
||||||
KeysymText(new->u.keySym),
|
KeysymText(new->u.keySym),
|
||||||
ModIndexText(info->keymap, use, MOD_REAL),
|
ModIndexText(info->keymap, use),
|
||||||
ModIndexText(info->keymap, ignore, MOD_REAL));
|
ModIndexText(info->keymap, ignore));
|
||||||
mm->modifier = use;
|
mm->modifier = use;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -485,8 +485,8 @@ AddModMapEntry(SymbolsInfo *info, ModMapEntry *new)
|
||||||
"Key %s added to map for multiple modifiers; "
|
"Key %s added to map for multiple modifiers; "
|
||||||
"Using %s, ignoring %s.\n",
|
"Using %s, ignoring %s.\n",
|
||||||
KeyNameText(info->keymap->ctx, new->u.keyName),
|
KeyNameText(info->keymap->ctx, new->u.keyName),
|
||||||
ModIndexText(info->keymap, use, MOD_REAL),
|
ModIndexText(info->keymap, use),
|
||||||
ModIndexText(info->keymap, ignore, MOD_REAL));
|
ModIndexText(info->keymap, ignore));
|
||||||
mm->modifier = use;
|
mm->modifier = use;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -1238,7 +1238,7 @@ HandleModMapDef(SymbolsInfo *info, ModMapDef *def)
|
||||||
log_err(info->keymap->ctx,
|
log_err(info->keymap->ctx,
|
||||||
"Modmap entries may contain only key names or keysyms; "
|
"Modmap entries may contain only key names or keysyms; "
|
||||||
"Illegal definition for %s modifier ignored\n",
|
"Illegal definition for %s modifier ignored\n",
|
||||||
ModIndexText(info->keymap, tmp.modifier, MOD_REAL));
|
ModIndexText(info->keymap, tmp.modifier));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1573,7 +1573,7 @@ CopyModMapDef(SymbolsInfo *info, ModMapEntry *entry)
|
||||||
"Key %s not found in keycodes; "
|
"Key %s not found in keycodes; "
|
||||||
"Modifier map entry for %s not updated\n",
|
"Modifier map entry for %s not updated\n",
|
||||||
KeyNameText(keymap->ctx, entry->u.keyName),
|
KeyNameText(keymap->ctx, entry->u.keyName),
|
||||||
ModIndexText(info->keymap, entry->modifier, MOD_REAL));
|
ModIndexText(info->keymap, entry->modifier));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1584,7 +1584,7 @@ CopyModMapDef(SymbolsInfo *info, ModMapEntry *entry)
|
||||||
"Key \"%s\" not found in symbol map; "
|
"Key \"%s\" not found in symbol map; "
|
||||||
"Modifier map entry for %s not updated\n",
|
"Modifier map entry for %s not updated\n",
|
||||||
KeysymText(entry->u.keySym),
|
KeysymText(entry->u.keySym),
|
||||||
ModIndexText(info->keymap, entry->modifier, MOD_REAL));
|
ModIndexText(info->keymap, entry->modifier));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -168,7 +168,7 @@ typedef struct {
|
||||||
static inline const char *
|
static inline const char *
|
||||||
MapEntryTxt(KeyTypesInfo *info, struct xkb_kt_map_entry *entry)
|
MapEntryTxt(KeyTypesInfo *info, struct xkb_kt_map_entry *entry)
|
||||||
{
|
{
|
||||||
return ModMaskText(info->keymap, entry->mods.mods, MOD_BOTH);
|
return ModMaskText(info->keymap, entry->mods.mods);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline const char *
|
static inline const char *
|
||||||
|
@ -180,7 +180,7 @@ TypeTxt(KeyTypesInfo *info, KeyTypeInfo *type)
|
||||||
static inline const char *
|
static inline const char *
|
||||||
TypeMaskTxt(KeyTypesInfo *info, KeyTypeInfo *type)
|
TypeMaskTxt(KeyTypesInfo *info, KeyTypeInfo *type)
|
||||||
{
|
{
|
||||||
return ModMaskText(info->keymap, type->mods, MOD_BOTH);
|
return ModMaskText(info->keymap, type->mods);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
|
@ -377,7 +377,7 @@ SetModifiers(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx,
|
||||||
"Using %s, ignoring %s\n",
|
"Using %s, ignoring %s\n",
|
||||||
xkb_atom_text(info->keymap->ctx, type->name),
|
xkb_atom_text(info->keymap->ctx, type->name),
|
||||||
TypeMaskTxt(info, type),
|
TypeMaskTxt(info, type),
|
||||||
ModMaskText(info->keymap, mods, MOD_BOTH));
|
ModMaskText(info->keymap, mods));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -456,8 +456,7 @@ SetMapEntry(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx,
|
||||||
"Map entry for unused modifiers in %s; "
|
"Map entry for unused modifiers in %s; "
|
||||||
"Using %s instead of %s\n",
|
"Using %s instead of %s\n",
|
||||||
TypeTxt(info, type),
|
TypeTxt(info, type),
|
||||||
ModMaskText(info->keymap, entry.mods.mods & type->mods,
|
ModMaskText(info->keymap, entry.mods.mods & type->mods),
|
||||||
MOD_BOTH),
|
|
||||||
MapEntryTxt(info, &entry));
|
MapEntryTxt(info, &entry));
|
||||||
entry.mods.mods &= type->mods;
|
entry.mods.mods &= type->mods;
|
||||||
}
|
}
|
||||||
|
@ -498,7 +497,7 @@ AddPreserve(KeyTypesInfo *info, KeyTypeInfo *type,
|
||||||
log_vrb(info->keymap->ctx, 10,
|
log_vrb(info->keymap->ctx, 10,
|
||||||
"Identical definitions for preserve[%s] in %s; "
|
"Identical definitions for preserve[%s] in %s; "
|
||||||
"Ignored\n",
|
"Ignored\n",
|
||||||
ModMaskText(info->keymap, mods, MOD_BOTH),
|
ModMaskText(info->keymap, mods),
|
||||||
TypeTxt(info, type));
|
TypeTxt(info, type));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -507,10 +506,10 @@ AddPreserve(KeyTypesInfo *info, KeyTypeInfo *type,
|
||||||
log_vrb(info->keymap->ctx, 1,
|
log_vrb(info->keymap->ctx, 1,
|
||||||
"Multiple definitions for preserve[%s] in %s; "
|
"Multiple definitions for preserve[%s] in %s; "
|
||||||
"Using %s, ignoring %s\n",
|
"Using %s, ignoring %s\n",
|
||||||
ModMaskText(info->keymap, mods, MOD_BOTH),
|
ModMaskText(info->keymap, mods),
|
||||||
TypeTxt(info, type),
|
TypeTxt(info, type),
|
||||||
ModMaskText(info->keymap, preserve_mods, MOD_BOTH),
|
ModMaskText(info->keymap, preserve_mods),
|
||||||
ModMaskText(info->keymap, entry->preserve.mods, MOD_BOTH));
|
ModMaskText(info->keymap, entry->preserve.mods));
|
||||||
|
|
||||||
entry->preserve.mods = preserve_mods;
|
entry->preserve.mods = preserve_mods;
|
||||||
return true;
|
return true;
|
||||||
|
@ -544,9 +543,9 @@ SetPreserve(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx,
|
||||||
if (mods & ~type->mods) {
|
if (mods & ~type->mods) {
|
||||||
const char *before, *after;
|
const char *before, *after;
|
||||||
|
|
||||||
before = ModMaskText(info->keymap, mods, MOD_BOTH);
|
before = ModMaskText(info->keymap, mods);
|
||||||
mods &= type->mods;
|
mods &= type->mods;
|
||||||
after = ModMaskText(info->keymap, mods, MOD_BOTH);
|
after = ModMaskText(info->keymap, mods);
|
||||||
|
|
||||||
log_vrb(info->keymap->ctx, 1,
|
log_vrb(info->keymap->ctx, 1,
|
||||||
"Preserve for modifiers not used by the %s type; "
|
"Preserve for modifiers not used by the %s type; "
|
||||||
|
@ -558,7 +557,7 @@ SetPreserve(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx,
|
||||||
log_err(info->keymap->ctx,
|
log_err(info->keymap->ctx,
|
||||||
"Preserve value in a key type is not a modifier mask; "
|
"Preserve value in a key type is not a modifier mask; "
|
||||||
"Ignoring preserve[%s] in type %s\n",
|
"Ignoring preserve[%s] in type %s\n",
|
||||||
ModMaskText(info->keymap, mods, MOD_BOTH),
|
ModMaskText(info->keymap, mods),
|
||||||
TypeTxt(info, type));
|
TypeTxt(info, type));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -566,14 +565,14 @@ SetPreserve(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx,
|
||||||
if (preserve_mods & ~mods) {
|
if (preserve_mods & ~mods) {
|
||||||
const char *before, *after;
|
const char *before, *after;
|
||||||
|
|
||||||
before = ModMaskText(info->keymap, preserve_mods, MOD_BOTH);
|
before = ModMaskText(info->keymap, preserve_mods);
|
||||||
preserve_mods &= mods;
|
preserve_mods &= mods;
|
||||||
after = ModMaskText(info->keymap, preserve_mods, MOD_BOTH);
|
after = ModMaskText(info->keymap, preserve_mods);
|
||||||
|
|
||||||
log_vrb(info->keymap->ctx, 1,
|
log_vrb(info->keymap->ctx, 1,
|
||||||
"Illegal value for preserve[%s] in type %s; "
|
"Illegal value for preserve[%s] in type %s; "
|
||||||
"Converted %s to %s\n",
|
"Converted %s to %s\n",
|
||||||
ModMaskText(info->keymap, mods, MOD_BOTH),
|
ModMaskText(info->keymap, mods),
|
||||||
TypeTxt(info, type), before, after);
|
TypeTxt(info, type), before, after);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue