code: def align_series_series(left, right):
      if is_index_value_identical(left, right):
          # index identical, skip align
          return (
              left.nsplits,
              left.chunk_shape,
              left.chunks,
              right.chunks,
          )
  
      left_index_chunks = [c.index_value for c in left.chunks]
      right_index_chunks = [c.index_value for c in right.chunks]
  
      index_splits, index_chunk_shape = _calc_axis_splits(
          left.index_value,
          right.index_value,
          left_index_chunks,
          right_index_chunks,
      )
  
      out_chunk_shape = (
          len(
              index_chunk_shape
              or list(itertools.chain(*index_splits._left_split))
          ),
      )
      splits = _MinMaxSplitInfo(index_splits, None)
  
      left_chunks = _gen_series_chunks(splits, out_chunk_shape, 0, left)
      right_chunks = _gen_series_chunks(
          splits, out_chunk_shape, 1, right
      )
      index_nsplits = [np.nan for _ in range(out_chunk_shape[0])]
      nsplits = [index_nsplits]
      return nsplits, out_chunk_shape, left_chunks, right_chunks
  
imports: import itertools
  import operator
  import numpy
  import pandas
  from ..None import opcodes
  from ..core import OutputType
  from ..core.operand import OperandStage, MapReduceOperand
  from ..serialization.serializables import FieldTypes, AnyField, BoolField, Int32Field, KeyField, ListField
  from .core import SERIES_CHUNK_TYPE
  from .utils import hash_dtypes, filter_dtypes
  from .operands import DataFrameOperandMixin, DataFrameShuffleProxy
  from .utils import parse_index, split_monotonic_index_min_max, build_split_idx_to_origin_idx, filter_index_value, hash_index, is_index_value_identical, validate_axis
label_desc: Use image node_id 12 for calling a global function with example usage: align_series_series(left, right) and returns: nsplits,  out_chunk_shape,  left_chunks,  right_chunks, left,  left,  left,  right