class InputKeyBytesData<K> extends AbstractData<K> {

    @Stage("InputKeyBytes")
    private final VanillaBytes inputKeyBytes = VanillaBytes.vanillaBytes();;
    @StageRef
    KeyBytesInterop<K> ki;
    @StageRef
    CheckOnEachPublicOperation checkOnEachPublicOperation;
    @Stage("InputKeyBytesStore")
    private BytesStore inputKeyBytesStore = null;
    @Stage("InputKeyBytesStore")
    private long inputKeyBytesOffset;
    @Stage("InputKeyBytesStore")
    private long inputKeyBytesSize;
    @Stage("InputKeyBytes")
    private boolean inputKeyBytesUsed = false;
    @Stage("CachedInputKey")
    private K cachedInputKey;
    @Stage("CachedInputKey")
    private boolean cachedInputKeyRead = false;

    public void initInputKeyBytesStore(BytesStore bytesStore, long offset, long size) {<FILL_FUNCTION_BODY>}

    boolean inputKeyBytesInit() {
        return inputKeyBytesUsed;
    }

    void initInputKeyBytes() {
        inputKeyBytes.bytesStore(inputKeyBytesStore, inputKeyBytesOffset, inputKeyBytesSize);
        inputKeyBytesUsed = true;
    }

    void closeInputKeyBytes() {
        inputKeyBytes.bytesStore(BytesStore.empty(), 0, 0);
        inputKeyBytesUsed = false;
    }

    private void initCachedInputKey() {
        cachedInputKey = innerGetUsing(cachedInputKey);
        cachedInputKeyRead = true;
    }

    @Override
    public RandomDataInput bytes() {
        checkOnEachPublicOperation.checkOnEachPublicOperation();
        return inputKeyBytes.bytesStore();
    }

    @Override
    public long offset() {
        checkOnEachPublicOperation.checkOnEachPublicOperation();
        return inputKeyBytesOffset;
    }

    @Override
    public long size() {
        checkOnEachPublicOperation.checkOnEachPublicOperation();
        return inputKeyBytesSize;
    }

    @Override
    public K get() {
        checkOnEachPublicOperation.checkOnEachPublicOperation();
        return cachedInputKey;
    }

    @Override
    public K getUsing(K using) {
        checkOnEachPublicOperation.checkOnEachPublicOperation();
        return innerGetUsing(using);
    }

    private K innerGetUsing(K usingKey) {
        inputKeyBytes.readPosition(inputKeyBytesOffset);
        return ki.keyReader.read(inputKeyBytes, inputKeyBytesSize, usingKey);
    }
}

        inputKeyBytesStore = bytesStore;
        inputKeyBytesOffset = offset;
        inputKeyBytesSize = size;
    
<methods>public boolean equals(java.lang.Object) ,public int hashCode() ,public java.lang.String toString() <variables>