%%
%% This is file `pdfmanagement-testphase.ltx',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% pdfmanagement-testphase.dtx  (with options: `header')
%% l3pdfdict.dtx  (with options: `package')
%% l3pdfmanagement.dtx  (with options: `package')
%% ltdocinit.dtx  (with options: `package')
%% l3pdfannot.dtx  (with options: `package')
%% l3pdfxform.dtx  (with options: `package')
%% l3pdfmeta.dtx  (with options: `package')
%% l3pdftools.dtx  (with options: `package')
%% l3pdffile.dtx  (with options: `package')
%% 
%% Copyright (C) 2019-2021 The LaTeX Project
%% 
%% It may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License (LPPL), either version 1.3c of
%% this license or (at your option) any later version.  The latest
%% version of this license is in the file:
%% 
%%    https://www.latex-project.org/lppl.txt
%% 
%% This file is part of the "LaTeX PDF management testphase bundle" (The Work in LPPL)
%% and all files in that bundle must be distributed together.
%% 
%% File: pdfmanagement-testphase.dtx
\ProvidesExplFile{pdfmanagement-testphase.ltx}{2022-02-16}{0.95l}
  {PDF~management~code~(testphase)}
%% File: l3pdfdict.dtx
\cs_new:Npn \__pdfdict_get_type:n #1
  {
    \str_case_e:nn { \str_head:n{#1} }
     {
       {g}{global}
       {l}{local}
     }
  }
\msg_new:nnn  { pdfdict } { show-dict }
  { %#1: name of the dictionary
    %#2: expanded content
    %#3: type
    The~#3~dictionary~'#1'~
    \tl_if_empty:nTF {#2}
      { is~empty \\>~ . }
      { contains~the~pairs~(without~outer~braces): #2 . }
  }
\msg_new:nnn  { pdfdict } { unknown-dict }
  {
    The~dictionary~'#1'~is~unknown.
  }
\msg_new:nnn  { pdfdict } { dict-already-defined  }
  {
    The~#2~dictionary~'#1'~is~already~defined.
  }
\msg_new:nnn  { pdfdict } { empty-value }
              { The~value~#1~for~#2~is~blank~and~will~be~ignored }

\msg_new:nnn  { pdfdict } { invalid-name }
              { Name~'#1'~is~not~valid\\
                Names~of~dictionaries~should~start~with~'g_'~or~'l_' }


\seq_new:N \g__pdfdict_lnames_seq
\seq_new:N \g__pdfdict_gnames_seq
\cs_new:Npn \__pdfdict_name:n #1  % #1 dictionary name
  {
    \str_head:n{#1}__pdfdict_/#1_prop
  }
\cs_set_eq:NN \__kernel_pdfdict_name:n \__pdfdict_name:n

\cs_new_protected:Npn \__pdfdict_new:n #1
  {
    \__pdfdict_if_exist:nTF { #1 }
      {
        \msg_error:nnxx
          { pdfdict }
          { dict-already-defined }
          { \tl_to_str:n {#1} }
          { \__pdfdict_get_type:n{#1} }
       }
       {
         \str_case_e:nnF { \str_head:n{#1} }
           {
             {g}
             {
                 \prop_new:c  { \__pdfdict_name:n { #1 } }
                 \seq_gput_right:cn {g__pdfdict_gnames_seq} { #1 }
             }
             {l}
             {
                 \prop_new:c  { \__pdfdict_name:n { #1 } }
                 \seq_gput_right:cn {g__pdfdict_lnames_seq} { #1 }
             }
           }
           {
             \msg_error:nnx{pdfdict}{invalid-name}{\tl_to_str:n{#1}}
           }
       }
  }

\cs_set_eq:NN \pdfdict_new:n \__pdfdict_new:n
\cs_new_protected:Npn \__pdfdict_set_eq:nn #1 #2
  {
    \__pdfdict_if_exist:nTF  { #2 }
      {
        \__pdfdict_if_exist:nF { #1 }
          {
            \__pdfdict_new:n { #1 }
          }
        \prop_set_eq:cc { \__pdfdict_name:n {#1} }{ \__pdfdict_name:n {#2} }
      }
      {
         \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
      }
  }

\cs_set_eq:NN \pdfdict_set_eq:nn \__pdfdict_set_eq:nn

\cs_new_protected:Npn \__pdfdict_gset_eq:nn #1 #2
  {
    \__pdfdict_if_exist:nTF { #2 }
      {
        \__pdfdict_if_exist:nF { #1 }
          {
            \__pdfdict_new:n { #1 }
          }
        \prop_gset_eq:cc { \__pdfdict_name:n {#1} }{ \__pdfdict_name:n {#2} }
      }
      {
         \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
      }
  }

\cs_set_eq:NN \pdfdict_gset_eq:nn \__pdfdict_gset_eq:nn
\prg_new_conditional:Npnn \__pdfdict_if_exist:n #1 { p , T , F , TF }
  {
    \prop_if_exist:cTF
      { \__pdfdict_name:n { #1 }  }
      { \prg_return_true:  }
      { \prg_return_false: }
  }
\prg_set_eq_conditional:NNn
  \pdfdict_if_exist:n \__pdfdict_if_exist:n { p , T , F , TF }
\prg_new_conditional:Npnn \__pdfdict_if_empty:n #1 { p , T , F , TF }
  {
    \prop_if_empty:cTF
      { \__pdfdict_name:n { #1 } }
      { \prg_return_true:  }
      { \prg_return_false: }
  }

\prg_set_eq_conditional:NNn
  \pdfdict_if_empty:n \__pdfdict_if_empty:n { p , T , F , TF }
\cs_new_protected:Npn \__pdfdict_put:nnn #1 #2 #3  %#1 (local) dict, #2 name, #3 value
  {
    \tl_if_blank:nTF { #3 }
      {
        \msg_warning:nnnn { pdfdict }{ empty-value }{ #2 } { #1 }
      }
      {
        \__pdfdict_if_exist:nTF  { #1 }
          {
            \exp_args:Nnx \prop_put:cnn
              { \__pdfdict_name:n { #1 } }{ \str_convert_pdfname:n { #2 } } { #3 }
          }
          {
            \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
          }
      }
  }

\cs_set_eq:NN \pdfdict_put:nnn \__pdfdict_put:nnn
\cs_generate_variant:Nn \pdfdict_put:nnn {nnx,nno}

\cs_new_protected:Npn \__pdfdict_gput:nnn #1 #2 #3  %#1 global dict, #2 name, #3 value
  {
    \tl_if_empty:nTF { #3 }
      {
        \msg_warning:nnnn { pdfdict }{ empty-value }{ #2 } { #1 }
      }
      {
        \__pdfdict_if_exist:nTF { #1 }
          {
            \exp_args:Nnx \prop_gput:cnn
              { \__pdfdict_name:n { #1 } }{ \str_convert_pdfname:n { #2 } } { #3 }
          }
          {
            \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
          }
      }
  }

\cs_set_eq:NN \pdfdict_gput:nnn \__pdfdict_gput:nnn
\cs_generate_variant:Nn \pdfdict_gput:nnn {nnx,nno}
\cs_new_protected:Npn \__pdfdict_get:nnN  #1 #2 #3 %dict,key,macro
  {
    \__pdfdict_if_exist:nTF { #1 }
      {
        \exp_args:Nnx \prop_get:cnN
          { \__pdfdict_name:n { #1 } }
          { \str_convert_pdfname:n { #2 } } #3
      }
      {
        \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
      }
  }

\cs_set_eq:NN \pdfdict_get:nnN \__pdfdict_get:nnN
\cs_new_protected:Npn \__pdfdict_remove:nn #1 #2 %dict,name
  {
    \__pdfdict_if_exist:nTF { #1 }
      {
        \exp_args:Nnx \prop_remove:cn
          { \__pdfdict_name:n  { #1 } }{ \str_convert_pdfname:n { #2 } }
      }
      {
        \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
      }
  }
\cs_set_eq:NN \pdfdict_remove:nn \__pdfdict_remove:nn

\cs_new_protected:Npn \__pdfdict_gremove:nn #1 #2 %dict,name
  {
    \__pdfdict_if_exist:nTF  { #1 }
       {
         \exp_args:Nnx \prop_gremove:cn
           { \__pdfdict_name:n  { #1 } }{ \str_convert_pdfname:n { #2 } }
       }
       {
         \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
       }
  }

\cs_set_eq:NN \pdfdict_gremove:nn \__pdfdict_gremove:nn
\cs_new_protected:Npn \__pdfdict_show:Nn #1#2 %#1 message command, #2 dict
  {
    \prop_if_exist:cTF { \__pdfdict_name:n { #2 } }
       {
         #1
            { pdfdict }
            { show-dict }
            { \tl_to_str:n {#2}  }
            { \prop_map_function:cN {\__pdfdict_name:n { #2 }} \msg_show_item:nn }
            { \__pdfdict_get_type:n{#2} }
            { }
       }
       {
         #1 { pdfdict } { unknown-dict } { #2 } {}{}{}
       }
  }
\cs_new_protected:Npn \pdfdict_show:n #1
  {
    \__pdfdict_show:Nn \msg_show:nnxxxx {#1}
  }
\cs_new:Npn \__pdfdict_item:nn #1 #2 %#1 name, #2 value
  {
    \tl_if_blank:nF {#2} { /#1~#2~ }
  }
\cs_generate_variant:Nn \__pdfdict_item:nn {ne}
\cs_set_eq:NN \pdfdict_item:nn \__pdfdict_item:nn
\cs_generate_variant:Nn \pdfdict_item:nn {ne}
\cs_new:Npn \__pdfdict_use:n #1  %#1 dict
  {
    \prop_map_function:cN { \__pdfdict_name:n { #1 } } \__pdfdict_item:ne
  }

\cs_set_eq:NN \pdfdict_use:n \__pdfdict_use:n
%% File: l3pdfmanagement.dtx


\msg_new:nnn  { pdfmanagement } { unknown-dict }
              { The~PDF~management~resource~'#1'~is~unknown. }

\msg_new:nnn  { pdfmanagement } { empty-value }
              { The~value~for~#1~is~empty~and~will~be~ignored }

\msg_new:nnn  { pdfmanagement } { no-removal }
              { It~is~not~possible~to~remove~values~from~'#1'.}

\msg_new:nnn  { pdfmanagement } { no-show }
              { It~is~not~possible~to~show~the~content~of~'#1'.}

\msg_new:nnn  { pdfmanagement } { name-exist }
              { The~name~'#1'~has~already~been~used~for~name~tree~'#2'.}

\msg_new:nnn  { pdfmanagement } { show-dict }
  {
    The~PDF~resource~'#1'~
    \tl_if_empty:nTF {#2}
      { is~empty \\>~ . }
      { contains~the~pairs~(without~outer~braces): #2 . }
  }
\msg_new:nnn  { pdfmanagement } { dict-already-defined  }
  {
    The~path~'#1'~is~already~defined.
  }
\msg_new:nnn  { pdfmanagement } { inactive  }
  {
    The~PDF~resources~management~is~not~active\\
    command~'#1'~ignored.
  }
\tl_new:N \l__pdfmanagement_tmpa_tl
\tl_new:N \l__pdfmanagement_tmpb_tl
\seq_new:N \l__pdfmanagement_tmpa_seq

\bool_new:N \g__pdfmanagement_active_bool
\prg_new_conditional:Npnn \__pdfmanagement_if_active:  { p , T , F , TF }
  {
    \bool_if:NTF \g__pdfmanagement_active_bool
      { \prg_return_true:  }
      { \prg_return_false: }
  }
\prg_set_eq_conditional:NNn
  \pdfmanagement_if_active: \__pdfmanagement_if_active: { p , T , F , TF }

\cs_set_eq:NN \IfPDFManagementActiveTF\pdfmanagement_if_active:TF
\hook_new:n {pdfmanagement/add}
\cs_new_protected:Npn \pdfmanagement_add:nnn #1 #2 #3
  {
    \__pdfmanagement_if_active:TF
      {
        \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
          {
            \hook_gput_code:nnn
              {pdfmanagement/add}
              {pdfmanagement}
              {
                \__pdfmanagement_handler_gput:nnn { #1 }{ #2 }{ #3 }
              }
          }
          {
            \msg_error:nnn{pdfmanagement}{unknown-dict}{#1}
          }
      }
      {
        \msg_warning:nnx {pdfmanagement}{inactive}
          {\tl_to_str:n {\pdfmanagement_add:nnn}}
      }
  }

\cs_generate_variant:Nn \pdfmanagement_add:nnn {nnx,nxx,xxx}
\cs_set_eq:NN \PDFManagementAdd \pdfmanagement_add:xxx
\tl_new:N \g__kernel_pdfmanagement_thispage_shipout_code_tl
\tl_new:N \g__kernel_pdfmanagement_lastpage_shipout_code_tl
\tl_new:N \g__kernel_pdfmanagement_end_run_code_tl
\tl_gset:Nn \g__kernel_pdfmanagement_thispage_shipout_code_tl
  {
     \bool_if:NT \g__pdfmanagement_active_bool
       {
         \exp_args:NV \__pdf_backend_ThisPage_gpush:n      { \g_shipout_readonly_int }
         \exp_args:NV \__pdf_backend_PageResources_gpush:n { \g_shipout_readonly_int }
       }
  }

\tl_gset:Nn \g__kernel_pdfmanagement_end_run_code_tl
  {
    \bool_if:NT \g__pdfmanagement_active_bool
       {
         \__pdf_backend_PageResources_obj_gpush:          %ExtGState etc
         \__pdfmanagement_Pages_gpush:            %pagesattr
         \__pdfmanagement_Info_gpush:             %pdfinfo
         \__pdfmanagement_Catalog_gpush:
       }
  }



\cs_new_protected:Npn \__pdfmanagement_handler_gput:nnn #1 #2 #3  %#1 dict, #2 name, #3 value
  {
    \tl_if_empty:nTF { #3 }
      {
        \msg_none:nnn { pdfmanagement }{ empty-value }{ /#1/#2 }
      }
      {
        \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
          {
            \cs_if_exist:cTF
              { __pdfmanagement_handler/#1/?_gput:nn } %general, name independant handler
              { \use:c {__pdfmanagement_handler/#1/?_gput:nn} {#2} {#3} }
              {
                \cs_if_exist:cTF
                  { __pdfmanagement_handler/#1/#2_gput:n }
                  { \use:c {__pdfmanagement_handler/#1/#2_gput:n} {#3} } %special handler
                  {
                    \exp_args:Nnx
                    \prop_gput:cnn
                      { \__kernel_pdfdict_name:n { g__pdf_Core/#1 } }
                      { \str_convert_pdfname:n { #2 } }
                      { #3 }
                  }
              }
          }
          {
            \msg_error:nnn { pdfmanagement } { unknown-dict } { #1 }
          }
      }
  }

\cs_generate_variant:Nn \__pdfmanagement_handler_gput:nnn {nxx}

\cs_new_protected:Npn \__pdfmanagement_get:nnN  #1 #2 #3 %path,key,macro
  {
    \exp_args:Nnx
    \prop_get:cnN
      { \__kernel_pdfdict_name:n { g__pdf_Core/#1 } }
      { \str_convert_pdfname:n {#2} } #3
  }

\cs_new_protected:Npn \__pdfmanagement_handler_gremove:nn #1 #2 %path,key
  {
    \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
          {
            \cs_if_exist:cTF
              { __pdfmanagement_handler/#1/?_gremove:n } %general, name independant handler
              { \use:c {__pdfmanagement_handler/#1/?_gremove:n} {#2} }
              {
                \cs_if_exist:cTF
                  { __pdfmanagement_handler/#1/#2_gremove: }
                  { \use:c {__pdfmanagement_handler/#1/#2_gremove:} } %special handler
                  {
                    \exp_args:Nnx
                    \prop_gremove:cn
                      { \__kernel_pdfdict_name:n { g__pdf_Core/#1 } }
                      { \str_convert_pdfname:n {#2} }
                  }
              }
          }
          {
            \msg_error:nnn { pdfmanagement } { unknown-dict } { #1 }
          }
  }

\cs_new_protected:Npn \__pdfmanagement_gremove:nn #1 #2 %path,key
  {
    \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
          {
            \exp_args:Nnx
            \prop_gremove:cn
              { \__kernel_pdfdict_name:n { g__pdf_Core/#1 } }
              { \str_convert_pdfname:n{#2} }
          }
          {
            \msg_error:nnn { pdfmanagement } { unknown-dict } { #1 }
          }
  }

\cs_new_protected:Npn \__pdfmanagement_show:Nn #1#2
  {
    \cs_if_exist:cTF
      { __pdfmanagement_handler/#2/?_show: } %general, name independant handler
      { \use:c {__pdfmanagement_handler/#2/?_show:} }
      {
        \prop_if_exist:cTF { \__kernel_pdfdict_name:n { g__pdf_Core/#2 } }
          {
             #1
               { pdfmanagement } { show-dict }
               { \tl_to_str:n {#2} }
               {
                 \prop_map_function:cN
                  {\__kernel_pdfdict_name:n { g__pdf_Core/#2 }}
                  \msg_show_item:nn
               }
               { } { }
          }
          {
            #1 { pdfmanagement } { unknown-dict } {#2}{}{}{}
          }
       }
  }

\cs_new_protected:Npn \__pdfmanagement_show:n #1  %path
  {
    \prop_show:c { \__kernel_pdfdict_name:n { g__pdf_Core/#1 } }
  }
\cs_new_protected:Npn \pdfmanagement_show:n #1
  {
    \__pdfmanagement_show:Nn \msg_show:nnxxxx {#1}
  }
\cs_new_protected:Npn \pdfmanagement_remove:nn #1 #2
  {
    \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
      {
        \__pdfmanagement_handler_gremove:nn { #1 }{ #2 }
      }
      {
        \msg_error:nnn{pdfmanagement}{unknown-dict}{#1}
      }
  }
\cs_new_protected:Npn \pdfmanagement_get:nnN #1 #2 #3
  {
    \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
      {
        \__pdfmanagement_get:nnN { #1 }{ #2 } #3
      }
      {
        \msg_error:nnn{pdfmanagement}{unknown-dict}{#1}
      }
  }
\pdfdict_new:n { g__pdf_Core/Info}
\cs_new_protected:Npn \__pdfmanagement_Info_gpush:
  {
    \prop_map_function:cN
      { \__kernel_pdfdict_name:n { g__pdf_Core/Info} }
      \__pdf_backend_info_gput:nn
    \prop_gclear:c { \__kernel_pdfdict_name:n { g__pdf_Core/Info} }
  }
\pdfdict_new:n { g__pdf_Core/Pages}
\cs_new_protected:Npn \__pdfmanagement_Pages_gpush:
  {
    \pdfdict_if_empty:nF { g__pdf_Core/Pages}
      {
        \exp_args:Nx \__pdf_backend_Pages_primitive:n
          {
            \pdfdict_use:n { g__pdf_Core/Pages}
          }
      }
  }

\pdfdict_new:n { g__pdf_Core/Page }
\pdfdict_new:n { g__pdf_Core/ThisPage }

\cs_new_protected:cpn { __pdfmanagement_handler/Page/?_gput:nn } #1 #2
  {
    \__pdf_backend_Page_gput:nn { #1 }{ #2 }
  }
\cs_new_protected:cpn { __pdfmanagement_handler/Page/?_gremove:n } #1
  {
    \__pdf_backend_Page_gremove:n { #1 }
  }

\cs_new_protected:cpn { __pdfmanagement_handler/ThisPage/?_gput:nn } #1 #2
  {
    \prop_gput:cnn  { \__kernel_pdfdict_name:n { g__pdf_Core/ThisPage } }{ #1 } { #2 }
    \bool_if:NT \g__pdfmanagement_active_bool
      {
        \__pdf_backend_ThisPage_gput:nn { #1 }{ #2 }
      }
  }

\cs_new_protected:cpn { __pdfmanagement_handler/ThisPage/?_gremove:n } #1
  {
    \msg_warning:nnn { pdfmanagement } { no-removal }{ThisPage}
  }

\cs_new_protected:cpn { __pdfmanagement_handler/ThisPage/?_show: }
  {
    \msg_warning:nnn { pdfmanagement } { no-show }{ThisPage}
  }

\clist_const:Nn \c__pdfmanagement_PageResources_clist
  {
    ExtGState,
    ColorSpace,
    Pattern,
    Shading,
  }

\clist_map_inline:Nn \c__pdfmanagement_PageResources_clist
  {
    \pdfdict_new:n { g__pdf_Core/Page/Resources/#1}
  }
\cs_new_protected:cpn { __pdfmanagement_handler/Page/Resources/ExtGState/?_gput:nn } #1 #2
  {
    \__pdf_backend_PageResources_gput:nnn {ExtGState} { #1 }{ #2 }
  }

\cs_new_protected:cpn { __pdfmanagement_handler/Page/Resources/ColorSpace/?_gput:nn } #1 #2
  {
    \__pdf_backend_PageResources_gput:nnn {ColorSpace} { #1 }{ #2 }
  }

\cs_new_protected:cpn { __pdfmanagement_handler/Page/Resources/Shading/?_gput:nn } #1 #2
  {
    \__pdf_backend_PageResources_gput:nnn {Shading} { #1 }{ #2 }
  }

\cs_new_protected:cpn { __pdfmanagement_handler/Page/Resources/Pattern/?_gput:nn } #1 #2
  {
    \__pdf_backend_PageResources_gput:nnn {Pattern} { #1 }{ #2 }
  }
\pdfdict_new:n { g__pdf_Core/Catalog}

\clist_const:Nn \c__pdfmanagement_Catalog_toplevel_clist
  {
    Collection,
    DPartRoot,
    Lang,
    Legal,
    Metadata,
    NeedsRendering,
    OCProperties/D,
    OpenAction,
    PageLabels,
    PageLayout,
    PageMode,
    Perms,
    PieceInfo,
    SpiderInfo,
    StructTreeRoot,
    Threads,
    URI,
    Version
  }

\clist_const:Nn \c__pdfmanagement_Catalog_sub_clist
  {
    AA,
    AcroForm,
    AcroForm/DR,
    AcroForm/DR/Font,
    MarkInfo,
    ViewerPreferences,
    OCProperties
  }

\clist_map_inline:Nn \c__pdfmanagement_Catalog_sub_clist
  {
    \pdfdict_new:n { g__pdf_Core/Catalog/#1}
  }

\clist_const:Nn \c__pdfmanagement_Catalog_seq_clist
  {
    AF,
    OCProperties/OCGs,
    OCProperties/Configs,
    OutputIntents,
    Requirements,
    AcroForm/Fields,
    AcroForm/CO
  }

\clist_const:Nn \c__pdfmanagement_Catalog_nametree_clist
  {
    AP,
    JavaScript,
  }
\clist_map_inline:Nn \c__pdfmanagement_Catalog_seq_clist
 {
   \seq_new:c { g__pdfmanagement_/Catalog/#1_seq } % new name later
   \cs_new_protected:cpn { __pdfmanagement_handler/Catalog/#1_gput:n } ##1
     {
       \seq_gput_right:cn { g__pdfmanagement_/Catalog/#1_seq } {  ##1  }
     }
 }

\cs_new_protected:cpn { __pdfmanagement_handler/Catalog/OCProperties/D_gput:n } #1
  {
    \seq_gput_left:cn
      { g__pdfmanagement_/Catalog/OCProperties/Configs_seq }
      {  #1  }
  }
\cs_new_protected:Npn \__pdfmanagement_nametree_add_aux:nnn #1 #2 #3
  %#1 name tree, #2 sanitized name #3 value
  {
     \prop_get:coNTF
       { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/Names/#1 }}
       { #2 }
       \l__pdfmanagement_tmpb_tl
       {
         \msg_error:nnnn{pdfmanagement}{name-exist}{#2}{#1}
       }
       {
         \prop_gput:con
           { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/Names/#1 }}
           { #2 }
           { #3 }
       }
  }
\clist_map_inline:Nn \c__pdfmanagement_Catalog_nametree_clist
 {
   \pdfdict_new:n { g__pdf_Core/Catalog/Names/#1}
   \cs_new_protected:cpn { __pdfmanagement_handler/Catalog/Names/#1/?_gput:nn } ##1 ##2
     {
       \pdf_string_from_unicode:nnN {utf8/string}{##1}\l__pdfmanagement_tmpa_tl
       \exp_args:Nno
         \__pdfmanagement_nametree_add_aux:nnn {#1}{\l__pdfmanagement_tmpa_tl}{##2}
     }
 }
\pdfdict_new:n { g__pdf_Core/Catalog/Names/EmbeddedFiles}
\cs_new_protected:cpn { __pdfmanagement_handler/Catalog/Names/EmbeddedFiles/?_gput:nn } #1 #2
  {
    \pdf_string_from_unicode:nnN {utf8/string}{#1}\l__pdfmanagement_tmpa_tl
    \exp_args:Nno
    \__pdfmanagement_nametree_add_aux:nnn
      {EmbeddedFiles}{\l__pdfmanagement_tmpa_tl}{#2}
    \exp_args:No
    \__pdf_backend_NamesEmbeddedFiles_add:nn {\l__pdfmanagement_tmpa_tl}{#2}
  }
\cs_new_protected:Npn \__pdfmanagement_Catalog_gpush:
  {
    \use:c { __pdfmanagement_/Catalog/AA_gpush: }
    \use:c { __pdfmanagement_/Catalog/AcroForm_gpush: }
    \use:c { __pdfmanagement_/Catalog/AF_gpush: }
    \use:c { __pdfmanagement_/Catalog/MarkInfo_gpush: }
    \pdfmeta_standard_verify:nT {Catalog_no_OCProperties}
      {
        \use:c { __pdfmanagement_/Catalog/OCProperties_gpush: }
      }
    \use:c { __pdfmanagement_/Catalog/OutputIntents_gpush: }
    \use:c { __pdfmanagement_/Catalog/Requirements_gpush: }
    \use:c { __pdfmanagement_/Catalog/ViewerPreferences_gpush: }
    % output the single values:
    \prop_map_function:cN
      { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog} }
      \__pdf_backend_catalog_gput:nn
    % output names tree:
    \use:c{ __pdfmanagement_/Catalog/Names_gpush:n } {EmbeddedFiles}
    \clist_map_inline:Nn \c__pdfmanagement_Catalog_nametree_clist
     {
      \use:c{ __pdfmanagement_/Catalog/Names_gpush:n } {##1}
     }
  }
\cs_new_protected:cpn { __pdfmanagement_/Catalog/AA_gpush: }
  {
    \prop_if_empty:cF
     { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AA } }
     {
       \__pdf_backend_object_new:nn  { __pdfmanagement/Catalog/AA } { dict }
       \__pdf_backend_object_write:nx
            { __pdfmanagement/Catalog/AA }
            { \pdfdict_use:n { g__pdf_Core/Catalog/AA } }
       \exp_args:Nnx
         \__pdf_backend_catalog_gput:nn
           {AA}
           {
             \__pdf_backend_object_ref:n { __pdfmanagement/Catalog/AA }
           }
     }
  }
\cs_new_protected:cpn { __pdfmanagement_/Catalog/AcroForm_gpush: }
  {
    \seq_if_empty:cF { g__pdfmanagement_/Catalog/AcroForm/Fields_seq }
      {
        \__pdf_backend_object_new:nn  { __pdfmanagement/Catalog/AcroForm/Fields } { array }
        \__pdf_backend_object_write:nx
            { __pdfmanagement/Catalog/AcroForm/Fields }
            { \seq_use:cn { g__pdfmanagement_/Catalog/AcroForm/Fields_seq } {~} }
        \exp_args:Nnnx
          \prop_gput:cnn %we have to use \prop here to avoid the handler ...
            { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm } }
            { Fields }
            { \__pdf_backend_object_ref:n { __pdfmanagement/Catalog/AcroForm/Fields } }
      }
    \seq_if_empty:cF { g__pdfmanagement_/Catalog/AcroForm/CO_seq }
      {
        \__pdf_backend_object_new:nn  { __pdfmanagement/Catalog/AcroForm/CO } { array }
        \exp_args:Nnx
          \__pdf_backend_object_write:nn
            { __pdfmanagement/Catalog/AcroForm/CO }
            { \seq_use:cn { g__pdfmanagement_/Catalog/AcroForm/CO_seq } {~} }
        \exp_args:Nnnx
          \prop_gput:cnn %we have to use \prop here to avoid the handler ...
            { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm } }
            { CO }
            { \__pdf_backend_object_ref:n { __pdfmanagement/Catalog/AcroForm/CO } }
      }
     \prop_if_empty:cF { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm/DR/Font}}
       {
         \__pdf_backend_object_new:nn { __pdfmanagement/Catalog/AcroForm/DR/Font } {dict}
         \exp_args:Nnx
           \__pdf_backend_object_write:nn
             { __pdfmanagement/Catalog/AcroForm/DR/Font }
             { \pdfdict_use:n { g__pdf_Core/Catalog/AcroForm/DR/Font } }
         \exp_args:Nnnx
           \prop_gput:cnn %we have to use \prop here to avoid the handler ...
             { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm/DR } }
             { Font }
             { \__pdf_backend_object_ref:n { __pdfmanagement/Catalog/AcroForm/DR/Font } }
       }
     \prop_if_empty:cF { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm/DR}}
       {
         \__pdf_backend_object_new:nn { __pdfmanagement/Catalog/AcroForm/DR } {dict}
         \exp_args:Nnx
           \__pdf_backend_object_write:nn
             { __pdfmanagement/Catalog/AcroForm/DR }
             { \pdfdict_use:n { g__pdf_Core/Catalog/AcroForm/DR } }
         \exp_args:Nnnx
           \prop_gput:cnn %we have to use \prop here to avoid the handler ...
             { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm } }
             { DR }
             { \__pdf_backend_object_ref:n { __pdfmanagement/Catalog/AcroForm/DR } }
       }
     \prop_if_empty:cF { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm} }
       {
         \__pdf_backend_object_new:nn { __pdfmanagement/Catalog/AcroForm } {dict}
         \exp_args:Nnx
           \__pdf_backend_object_write:nn
             { __pdfmanagement/Catalog/AcroForm }
             { \pdfdict_use:n { g__pdf_Core/Catalog/AcroForm } }
         \exp_args:Nnnx
           \__pdfmanagement_handler_gput:nnn
             { Catalog }
             { AcroForm }
             { \__pdf_backend_object_ref:n { __pdfmanagement/Catalog/AcroForm } }
       }
  }

\cs_new_protected:cpn { __pdfmanagement_/Catalog/AF_gpush: }
  {
    \seq_if_empty:cF
     { g__pdfmanagement_/Catalog/AF_seq }
     {
       \__pdf_backend_object_new:nn  { __pdfmanagement/Catalog/AF } { array }
       \exp_args:Nnx
         \__pdf_backend_object_write:nn
            { __pdfmanagement/Catalog/AF }
            { \seq_use:cn { g__pdfmanagement_/Catalog/AF_seq } {~} }
       \exp_args:Nnx
         \__pdf_backend_catalog_gput:nn
           {AF}
           {
             \__pdf_backend_object_ref:n {__pdfmanagement/Catalog/AF}
           }
     }
  }
\cs_new_protected:cpn { __pdfmanagement_/Catalog/MarkInfo_gpush: }
  {
    \prop_if_empty:cF
     { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/MarkInfo } }
     {
       \__pdf_backend_object_new:nn  { __pdfmanagement/Catalog/MarkInfo } { dict }
       \exp_args:Nnx
         \__pdf_backend_object_write:nn
            { __pdfmanagement/Catalog/MarkInfo }
            { \pdfdict_use:n { g__pdf_Core/Catalog/MarkInfo } }
       \exp_args:Nnx
         \__pdf_backend_catalog_gput:nn
           {MarkInfo}
           {
             \__pdf_backend_object_ref:n {__pdfmanagement/Catalog/MarkInfo}
           }
     }
  }
\cs_new_protected:cpn { __pdfmanagement_/Catalog/OCProperties_gpush: }
  {
   \int_compare:nNnT
      {
        ( \seq_count:c { g__pdfmanagement_/Catalog/OCProperties/OCGs_seq }  )*
        ( \seq_count:c { g__pdfmanagement_/Catalog/OCProperties/Configs_seq } )
      }
      >
      { 0 }
      {
        \__pdf_backend_object_new:nn  { __pdfmanagement/Catalog/OCProperties } { dict }
        \seq_gpop_left:cN { g__pdfmanagement_/Catalog/OCProperties/Configs_seq} \l__pdfmanagement_tmpa_tl
        \exp_args:Nnx
          \__pdf_backend_object_write:nn {__pdfmanagement/Catalog/OCProperties}
            {
              /OCGs~[ \seq_use:cn { g__pdfmanagement_/Catalog/OCProperties/OCGs_seq } {~} ]
              /D~\l__pdfmanagement_tmpa_tl~
              \seq_if_empty:cF { g__pdfmanagement_/Catalog/OCProperties/Configs_seq }
                {
                  /Configs~
                  [ \seq_use:cn { g__pdfmanagement_/Catalog/OCProperties/Configs_seq} {~} ]
                }
            }
        \exp_args:Nnx
          \__pdf_backend_catalog_gput:nn
            { OCProperties }
            { \__pdf_backend_object_ref:n {__pdfmanagement/Catalog/OCProperties} }
      }
  }
\cs_new_protected:cpn { __pdfmanagement_/Catalog/OutputIntents_gpush: }
  {
    \seq_if_empty:cF
     { g__pdfmanagement_/Catalog/OutputIntents_seq }
     {
       \__pdf_backend_object_new:nn  { __pdfmanagement/Catalog/OutputIntents } { array }
       \exp_args:Nnx
         \__pdf_backend_object_write:nn
            { __pdfmanagement/Catalog/OutputIntents }
            { \seq_use:cn { g__pdfmanagement_/Catalog/OutputIntents_seq } {~} }
       \exp_args:Nnx
         \__pdf_backend_catalog_gput:nn
           {OutputIntents}
           {
             \__pdf_backend_object_ref:n {__pdfmanagement/Catalog/OutputIntents}
           }
     }
  }
\cs_new_protected:cpn { __pdfmanagement_/Catalog/Requirements_gpush: }
  {
    \seq_if_empty:cF
     { g__pdfmanagement_/Catalog/Requirements_seq }
     {
       \__pdf_backend_object_new:nn  { __pdfmanagement/Catalog/Requirements } { array }
       \exp_args:Nnx
         \__pdf_backend_object_write:nn
            { __pdfmanagement/Catalog/Requirements }
            { \seq_use:cn { g__pdfmanagement_/Catalog/Requirements_seq } {~} }
       \exp_args:Nnx
         \__pdf_backend_catalog_gput:nn
           {Requirements}
           {
             \__pdf_backend_object_ref:n { __pdfmanagement/Catalog/Requirements }
           }
     }
  }
\cs_new_protected:cpn { __pdfmanagement_/Catalog/ViewerPreferences_gpush: }
  {
    \prop_if_empty:cF
     { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/ViewerPreferences } }
     {
       \__pdf_backend_object_new:nn  { __pdfmanagement/Catalog/ViewerPreferences } { dict }
       \exp_args:Nnx
         \__pdf_backend_object_write:nn
            { __pdfmanagement/Catalog/ViewerPreferences }
            { \pdfdict_use:n { g__pdf_Core/Catalog/ViewerPreferences } }
       \exp_args:Nnx
         \__pdf_backend_catalog_gput:nn
           {ViewerPreferences}
           {
             \__pdf_backend_object_ref:n {__pdfmanagement/Catalog/ViewerPreferences}
           }
     }
  }
\int_new:N \g__pdfmanagement_EmbeddedFiles_int
\cs_new:Npn \__pdfmanagement_EmbeddedFiles_name:
 {
   (
    l3ef
    \int_compare:nNnT {\g__pdfmanagement_EmbeddedFiles_int} < {10}
     {0}
    \int_compare:nNnT {\g__pdfmanagement_EmbeddedFiles_int} < {100}
     {0}
    \int_compare:nNnT {\g__pdfmanagement_EmbeddedFiles_int} < {1000}
     {0}
    \int_use:N \g__pdfmanagement_EmbeddedFiles_int
   )
 }
\pdfdict_new:n { g__pdf_Core/Catalog/Names }

\cs_new_protected:cpn { __pdfmanagement_handler/Catalog/Names/EmbeddedFiles_gput:n } #1
  {
    \int_gincr:N \g__pdfmanagement_EmbeddedFiles_int
    \exp_args:Nnx
    \prop_gput:cnn
      { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/Names/EmbeddedFiles }}
      { \__pdfmanagement_EmbeddedFiles_name: }
      { #1 }
     \exp_args:Nx
     \__pdf_backend_NamesEmbeddedFiles_add:nn {\__pdfmanagement_EmbeddedFiles_name:} { #1 }
  }
\cs_new_protected:cpn  { __pdfmanagement_/Catalog/Names_gpush:n } #1 %#1 name of name tree
 {
   \pdfdict_if_empty:nF { g__pdf_Core/Catalog/Names/#1 }
     {
       \seq_clear:N \l__pdfmanagement_tmpa_seq
       \prop_map_inline:cn
         {\__kernel_pdfdict_name:n { g__pdf_Core/Catalog/Names/#1 }}
         { \seq_put_right:Nn \l__pdfmanagement_tmpa_seq {##1~##2}}
       \seq_sort:Nn  \l__pdfmanagement_tmpa_seq
         {
           \str_compare:nNnTF {##1} > {##2}
             { \sort_return_swapped: }
             { \sort_return_same: }
         }
       \exp_args:Nnx \__pdf_backend_Names_gpush:nn
         {#1}
         {
           \seq_use:Nn \l__pdfmanagement_tmpa_seq {~}
         }
     }
 }
\cs_new_protected:cpn {__pdfmanagement_handler/Catalog/?_show:}
  {
    \iow_term:x
      {
        \iow_newline:
        The~Catalog~contains~in~the~top~level~the~single~value~entries
        \prop_map_function:cN
          {\__kernel_pdfdict_name:n { g__pdf_Core/Catalog }}
          \msg_show_item:nn
      }
    \clist_map_inline:Nn \c__pdfmanagement_Catalog_seq_clist
     {
       \seq_if_empty:cF {  g__pdfmanagement_/Catalog/##1_seq }
         {
           \iow_term:x
             {
               The~'##1'~array~contains~the~entries
               \seq_map_function:cN { g__pdfmanagement_/Catalog/##1_seq } \msg_show_item:n
             }
         }
      }
    \clist_map_inline:Nn \c__pdfmanagement_Catalog_sub_clist
      {
        \prop_if_empty:cF { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/##1 } }
          {
            \iow_term:x
              {
                The~Catalog~subdirectory~'##1'~contains~the~single~value~entries
                \prop_map_function:cN
                  {\__kernel_pdfdict_name:n { g__pdf_Core/Catalog/##1 }}
                  \msg_show_item:nn
              }
          }
      }
    \tl_show:x {\tl_to_str:n{\pdfmanagement_show:n{Catalog}}}
  }
\pdfdict_new:n { g__pdf_Core/Xform/Resources/Properties}
%% File: ltdocinit.dtx
\clist_new:N \g__pdfmanagement_firstaidoff_clist
\tl_new:N \g__pdfmanagement_testphase_tl
\cs_if_free:NT \DocumentMetadata
  {
    \keys_define:nn { document / metadata }
      {
        backend .choices:nn =
          { dvipdfmx , dvips , dvisvgm , luatex , pdftex , pdfmode , xdvipdfmx , xetex }
          {
            \sys_load_backend:n {#1}
          },
        backend .groups:n = { init } ,
      }

    \keys_define:nn { document / metadata }
      {
        ,pdfversion .code:n =
          {
            \pdf_version_gset:n { #1 }
            \AddToDocumentProperties[document]{pdfversion}{#1}
          }
        ,uncompress .code:n =
          {
            \pdf_uncompress:
          }
        ,uncompress .value_forbidden:n = true
        ,lang .code:n =
          {
            \pdfmanagement_add:nnn {Catalog} {Lang}{(#1)}
            \AddToDocumentProperties[document]{lang}{#1}
          }
        %,xmpmeta .bool_gset:N = \g_pdfmeta_xmp_bool %see pdfmeta unused and undefined for now!
        % this uses internal command from pdfmeta, it should probably move there ...
        ,pdfstandard .code:n =
          {
            \exp_args:Nnx
            \keys_set:nn {document / metadata} {_pdfstandard=\str_uppercase:n{#1}}
          }
        ,_pdfstandard .choices:nn =
          {A-1B,A-2A,A-2B,A-2U,A-3A,A-3B,A-3U}
          {
            \prop_if_exist:cT { g__pdfmeta_standard_pdf/#1_prop }
              {
                \prop_gset_eq:Nc \g__pdfmeta_standard_prop { g__pdfmeta_standard_pdf/#1 _prop }
              }
            \AddToDocumentProperties [document]{pdfstandard}{#1}
          }
        ,_pdfstandard / unknown .code:n =
          {
            \msg_warning:nnn{pdf}{unknown-standard}{#1}
          }
        ,testphase .multichoice:
        ,testphase / tagpdf .code:n =
          {
            \tl_gput_right:Nn\g__pdfmanagement_testphase_tl
              {
                \file_if_exist_input:nF {tagpdf-latex-lab-testphase.ltx}
                  {
                    \RequirePackage{tagpdf}
                    \AddToDocumentProperties [document]{testphase/tagpdf}{loaded}
                    \tagpdfsetup{activate,paratagging,interwordspace}
                    \AddToDocumentProperties [document]{tagging}{active}
                    \AddToDocumentProperties [document]{tagging/para}{active}
                    \AddToDocumentProperties [document]{tagging/interwordspace}{active}
                  }
              }
          }
        ,testphase / unknown .code:n =
          {
            \tl_gput_right:Nn\g__pdfmanagement_testphase_tl
               {
                 \AddToDocumentProperties [document]{testphase/#1}{loaded}
                 \file_if_exist_input:nF {#1-latex-lab-testphase.ltx}
                  {
                     \msg_warning:nnn{document}{latex-lab-pkg-missing}{#1}
                     \AddToDocumentProperties [document]{testphase/#1}{missing}
                  }
               }
          }
        ,activate .multichoice:
        ,activate / tagging .code:n =
          {
            \PackageWarning{pdfmanagement-testphase}
             {The~activate~key~is~deprecated.\MessageBreak
              Tagging~is~activated~with~'testphase=tagpdf'~directly}{}
          }
        ,debug .code:n =
          {
            \keys_set:nn { document / metadata / debug } {#1}
          }
        ,debug / para .code:n =
          {
            \AddToHook
              {
                package/tagpdf/after
              }
              {
                 \tagpdfsetup{paratagging-show}
              }
          }
        ,debug / log .code:n =
          {
            \AddToHook
              {
               package/tagpdf/after
              }
              {
                 \tagpdfsetup{log=#1}
              }
          }
        ,debug / uncompress .code:n =
          {
            \pdf_uncompress:
          }
        ,debug / pdfmanagement .bool_gset:N = \g__pdfmanagement_active_bool
        ,debug / firstaidoff .clist_gset:N = \g__pdfmanagement_firstaidoff_clist
      }
   }
\cs_if_exist:NT \DocumentMetadata
   {
     \cs_new_protected:Npn \DeclareDocumentMetadata
        {
          \cs_if_free:NT \DocumentMetadata
            {
              \file_if_exist_input:nF {documentmetadata-support.ltx}%
               {
                 \@latex@error
                   {No~support~files~for~\noexpand\DeclareDocumentMetadata~found}
                   {
                     Is~the~'LaTeX-lab'~bundle~installed?
                     \MessageBreak
                     Without~it,~the~declaration~is~ignored.
                   }
                \let\DeclareDocumentMetadata\@gobble
               }
            }
          \RenewDocumentCommand \DeclareDocumentMetadata {}
           { \DocumentMetadata }
          \DocumentMetadata
        }
    }
\cs_if_free:NT \DocumentMetadata
  {
    \prop_gput:Nnn \g_msg_module_type_prop { document } { LaTeX }
    \prop_gput:Nnn \g_msg_module_name_prop { document } { DocumentMetadata }
    \msg_new:nnn
      { document } { setup-after-documentclass }
      {
        \token_to_str:N \DocumentMetadata \c_space_tl
        should~be~used~only~before~\token_to_str:N\documentclass
      }
    \msg_new:nnn
      { document } { latex-lab-pkg-missing }
      {
        LaTeX-lab~package~'#1'~not~found.
      }
    \NewDocumentCommand\DocumentMetadata { m }
      {
        \cs_if_eq:NNTF \documentclass \@twoclasseserror
          { \msg_error:nn { document }{ setup-after-documentclass } }
          {
            \bool_gset_true:N \g__pdfmanagement_active_bool
            \keys_set_groups:nnn { document / metadata} {init}{ #1 }
        %if no backend has been loaded force it now:
            \str_if_exist:NF \c_sys_backend_str
              {
                \sys_load_backend:n {}
              }
        \ExplSyntaxOn\makeatletter
              \file_input:n {l3backend-testphase-\c_sys_backend_str.def}
        \ExplSyntaxOff\makeatother
            \keys_set_filter:nnn  { document / metadata } { init } { lang=en-US, #1 }
            \bool_if:NT \g__pdfmanagement_active_bool
              {
                \PassOptionsToPackage{customdriver=hgeneric-testphase}{hyperref}
              }
           \hook_use_once:n {pdfmanagement/add}
           \RenewDocumentCommand\DocumentMetadata { m }
              {
                \keys_set_filter:nnn  { document / metadata } { init } { ##1 }
                \bool_if:NTF \g__pdfmanagement_active_bool
                  {
                    \str_remove_all:cn
                      {opt@hyperref.sty}{customdriver=hgeneric-testphase}
                    \PassOptionsToPackage
                      {customdriver=hgeneric-testphase}{hyperref}
                 }
                 {
                   \str_remove_all:cn
                     {opt@hyperref.sty}{customdriver=hgeneric-testphase}
                 }
              }
            \g__pdfmanagement_testphase_tl
            \RequirePackage{pdfmanagement-firstaid}
          }
      }
    \NewDocumentCommand\DeclareDocumentMetadata{}{\DocumentMetadata}
  }
\prop_new:N \g__pdfmanagement_documentproperties_prop %
\NewDocumentCommand\AddToDocumentProperties{O{\@currname}mm}
  {
    \exp_args:NNx
      \prop_gput:Nnn \g__pdfmanagement_documentproperties_prop
        {
          \tl_if_blank:eTF {#1}{top-level/}{#1/} #2
        }
        { #3}
  }
\NewExpandableDocumentCommand\GetDocumentProperties{m}
  {
    \prop_item:Nn \g__pdfmanagement_documentproperties_prop {#1}
  }
\msg_new:nnn  { pdfmanagement } { show-properties }
  {
    The~following~document~properties~have~been~stored:
    #1
  }
\NewDocumentCommand\ShowDocumentProperties {}
  {
    \msg_show:nnx {pdfmanagement}{show-properties}
      {
        \prop_map_function:NN \g__pdfmanagement_documentproperties_prop \msg_show_item:nn
      }
  }
%% File: l3pdfannot.dtx
\RequirePackage{l3bitset}
\bitset_new:Nn \l_pdfannot_F_bitset
  {
    Invisible      = 1,
    Hidden         = 2,
    Print          = 3,
    NoZoom         = 4,
    NoRotate       = 5,
    NoView         = 6,
    ReadOnly       = 7,
    Locked         = 8,
    ToggleNoView   = 9,
    LockedContents = 10
  }
\bool_new:N \g__pdfannot_use_lastlink_bool
\cs_new_protected:Npn \pdfannot_box:nnnn #1 #2 #3 #4
  {
    \__pdf_backend_annotation:nnnn {#1}{#2}{#3}{#4}
    \bool_gset_false:N\g__pdfannot_use_lastlink_bool
  }
\cs_generate_variant:Nn \pdfannot_box:nnnn {nnnx}
\cs_new:Npn \pdfannot_box_ref_last:
  {
    \__pdf_backend_annotation_last:
  }

 \pdfdict_new:n   { l__pdfannot/widget }
 \pdfdict_new:n   { l__pdfannot/widget/AA }
 \pdfdict_new:n   { l__pdfannot/widget/AP }
 \pdfdict_new:n   { l__pdfannot/widget/MK }
 \pdfdict_new:n   { l__pdfannot/widget/BS }
 \pdfdict_put:nnn { l__pdfannot/widget }{ Subtype }{ /Widget }
 \hook_new_pair:nn
   {pdfannot/widget/before}
   {pdfannot/widget/after}
\cs_new_protected:Npn \pdfannot_widget_box:nnn #1 #2 #3
  {
    \hook_use:n { pdfannot/widget/before }
    \group_begin:
    \pdfmeta_standard_verify:nT
      {annot_widget_no_AA}
      {
        \pdfdict_if_empty:nF { l__pdfannot/widget/AA }
          {
            \pdf_object_unnamed_write:nx {dict}{\pdfdict_use:n{l__pdfannot/widget/AA}}
            \pdfdict_put:nnx { l__pdfannot/widget }
              {AA}
              {\pdf_object_ref_last:}
          }
      }
    \pdfdict_if_empty:nF { l__pdfannot/widget/AP }
      {
        \pdf_object_unnamed_write:nx {dict}{\pdfdict_use:n{l__pdfannot/widget/AP}}
        \pdfdict_put:nnx { l__pdfannot/widget }
             {AP}
             {\pdf_object_ref_last:}
      }
    \pdfdict_if_empty:nF { l__pdfannot/widget/MK }
      {
        \pdf_object_unnamed_write:nx {dict}{\pdfdict_use:n{l__pdfannot/widget/MK}}
        \pdfdict_put:nnx { l__pdfannot/widget }
             {MK}
             {\pdf_object_ref_last:}
      }
    \pdfdict_if_empty:nF { l__pdfannot/widget/BS }
      {
        \pdf_object_unnamed_write:nx {dict}{\pdfdict_use:n{l__pdfannot/widget/BS}}
        \pdfdict_put:nnx { l__pdfannot/widget }
             {BS}
             {\pdf_object_ref_last:}
      }
    \pdfannot_box:nnnx {#1}{#2}{#3}
      {
        \pdfdict_use:n { l__pdfannot/widget}
      }
    \hook_use:n { pdfannot/widget/end }
    \group_end:
    \bool_gset_false:N\g__pdfannot_use_lastlink_bool
  }
\seq_const_from_clist:Nn \c_pdfannot_link_types_seq { URI , GoToR , Launch , GoTo, Named }
\seq_map_inline:Nn \c_pdfannot_link_types_seq
  {
    \pdfdict_new:n { l__pdfannot/link/#1 }
    \pdfdict_put:nnn { l__pdfannot/link/#1 }{ Subtype }{ /Link }
    \hook_new_pair:nn
      {pdfannot/link/#1/before}
      {pdfannot/link/#1/after}
    \hook_new_pair:nn
      {pdfannot/link/#1/begin}
      {pdfannot/link/#1/end}
   }
\cs_new_protected:Nn \pdfannot_link_off: { \__pdf_backend_link_off: }
\cs_new_protected:Nn \pdfannot_link_on:  { \__pdf_backend_link_on: }
\cs_new_protected:Nn \pdfannot_link:nnn %#1 type (URI, GoTo etc),
                                        %#2 action spec, #3 link text
  {
    \hook_use:n { pdfannot/link/#1/before}
    \mode_leave_vertical:
    \exp_args:Nxx %xetex needs expansion
    \__pdf_backend_link_begin_user:nnw
      {
         \pdfdict_if_exist:nT { l__pdfannot/link/#1 }
          {
            \pdfdict_use:n { l__pdfannot/link/#1}
          }
      }
      {
        #2 %exp_not?
      }
    \bool_gset_true:N \g__pdfannot_use_lastlink_bool
    \hook_use:n { pdfannot/link/#1/begin}
    #3
    \hook_use:n { pdfannot/link/#1/end}
    \__pdf_backend_link_end:
    \bool_gset_true:N \g__pdfannot_use_lastlink_bool
    \hook_use:n { pdfannot/link/#1/after}
  }
\cs_generate_variant:Nn \pdfannot_link:nnn {nxn}
\cs_new_protected:Npn \pdfannot_link_begin:nnw #1 #2 %#1 type, #2 action spec
  {
    \hook_use:n { pdfannot/link/#1/before}
    \mode_leave_vertical:
    \exp_args:Nxx %xetex needs expansion
      \__pdf_backend_link_begin_user:nnw
        {
           \pdfdict_if_exist:nT { l__pdfannot/link/#1 }
            {
              \pdfdict_use:n { l__pdfannot/link/#1}
            }
        }
        { #2 }
      \bool_gset_true:N \g__pdfannot_use_lastlink_bool
      \hook_use:n { pdfannot/link/#1/begin}
  }

\cs_new_protected:Nn \pdfannot_link_end:n %#1 type, e.g. url
  {
    \hook_use:n { pdfannot/link/#1/end}
    \__pdf_backend_link_end:
    \bool_gset_true:N \g__pdfannot_use_lastlink_bool
    \hook_use:n { pdfannot/link/#1/after}
  }
\cs_generate_variant:Nn \pdfannot_link_begin:nnw {nxw}
\cs_new_protected:Npn \pdfannot_link_goto_begin:nw #1 %#1 destination
  {
    \pdfdict_remove:nn { l__pdfannot/link/GoTo} {Subtype}
    \hook_use:n { pdfannot/link/GoTo/before} %the backend add it too
    \mode_leave_vertical:
    \exp_args:Nxx %xetex needs expansion
    \__pdf_backend_link_begin_goto:nnw
      {
        \pdfdict_use:n { l__pdfannot/link/GoTo}
      }
      { #1 }
     \bool_gset_true:N \g__pdfannot_use_lastlink_bool
    \pdfdict_put:nnn { l__pdfannot/link/GoTo} {Subtype}{GoTo}
     \hook_use:n { pdfannot/link/GoTo/begin}
  }

\cs_new_protected:Nn \pdfannot_link_goto_end:
  {
    \hook_use:n { pdfannot/link/GoTo/end}
    \__pdf_backend_link_end:
    \bool_gset_true:N \g__pdfannot_use_lastlink_bool
     \hook_use:n { pdfannot/link/GoTo/after}
  }
\cs_new:Nn \pdfannot_link_ref_last: { \__pdf_backend_link_last: }
\cs_new:Npn \pdfannot_ref_last:
  {
    \bool_if:NTF \g__pdfannot_use_lastlink_bool
      {
        \__pdf_backend_link_last:
      }
      {
        \__pdf_backend_annotation_last:
      }
  }
\cs_new_protected:Npn \pdfannot_link_margin:n #1
  {
    \__pdf_backend_link_margin:n { #1 }
  }
\cs_new_protected:Npn \pdfannot_dict_put:nnn #1 #2 #3
  {
    \pdfdict_put:nnn { l__pdfannot/#1 } { #2 }{ #3 }
  }
\cs_generate_variant:Nn \pdfannot_dict_put:nnn {nnx}
\cs_new_protected:Npn \pdfannot_dict_remove:nn #1 #2
  {
    \pdfdict_remove:nn { l__pdfannot/#1 } { #2 }
  }
\cs_new_protected:Npn \pdfannot_dict_show:n #1
  {
    \pdfdict_show:n { l__pdfannot/#1 }
  }

\cs_new:Npn \pdfannot_dict_use:n #1
  {
    \pdfdict_use:n { l__pdfannot/#1 }
  }
%% File: l3pdfxform.dtx
\cs_new_protected:Npn  \pdfxform_new:nnn #1 #2 #3
  {
    \__pdf_backend_xform_new:nnnn { #1 } { #2 } {  } { #3 }
  }
\cs_new_protected:Npn \pdfxform_use:n #1
  {
    \__pdf_backend_xform_use:n { #1 }
  }
\cs_new:Npn \pdfxform_ref:n #1
  {
    \__pdf_backend_xform_ref:n { #1 }
  }

\cs_generate_variant:Nn \pdfxform_ref:n {o}
\cs_new:Npn \pdfxform_wd:n #1
  {
    \tl_use:c { c__pdf_backend_xform_wd_ \tl_to_str:n { #1 } _tl }
  }

\cs_new:Npn \pdfxform_ht:n #1
  {
    \tl_use:c { c__pdf_backend_xform_ht_ \tl_to_str:n { #1 } _tl }
  }

\cs_new:Npn \pdfxform_dp:n #1
  {
    \tl_use:c { c__pdf_backend_xform_dp_ \tl_to_str:n { #1 } _tl }
  }
%% File: l3pdfmeta.dtx
\msg_new:nnn  {pdf }{unknown-standard}{The~standard~'#1'~is~unknown~and~has~been~ignored}
\tl_new:N\l__pdfmeta_tmpa_tl
\tl_new:N\l__pdfmeta_tmpb_tl
\str_new:N \l__pdfmeta_tmpa_str
\prop_new:N \g__pdfmeta_standard_prop
\cs_new:Npn \pdfmeta_standard_item:n #1
 {
   \prop_item:Nn \g__pdfmeta_standard_prop {#1}
 }
\cs_new_protected:Npn \pdfmeta_standard_get:nN #1 #2
 {
   \prop_get:NnN \g__pdfmeta_standard_prop {#1} #2
 }
\prg_new_conditional:Npnn \pdfmeta_standard_verify:n #1 {T,F,TF}
  {
     \prop_if_in:NnTF \g__pdfmeta_standard_prop {#1}
       {
         \prg_return_false:
       }
       {
         \prg_return_true:
       }
  }
\prg_new_protected_conditional:Npnn \pdfmeta_standard_verify:nn #1 #2  {T,F,TF}
  {
    \prop_if_in:NnTF \g__pdfmeta_standard_prop {#1}
      {
        \cs_if_exist:cTF {__pdfmeta_standard_verify_handler_#1:nn}
          {
            \exp_args:Nnnx
            \use:c
              {__pdfmeta_standard_verify_handler_#1:nn}
              { #2 }
              { \prop_item:Nn \g__pdfmeta_standard_prop {#1} }
          }
          {
            \prg_return_false:
          }
      }
      {
        \prg_return_true:
      }
   }
\cs_new_protected:Npn \__pdfmeta_standard_verify_handler_min_pdf_version:nn #1 #2
 {
   \pdf_version_compare:NnTF <
     { #2 }
     {\prg_return_false:}
     {\prg_return_true:}
 }

\cs_new_protected:Npn \__pdfmeta_standard_verify_handler_named_actions:nn #1 #2
 {
   \tl_if_in:nnTF { #2 }{ #1 }
     {\prg_return_true:}
     {\prg_return_false:}
 }
\cs_new_protected:Npn \__pdfmeta_standard_verify_handler_annot_action_A:nn #1 #2
 {
   \tl_if_in:nnTF { #2 }{ #1 }
     {\prg_return_true:}
     {\prg_return_false:}
 }
\cs_new_protected:Npn \__pdfmeta_standard_verify_handler_outputintent_subtype:nn #1 #2
 {
   \tl_if_eq:nnTF { #2 }{ #1 }
     {\prg_return_true:}
     {\prg_return_false:}
 }
\cs_new_protected:Npn \__pdfmeta_verify_pdfa_annot_flags:
  {
    \bitset_set_true:Nn  \l_pdfannot_F_bitset {Print}
    \bitset_set_false:Nn \l_pdfannot_F_bitset {Hidden}
    \bitset_set_false:Nn \l_pdfannot_F_bitset {Invisible}
    \bitset_set_false:Nn \l_pdfannot_F_bitset {NoView}
    \pdfannot_dict_put:nnn {link/URI}{F}{ \bitset_to_arabic:N \l_pdfannot_F_bitset }
    \pdfannot_dict_put:nnn {link/GoTo}{F}{ \bitset_to_arabic:N \l_pdfannot_F_bitset }
    \pdfannot_dict_put:nnn {link/GoToR}{F}{ \bitset_to_arabic:N \l_pdfannot_F_bitset }
    \pdfannot_dict_put:nnn {link/Launch}{F}{ \bitset_to_arabic:N \l_pdfannot_F_bitset }
    \pdfannot_dict_put:nnn {link/Named}{F}{ \bitset_to_arabic:N \l_pdfannot_F_bitset }
  }
\hook_gput_code:nnn {begindocument} {pdf}
  {
    \pdfmeta_standard_verify:nF { annot_flags }
     { \__pdfmeta_verify_pdfa_annot_flags: }
  }
\prop_new:c { g__pdfmeta_standard_pdf/A-1B_prop }
\prop_gset_from_keyval:cn { g__pdfmeta_standard_pdf/A-1B_prop }
  {
    ,name             = pdf/A-1B
    ,type             = A
    ,level            = 1
    ,conformance      = B
    ,year             = 2005
    ,min_pdf_version  = 1.4        %minimum
    ,no_encryption    =
    ,no_external_content =  % no F, FFilter, or FDecodeParms in stream dicts
    ,no_embed_content = % no EF key in filespec, no /Type/EmbeddedFiles
    ,max_string_size  = 65535
    ,max_array_size   = 8191
    ,max_dict_size    = 4095
    ,max_obj_num      = 8388607
    ,max_nest_qQ      = 28
    ,named_actions    = {NextPage, PrevPage, FirstPage, LastPage}
    ,annot_flags      =
    %booleans. Only the existence of the key matter.
    %If the entry is added it means a requirements is there
    %(in most cases "don't use ...")
    %
    %===============
    % Rule 6.1.13-1 CosDocument, isOptionalContentPresent == false
      ,Catalog_no_OCProperties =
    %===============
    % Rule 6.6.1-1: PDAction, S == "GoTo" || S == "GoToR" || S == "Thread"
    %               || S == "URI" || S == "Named" || S == "SubmitForm"
    % means: no /S/Launch, /S/Sound, /S/Movie, /S/ResetForm, /S/ImportData,
    %        /S/JavaScript, /S/Hide
      ,annot_action_A        = {GoTo,GoToR,Thread,URI,Named,SubmitForm}
    %===============
    % Rule 6.6.2-1: PDAnnot, Subtype != "Widget" || AA_size == 0
    % means: no AA dictionary
      ,annot_widget_no_AA      =
    %===============
    % Rule 6.9-2: PDAnnot, Subtype != "Widget" || (A_size == 0 && AA_size == 0)
    % (looks like a tightening of the previous rule)
      ,annot_widget_no_A_AA    =
    %===============
    % Rule 6.9-1 PDAcroForm, NeedAppearances == null || NeedAppearances == false
    ,form_no_NeedAppearances =
    %===============
    %Rule 6.9-3 PDFormField, AA_size == 0
    ,form_no_AA              =
    %===============
    % to be continued https://docs.verapdf.org/validation/pdfa-part1/
    % - Outputintent/colorprofiles requirements
    % an outputintent should be loaded and is unique.
    ,outputintent_A         = {GTS_PDFA1}
    % - no Alternates key in image dictionaries
    % - no OPI, Ref, Subtype2 with PS key in xobjects
    % - Interpolate  = false in images
    % - no TR, TR2 in ExtGstate
  }

\prop_new:c { g__pdfmeta_standard_pdf/A-2B_prop }
\prop_gset_eq:cc
  { g__pdfmeta_standard_pdf/A-2B_prop }
  { g__pdfmeta_standard_pdf/A-1B_prop }
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2B_prop }{name}{pdf/A-2B}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2B_prop }{year}{2011}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2B_prop }{level}{2}
\prop_gremove:cn
  { g__pdfmeta_standard_pdf/A-2B_prop }
  { embed_content}

\prop_new:c { g__pdfmeta_standard_pdf/A-2U_prop }
\prop_gset_eq:cc
  { g__pdfmeta_standard_pdf/A-2U_prop }
  { g__pdfmeta_standard_pdf/A-2B_prop }
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2U_prop }{name}{pdf/A-2U}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2U_prop }{conformance}{U}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2U_prop }{unicode}{}

\prop_new:c { g__pdfmeta_standard_pdf/A-2A_prop }
\prop_gset_eq:cc
  { g__pdfmeta_standard_pdf/A-2A_prop }
  { g__pdfmeta_standard_pdf/A-2B_prop }
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2A_prop }{name}{pdf/A-2A}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2A_prop }{conformance}{A}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2A_prop }{tagged}{}

\prop_new:c { g__pdfmeta_standard_pdf/A-3B_prop }
\prop_gset_eq:cc
  { g__pdfmeta_standard_pdf/A-3B_prop }
  { g__pdfmeta_standard_pdf/A-2B_prop }
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3B_prop }{name}{pdf/A-3B}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3B_prop }{year}{2012}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3B_prop }{level}{3}
\prop_gremove:cn
  { g__pdfmeta_standard_pdf/A-3B_prop }
  { embed_content}
\prop_new:c { g__pdfmeta_standard_pdf/A-3U_prop }
\prop_gset_eq:cc
  { g__pdfmeta_standard_pdf/A-3U_prop }
  { g__pdfmeta_standard_pdf/A-3B_prop }
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3U_prop }{name}{pdf/A-3U}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3U_prop }{conformance}{U}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3U_prop }{unicode}{}

\prop_new:c { g__pdfmeta_standard_pdf/A-3A_prop }
\prop_gset_eq:cc
  { g__pdfmeta_standard_pdf/A-3A_prop }
  { g__pdfmeta_standard_pdf/A-3B_prop }
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3A_prop }{name}{pdf/A-3A}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3A_prop }{conformance}{A}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3A_prop }{tagged}{}
\prop_new:N \g__pdfmeta_outputintents_prop
\keys_define:nn { document / metadata }
  {
    colorprofiles .code:n =
     {
       \keys_set:nn { document / metadata / colorprofiles }{#1}
     }
  }
\keys_define:nn { document / metadata / colorprofiles }
 {
   ,A .code:n =
      {
        \tl_if_blank:nF {#1}
          {
            \prop_gput:Nnn \g__pdfmeta_outputintents_prop
             { GTS_PDFA1  } {#1}
          }
      }
   ,a .code:n =
      {
        \tl_if_blank:nF {#1}
          {
            \prop_gput:Nnn \g__pdfmeta_outputintents_prop
              { GTS_PDFA1  } {#1}
          }
      }
   ,X .code:n =
      {
        \tl_if_blank:nF {#1}
          {
             \prop_gput:Nnn \g__pdfmeta_outputintents_prop
              { GTS_PDFX  } {#1}
          }
      }
   ,x .code:n =
      {
        \tl_if_blank:nF {#1}
          {
            \prop_gput:Nnn \g__pdfmeta_outputintents_prop
              { GTS_PDFX  } {#1}
          }
      }
   ,unknown .code:n =
     {
       \tl_if_blank:nF {#1}
          {
           \exp_args:NNo
            \prop_gput:Nnn \g__pdfmeta_outputintents_prop
              { \l_keys_key_str  } {#1}
          }
     }
 }
\pdfdict_new:n   {l_pdfmeta/outputintent}
\pdfdict_put:nnn {l_pdfmeta/outputintent}
  {Type}{/OutputIntent}
\prop_const_from_keyval:cn { c__pdfmeta_colorprofile_sRGB.icc}
  {
    ,OutputConditionIdentifier=IEC~sRGB
    ,Info=IEC~61966-2.1~Default~RGB~colour~space~-~sRGB
    ,RegistryName=http://www.iec.ch
    ,N = 3
  }
\prop_const_from_keyval:cn { c__pdfmeta_colorprofile_FOGRA39L_coated.icc}
  {
    ,OutputConditionIdentifier=FOGRA39L~Coated
    ,Info={Offset~printing,~according~to~ISO~12647-2:2004/Amd~1,~OFCOM,~ %
           paper~type~1~or~2~=~coated~art,~115~g/m2,~tone~value~increase~
           curves~A~(CMY)~and~B~(K)}
    ,RegistryName=http://www.fogra.org
    ,N = 4
  }
\cs_new_protected:Npn \__pdfmeta_embed_colorprofile:n #1%#1 file name
  {
    \pdf_object_if_exist:nF { __color_icc_ #1 }
      {
        \pdf_object_new:nn  { __color_icc_ #1 }{fstream}
        \pdf_object_write:nx { __color_icc_ #1 }
         {
           {/N\c_space_tl
             \prop_item:cn{c__pdfmeta_colorprofile_#1}{N}
           }
           {#1}
         }
      }
  }

\cs_new_protected:Npn \__pdfmeta_write_outputintent:nn #1 #2 %#1 file name, #2 subtype
  {
    \group_begin:
     \pdfdict_put:nnx {l_pdfmeta/outputintent}{S}{/\str_convert_pdfname:n{#2}}
     \pdfdict_put:nnx {l_pdfmeta/outputintent}
       {DestOutputProfile}
       {\pdf_object_ref:n{ __color_icc_ #1 }}
     \clist_map_inline:nn { OutputConditionIdentifier, Info, RegistryName }
       {
         \prop_get:cnNT
          { c__pdfmeta_colorprofile_#1}
          { ##1 }
          \l__pdfmeta_tmpa_tl
          {
            \pdf_string_from_unicode:nVN {utf8/string}\l__pdfmeta_tmpa_tl\l__pdfmeta_tmpa_str
            \pdfdict_put:nnx
              {l_pdfmeta/outputintent}{##1}{\l__pdfmeta_tmpa_str}
          }
       }
     \pdf_object_unnamed_write:nx {dict}{\pdfdict_use:n {l_pdfmeta/outputintent} }
     \pdfmanagement_add:nnx {Catalog}{OutputIntents}{\pdf_object_ref_last:}
    \group_end:
  }

\AddToHook{begindocument/end}
  {
    \pdfmeta_standard_verify:nTF {outputintent_A}
      {
         \prop_map_inline:Nn \g__pdfmeta_outputintents_prop
           {
             \__pdfmeta_embed_colorprofile:n
               {#2}
             \__pdfmeta_write_outputintent:nn
               {#2}
               {#1}
           }
      }
      {
         \exp_args:NNx
         \prop_if_in:NnF
           \g__pdfmeta_outputintents_prop
           { \pdfmeta_standard_item:n { outputintent_A } }
           {
             \exp_args:NNx
             \prop_gput:Nnn
               \g__pdfmeta_outputintents_prop
               { \pdfmeta_standard_item:n { outputintent_A } }
               { sRGB.icc }
           }
         \exp_args:NNx
         \prop_get:NnN
           \g__pdfmeta_outputintents_prop
           { \pdfmeta_standard_item:n { outputintent_A } }
           \l__pdfmeta_tmpb_tl
         \exp_args:NV \__pdfmeta_embed_colorprofile:n \l__pdfmeta_tmpb_tl
         \prop_map_inline:Nn \g__pdfmeta_outputintents_prop
           {
             \exp_args:NV
             \__pdfmeta_write_outputintent:nn
               \l__pdfmeta_tmpb_tl
               { #1 }
           }
       }
   }
%% File: l3pdftools.dtx
\cs_generate_variant:Nn \str_convert_pdfname:n { e }

\cs_new:Npn \pdf_name_from_unicode_e:n #1
  {
    \__kernel_pdf_name_from_unicode_e:n { #1 }
  }

\cs_generate_variant:Nn \pdf_name_from_unicode_e:n {V}
\bool_lazy_any:nTF
  {
    \sys_if_engine_luatex_p:
    \sys_if_engine_xetex_p:
  }
  {
    \prop_gput:Nnn \g__str_alias_prop { default } {  }
  }
  {
    \prop_gput:Nnn \g__str_alias_prop { default } { utf8 }
  }
\cs_new:Npn \pdf_string_from_unicode:nnN #1 #2 #3
  {
    \cs_if_exist_use:cF { __pdf_string_from_unicode_#1:nN }
      {
        \__kernel_msg_error:nnn { pdf } { unknown-convert } {#1}
        \use_none:nn
      }
    { #2 } #3
  }

\cs_generate_variant:Nn \pdf_string_from_unicode:nnN {nVN}
%% TODO Names need a review when it is clear which converters
%% are actually needed
%% string conversions and printing
%% we assume here that the text purify step has been done. The input is
%% a list of (utf8) chars.
%% str convert, not expandable.


\cs_new_protected:cpn { __pdf_string_from_unicode_utf8/string-raw:nN }  #1 #2
  {
     \str_set_convert:Nnnn #2
        { #1 }
        { default }
        {utf8/string}
  }

\cs_new_protected:cpn { __pdf_string_from_unicode_utf8/string:nN } #1 #2
  {
    \use:c { __pdf_string_from_unicode_utf8/string-raw:nN } { #1 } #2
    \str_put_left:Nn #2  {(}
    \str_put_right:Nn #2 {)}
  }
\cs_new_protected:cpx { __pdf_string_from_unicode_utf8/URI-raw:nN }  #1 #2
  {
     \exp_not:N \str_set_convert:Nnnn #2
       { #1 }
       { default }
       {utf8/url}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 3A} {:}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 2F} {/}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 23} {\c_hash_str}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 5B} {[}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 5D} {]}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 40} {\c_atsign_str}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 21} {!}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 24} {\c_dollar_str}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 26} {\c_ampersand_str}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 27} {'}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 2A} {*}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 2B} {+}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 2C} {,}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 3B} {;}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 3D} {=}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 3F} {?}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 30} {0}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 31} {1}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 32} {2}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 33} {3}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 34} {4}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 35} {5}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 36} {6}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 37} {7}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 38} {8}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 39} {9}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 28} {\c_backslash_str(}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 29} {\c_backslash_str)}
  }

\cs_new_protected:cpn { __pdf_string_from_unicode_utf8/URI:nN } #1 #2
  {
     \use:c { __pdf_string_from_unicode_utf8/URI-raw:nN } {#1} #2
     \str_put_left:Nn #2  {(}
     \str_put_right:Nn #2 {)}
  }
\cs_new_protected:cpn { __pdf_string_from_unicode_utf16/string-raw:nN }  #1 #2
  {
    \str_set_convert:Nnnn #2
      { #1 }
      { default }
      {utf16/string}
  }

\cs_new_protected:cpn { __pdf_string_from_unicode_utf16/string:nN } #1 #2
  {
    \use:c { __pdf_string_from_unicode_utf16/string-raw:nN } {#1} #2
    \str_put_left:Nn #2  {(}
    \str_put_right:Nn #2 {)}
  }

\cs_new_protected:cpn { __pdf_string_from_unicode_utf16/hex-raw:nN } #1 #2
  {
     \str_set_convert:Nnnn #2
       { #1 }
       { default }
       {utf16/hex}
  }

\cs_new_protected:cpn { __pdf_string_from_unicode_utf16/hex:nN } #1 #2
  {
    \use:c { __pdf_string_from_unicode_utf16/hex-raw:nN } {#1} #2
    \str_put_left:Nn #2  {<}
    \str_put_right:Nn #2 {>}
  }

\cs_new_protected:Npn  \pdf_bdc:nn #1 #2 { \__pdf_backend_bdc:nn { #1 }{ #2 } }
\cs_new_protected:Npn  \pdf_bdcobject:nn #1 #2 { \__pdf_backend_bdcobject:nn { #1 }{ #2 } }
\cs_new_protected:Npn  \pdf_bdcobject:n #1     { \__pdf_backend_bdcobject:n  { #1 } }
\cs_new_protected:Npn  \pdf_bmc:n #1     { \__pdf_backend_bmc:n  { #1 } }
\cs_new_protected:Npn  \pdf_emc:         { \__pdf_backend_emc: }
%% File: l3pdffile.dtx

\cs_new_protected:Npn \__pdffile_filename_convert_to_print:nN #1 #2
  {\pdf_string_from_unicode:nnN {utf16/hex}{#1}{#2}}
\msg_new:nnn { pdffile } { file-not-found }
  {
    File~'\tl_to_str:n{#1}'~not~found
  }

\msg_new:nnn { pdffile } { mimetype-missing }
  {
    Mime~type~not~set~for~file~'\tl_to_str:n{#1}'
  }

\msg_new:nnn { pdffile } { target-name-missing }
  {
    a~target~name~for~the~/Filespec~dictionary~is~missing.
  }

\msg_new:nnn { pdffile } { object-exists }
  {
    object~name~'#1'~is~already~used.
  }

\msg_new:nnn  { pdffile } { show-files }
  {
    The~following~files~have~been~embedded\\
     #1
  }
\tl_new:N  \l__pdffile_tmpa_tl
\tl_new:N  \l__pdffile_tmpb_tl
\str_new:N \l__pdffile_tmpa_str
\str_new:N \l__pdffile_tmpb_str
\str_new:N \l__pdffile_ext_str
\tl_new:N  \l__pdffile_automimetype_tl
\tl_new:N  \l__pdffile_embed_ref_tl
\prop_new:N \g_pdffile_mimetypes_prop
\prop_gset_from_keyval:Nn \g_pdffile_mimetypes_prop
  {
    ,.css = text/css
    ,.csv = text/csv
    ,.html= text/html
    ,.dtx = text/plain %or application/x-tex, not in iana.org list
    ,.eps = application/postscript
    ,.jpg = image/jpeg
    ,.mp4 = video/mp4
    ,.pdf = application/pdf
    ,.png = image/png
    ,.tex = text/plain %or application/x-tex, not in iana.org list
    ,.txt = text/plain
    ,.sty = text/plain
    ,.xml = text/xml
  }
\str_new:N  \l_pdffile_source_name_str
\pdfdict_new:n { l_pdffile }
\pdfdict_put:nnn { l_pdffile }{Type}{/EmbeddedFile}
\pdfdict_new:n { l_pdffile/Params }
\pdfdict_put:nnn { l_pdffile/Params }
  {ModDate}  { (\file_timestamp:n { \l_pdffile_source_name_str }) }
\pdfdict_put:nnn { l_pdffile/Params }
  {Size}     { \file_size:n { \l_pdffile_source_name_str } }
\pdfdict_put:nnn { l_pdffile/Params }
  {CheckSum} { (\file_mdfive_hash:n { \l_pdffile_source_name_str }) }
\pdfdict_new:n { l_pdffile/streamParams }
\pdfdict_put:nnn { l_pdffile/streamParams }
  {ModDate}  {
               (
                 D:\int_use:N\c_sys_year_int
                  \int_compare:nNnT{\c_sys_month_int}<{10}{0}
                  \int_use:N\c_sys_month_int
                  \int_compare:nNnT{\c_sys_day_int}<{10}{0}
                  \int_use:N\c_sys_day_int
               )
             }
\pdfdict_new:n { l_pdffile/Filespec }
\pdfdict_put:nnn { l_pdffile/Filespec }
  {Type} { /Filespec }
\pdfdict_put:nnn { l_pdffile/Filespec }
  {AFRelationship} { /Unspecified }

\prop_new:N \g_pdffile_embed_prop
\cs_new_protected:Npn \pdffile_embed_show:
  {
    \msg_show:nnx
     {pdffile}{show-files}
     {
       \prop_map_function:NN {\g_pdffile_embed_prop} \msg_show_item:nn
     }
  }
\cs_new_protected:Npn \__pdffile_mimetype_set:nN #1 #2
  {
    \file_parse_full_name:nNNN
          {#1}
          \l__pdffile_tmpa_str %unused
          \l__pdffile_tmpb_str %unused
          \l__pdffile_ext_str
        %check if Subtype has been set
        \pdfdict_get:nnN { l_pdffile}{Subtype}\l__pdffile_tmpa_tl
        %if not look up in the prop:
        \quark_if_no_value:NT \l__pdffile_tmpa_tl
          {
            \prop_get:NVNTF
              \g_pdffile_mimetypes_prop
              \l__pdffile_ext_str
              \l__pdffile_tmpb_tl
              {
                \tl_set:Nx #2 {/Subtype~\pdf_name_from_unicode_e:V \l__pdffile_tmpb_tl}
              }
              {
                \msg_warning:nnx { pdffile }{ mimetype-missing} {#1}
                \tl_clear:N #2
              }
          }
    }

\cs_generate_variant:Nn \__pdffile_mimetype_set:nN {VN}

\cs_new_protected:Npn \__pdffile_fstream_write:nN #1 #2
  {
    \pdf_object_unnamed_write:nx { fstream }
      {
        {
          #2
          \pdfdict_use:n { l_pdffile}
          \pdfdict_if_empty:nF { l_pdffile/Params}
            {
              /Params
                <<
                  \pdfdict_use:n { l_pdffile/Params}
                >>
            }
        }
        { #1 }
      }
     \tl_clear:N \l__pdffile_automimetype_tl
   }

\cs_generate_variant:Nn \__pdffile_fstream_write:nN {VN}

\cs_new_protected:Npn \__pdffile_stream_write:nN #1 #2
  {
    \pdf_object_unnamed_write:nx { stream }
      {
        {
          #2
          \pdfdict_use:n { l_pdffile}
          \pdfdict_if_empty:nF { l_pdffile/streamParams}
            {
              /Params
                <<
                  \pdfdict_use:n { l_pdffile/streamParams}
                >>
            }
        }
        { \exp_not:n { #1 } }
      }
     \tl_clear:N \l__pdffile_automimetype_tl
   }

\cs_generate_variant:Nn \__pdffile_stream_write:nN {VN}

\cs_new_protected:Npn \__pdffile_filespec_write:nnn #1 #2 #3
  {
    \tl_if_blank:nT { #2 }
      {
        \msg_error:nn {pdffile}{target-name-missing}
      }
      {
        \group_begin:
          \__pdffile_filename_convert_to_print:nN  { #2 } \l__pdffile_tmpa_str
          \pdfdict_put:nnx {l_pdffile/Filespec}{F} { \l__pdffile_tmpa_str }
          \pdfdict_put:nnx {l_pdffile/Filespec}{UF}{ \l__pdffile_tmpa_str }
          \pdf_object_write:nx { #1 }
            {
              \pdfdict_use:n { l_pdffile/Filespec}
              \tl_if_empty:nF { #3 }
                {
                  /EF <</F~#3 /UF~#3>>
                }
            }
        \group_end:
      }
  }

\cs_set_eq:NN \pdffile_filespec:nnn \__pdffile_filespec_write:nnn
\cs_generate_variant:Nn \pdffile_filespec:nnn {nnx}
\cs_new_protected:Npn \pdffile_embed_file:nnn #1 #2 #3
  { %               if #1 empty => only filespec
    %               if #2 empty => = #1
    \pdf_object_if_exist:nTF { #3 }
      {
        \msg_error:nnn { pdffile }{ object-exists } { #3 }
      }
      {
        \tl_if_blank:nTF { #1 }
          {
            \tl_set:Nn \l__pdffile_embed_ref_tl {}
          }
          {
            \file_get_full_name:nNTF {#1} \l_pdffile_source_name_str
              {
                \__pdffile_mimetype_set:VN
                  \l_pdffile_source_name_str
                  \l__pdffile_automimetype_tl
                \__pdffile_fstream_write:VN
                  \l_pdffile_source_name_str
                  \l__pdffile_automimetype_tl
                \tl_set:Nx \l__pdffile_embed_ref_tl { \pdf_object_ref_last: }
              }
              {
                \msg_error:nnn { pdffile }{ file-not-found }{ #1 }
              }

           }
        \prop_gput:Nnx
           \g_pdffile_embed_prop
           { #3 }
           {
             { \tl_if_blank:nTF { #1 } {filespec}{file} }
             {\l_pdffile_source_name_str}
             {
               \tl_if_blank:nTF { #2 }
                 { \l_pdffile_source_name_str }
                 { \tl_to_str:n{#2}}
             }
           }
        \tl_if_blank:nTF { #2 }
          {
            \pdf_object_new:nn   { #3 } {dict}
            \exp_args:Nnnx
              \__pdffile_filespec_write:nnn
                %#1 dict, #2 target file name, #3 object ref
                { #3 }
                { #1 }
                {\l__pdffile_embed_ref_tl}
          }
          {
            \pdf_object_new:nn   { #3 } {dict}
            \exp_args:Nnnx
              \__pdffile_filespec_write:nnn
                %#1 dict, #2 target file name, #3 object ref
                { #3 }
                { #2 }
                {\l__pdffile_embed_ref_tl}
          }
      }
  }

\cs_new_protected:Npn \pdffile_embed_stream:nnn #1 #2 #3
  {
    %               if #2 empty => error
    \pdf_object_if_exist:nTF { #3 }
      {
         \msg_error:nnn { pdffile }{ object-exists } { #3 }
      }
      {
         \prop_gput:Nnx
            \g_pdffile_embed_prop
            { #3 }
            {{stream}{}{\tl_if_blank:nTF {#2}{stream.txt}{\exp_not:n{#2}}}}
         \tl_if_blank:nTF {#2}
          { \__pdffile_mimetype_set:nN {stream.txt}\l__pdffile_automimetype_tl}
          { \__pdffile_mimetype_set:nN { #2 } \l__pdffile_automimetype_tl }
         \__pdffile_stream_write:nN
           { #1 }
           \l__pdffile_automimetype_tl
         \tl_set:Nx \l__pdffile_embed_ref_tl { \pdf_object_ref_last: }
         \pdf_object_new:nn   { #3 } {dict}
         \exp_args:Nnxx
           \__pdffile_filespec_write:nnn
             %#1 dict, #2 target file name, #3 object ref
             { #3 }
             { \tl_if_blank:nTF {#2}{stream.txt}{\exp_not:n{#2}} }
             {\l__pdffile_embed_ref_tl}
     }
  }

%% 
%%
%% End of file `pdfmanagement-testphase.ltx'.
