class MapBackedScriptFeature implements ScriptFeature
{

    private final String name;
    private final Map<List<Integer>, Integer> featureMap;

    public MapBackedScriptFeature(String name, Map<List<Integer>, Integer> featureMap)
    {
        this.name = name;
        this.featureMap = featureMap;
    }

    @Override
    public String getName()
    {
        return name;
    }

    @Override
    public Set<List<Integer>> getAllGlyphIdsForSubstitution()
    {
        return featureMap.keySet();
    }

    @Override
    public boolean canReplaceGlyphs(List<Integer> glyphIds)
    {
        return featureMap.containsKey(glyphIds);
    }

    @Override
    public Integer getReplacementForGlyphs(List<Integer> glyphIds)
    {
        if (!canReplaceGlyphs(glyphIds))
        {
            throw new UnsupportedOperationException(
                    "The glyphs " + glyphIds + " cannot be replaced");
        }
        return featureMap.get(glyphIds);
    }

    @Override
    public int hashCode()
    {
        return Objects.hash(featureMap, name);
    }

    @Override
    public boolean equals(Object obj)
    {<FILL_FUNCTION_BODY>}
}

        if (this == obj)
        {
            return true;
        }
        if (obj == null || getClass() != obj.getClass())
        {
            return false;
        }
        MapBackedScriptFeature other = (MapBackedScriptFeature) obj;
        return Objects.equals(other.name, this.name) && Objects.equals(other.featureMap, this.featureMap);
    
<no_super_class>