class ShiroEncoderBuilder extends AbstractBuilder {

    /**
     * <p>Constructor for ShiroEncoderBuilder.</p>
     *
     * @param properties a {@link Map} object
     */
    public ShiroEncoderBuilder(final Map<String, String> properties) {
        super(properties);
    }

    /**
     * <p>tryCreatePasswordEncoder.</p>
     *
     * @param encoders a {@link Map} object
     */
    public void tryCreatePasswordEncoder(final Map<String, PasswordEncoder> encoders) {<FILL_FUNCTION_BODY>}
}

        for (var i = 0; i <= MAX_NUM_ENCODERS; i++) {
            val exists = getProperty(SHIRO_ENCODER, i);
            val hasProperty =  containsProperty(SHIRO_ENCODER_GENERATE_PUBLIC_SALT, i)
                || containsProperty(SHIRO_ENCODER_HASH_ALGORITHM_NAME, i)
                || containsProperty(SHIRO_ENCODER_HASH_ITERATIONS, i) || containsProperty(SHIRO_ENCODER_PRIVATE_SALT, i);
            if (isNotBlank(exists) || hasProperty) {

                val passwordService = new DefaultPasswordService();

                if (hasProperty) {
                    val hashService = new DefaultHashService();

                    if (containsProperty(SHIRO_ENCODER_GENERATE_PUBLIC_SALT, i)) {
                        hashService.setGeneratePublicSalt(getPropertyAsBoolean(SHIRO_ENCODER_GENERATE_PUBLIC_SALT, i));
                    }
                    if (containsProperty(SHIRO_ENCODER_HASH_ALGORITHM_NAME, i)) {
                        hashService.setHashAlgorithmName(getProperty(SHIRO_ENCODER_HASH_ALGORITHM_NAME, i));
                    }
                    if (containsProperty(SHIRO_ENCODER_HASH_ITERATIONS, i)) {
                        hashService.setHashIterations(getPropertyAsInteger(SHIRO_ENCODER_HASH_ITERATIONS, i));
                    }
                    if (containsProperty(SHIRO_ENCODER_PRIVATE_SALT, i)) {
                        hashService.setPrivateSalt(ByteSource.Util.bytes(getProperty(SHIRO_ENCODER_PRIVATE_SALT, i)));
                    }

                    passwordService.setHashService(hashService);
                }

                encoders.put(concat(SHIRO_ENCODER, i), new ShiroPasswordEncoder(passwordService));
            }
        }
    
<methods><variables>protected static final int MAX_NUM_AUTHENTICATORS,protected static final int MAX_NUM_CLIENTS,protected static final int MAX_NUM_CUSTOM_PROPERTIES,protected static final int MAX_NUM_ENCODERS,protected final non-sealed Map<java.lang.String,org.pac4j.core.credentials.authenticator.Authenticator> authenticators,protected final non-sealed Map<java.lang.String,java.lang.String> properties