anchor.diff:                  if n.NodeType = Dom.NodeType.Element then
                       let n = n :?> Dom.Element
                       if not (usedHoles.Add(n.NodeName.ToLower())) then
  -                        Console.Warn("Hole filled twice", name)
  +                        Console.Warn("Hole filled twice", instName)
               // 2. If single text hole, apply it.
               let singleTextFill = el.ChildNodes.Length = 1 && el.FirstChild.NodeType = Dom.NodeType.Text
               if singleTextFill then
  -                fillTextHole instance el.FirstChild.TextContent
  +                Prepare.fillTextHole instance el.FirstChild.TextContent instName
                   |> Option.iter (usedHoles.Add >> ignore)
               // 3. eliminate non-mapped/filled holes.
  -            removeHolesExcept instance usedHoles
  +            Prepare.removeHolesExcept instance usedHoles
               // 4. apply mappings/fillings.
               if not singleTextFill then
                   for i = 0 to el.ChildNodes.Length - 1 do
  
positive.code:                 p.ReplaceChild(n, el) |> ignore
          FakeRoot [| el |]
  
      let rec PrepareTemplateStrict (baseName: string) (name: option<string>) (els: Node[]) (root: option<Element>) (prepareLocalTemplate: option<string -> unit>) =
          let convertAttrs (el: Dom.Element) =
              let attrs = el.Attributes
              let toRemove = [||]
  
negative.code:                             ))
                      e.SetAttribute(attrName, s)
  
          let fillTextHole (instance: Dom.Element) (fillWith: string) (templateName: string) =
              match instance.QuerySelector "[ws-replace]" with
              | null ->
                  Console.Warn("Filling non-existent text hole", templateName)
                  None
              | n ->
                  n.ParentNode.ReplaceChild(Dom.Text fillWith, n) |> ignore
  